PS:下面测试环境均为win 2003
正常启动后,smss.exe这个session管理组件会创建2个进程,csrss.exe(子系统)和winlogon.exe,这2个进程属于session 0
但smss.exe却不属于任何一个session,这是怎么回事呢?一般我们启动程序后,会看见子进程和父进程属于同一个session
跟踪后,发现原来smss.exe在启动上述2个进程之前(这个过程是发生在smss!smpLoaddataFromRegistry()函数中),为了说明方便,下面用伪代码演示
smss!smpLoaddataFromRegistry()
{
}
loadsubsystem()
{
1.会调用NtSetSystemInformation创建session ,sessionID=g_SessionID++;(其实不是简单的++,好像还是用一个位置来计算)
2.此时smss.exe属于sessionID ,接启动csrss.exe和winlogon,这样这2个进程就属于sessionID了
3.smss.exe调用NtSetSystemInformation的DetachSession功能号,脱离Session,所以我们一般看到smss.exe不属于任何session,
windbg的显示就是根据Eprocess结构的Session字段是否有指向Session来判断进程是否属于哪个session的
}
上面的loadsubsystem()并不只是只会在smss.exe启动的时候才调用一次。在用户远程桌面登陆的时候也会再次调用,所以远程桌面的用户是属于另一个session
PS:由于smss.exe不属于任何一个session,所以在它的进程上下文时有时候访问不了win32k.sys的数据,因为有可能被page out了,我猜正是而由于smss.exe不属于任意session的原因
并且trap0e缺页中断里面会判断session。这个猜想后面有空再证实。