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呢??

 

明天分解

posted @ 2012-07-01 12:09  kkindof  阅读(1350)  评论(0编辑  收藏  举报