zoukankan      html  css  js  c++  java
  • 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呢??

    明天分解

  • 相关阅读:
    eclipse- DDMS截图功能使用
    宏-新项目物理按键不能用
    宏-宏的添加跟代码中的使用
    SQlite-数据库的访问实例(转)
    git 工具的使用总结(6)-提交合并处理
    git 工具的使用总结(5)-查看历史记录
    git -处理分支合并
    Linux查询网址
    SQLite常用网址
    Java查询网址
  • 原文地址:https://www.cnblogs.com/kkindof/p/2571782.html
Copyright © 2011-2022 走看看