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呢??
明天分解