• WINDOWS session管理初识2


    前置知识:同一个Session的进程的eprocess->session指向的值都是一样

    在1中,我们知道smss.exe创建新的session,然后启动新的csrss.exe和winlogon.exe。

    它的管理是这样的

    //先看一个宏定义

    #define SESSION_GLOBAL(_Session) (_Session->GlobalVirtualAddress)

    SessionGlobal = SESSION_GLOBAL (MmSessionSpace);

    在smss.exe创建新的session时,由内核函数MiSessionCreateInternal()实现的:

    NTSTATUS
    MiSessionCreateInternal (
    OUT PULONG SessionId
    )

    PMM_SESSION_SPACE SessionGlobal;定义变量

    中间代码会申请一个新的PMM_SESSION_SPACE内存块赋值给SessionGlobal

    SessionId也会在这里申请

    SessionSpace = MmSessionSpace;

    MM_BUMP_SESS_COUNTER (MM_DBG_SESSION_INITIAL_PAGETABLE_ALLOC, 1);
    MM_BUMP_SESS_COUNTER (MM_DBG_SESSION_INITIAL_PAGE_ALLOC, 1);

    SessionSpace->GlobalVirtualAddress = SessionGlobal;注意这里,新申请的session在这里
    SessionSpace->ReferenceCount = 1;
    SessionSpace->ResidentProcessCount = 1;
    SessionSpace->u.LongFlags = 0;
    SessionSpace->SessionId = *SessionId;
    SessionSpace->LocaleId = PsDefaultSystemLocaleId;
    SessionSpace->SessionPageDirectoryIndex = PageTablePage;

    SessionSpace->Color = PageColor;

    此时MmSessionSpace这个全局变量的GlobalVirtualAddress字段保存者新申请的Session

    smss.exe创建完session后,才会去启动新的子系统进程。

    在创建进程的过程中,会调用一个如下的函数设置EProcess->session字段

    VOID
    MiSessionAddProcess (
    PEPROCESS NewProcess
    )

    {

    SessionGlobal = SESSION_GLOBAL (MmSessionSpace);

    //此时SessionGlobal就是前面创建的新session了

    ASSERT (NewProcess->Session == NULL);
    NewProcess->Session = (PVOID) SessionGlobal;//这里设置

    //
    // Link the process entry into the session space and WSL structures.
    //

    LOCK_EXPANSION (OldIrql);

    InsertTailList (&SessionGlobal->ProcessList, &NewProcess->SessionProcessLinks);//所以这个链表可以遍历进程,但是不同的session有独立的链表
    UNLOCK_EXPANSION (OldIrql);

    PS_SET_BITS (&NewProcess->Flags, PS_PROCESS_FLAGS_IN_SESSION);//标志

    }

    ***************问题:

    按如上的情况发生的话,就产生一个问题,在第二次产生新session后,

    MmSessionSpace->GlobalVirtualAddress这里保存的是最后一次的new session..

    那以前的session里面启动一个进程的话,它是怎么做到此时的子进程session又回到以前的session呢??

    明天分解

  • 相关阅读:
    Fluentd部署:如何监控Fluentd
    【615】国内国外经纬度坐标转换
    【614】矢量数据转栅格数据(cv2.fillPoly/cv2.polylines)
    【613】U-Net 相关
    【612】深度学习模型相关问题
    【611】keras 后端 backend 相关函数(Dice实现)
    面试官:new 关键字在 JVM 中是如何执行的?
    IntelliJ IDEA 2021.2 发布,这次要干掉 FindBugs 了!!
    Nginx 实现 10w+ 并发之 Linux 内核优化
    我们真的需要全栈开发吗?
  • 原文地址:https://www.cnblogs.com/kkindof/p/2571782.html
Copyright © 2020-2023  润新知