WINDOWS session管理初识1

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。这个猜想后面有空再证实。

posted @ 2012-07-01 00:58  kkindof  阅读(1906)  评论(0编辑  收藏  举报