转载请注明出处http://www.cppblog.com/dawnbreak/
Sessions, Desktops and Windows Stations
session是由代表单个用户登录会话的所有进程和系统对象组成的。其中的对象包括所有的窗口,桌面和windows stations。桌面是特定session页的内存池并且被加载到内核存储区。这个区域正是session私有的GUI对象的存储区域。windows station基本上可以被描述为包含桌面和进程的安全边界。因此,一个session可以包含多个windows station,而每个windows station又可拥有多个桌面
只有被称为 winsta0 的windows station才被允许与用户交互。在winsta0下共被载入三个桌面:winlogon(登陆界面),缺省桌面(用户桌面),和Disconnect( ? )。它们三个都有各自的显存,这就是为什么当你锁定工作站时你的主桌面会消失。当你锁定工作站时,屏幕由用户桌面切换到登录界面,并且两者之间并没有交互。在windows vista这一点更是体现的淋漓尽致。例如当你看到UAC弹出时,系统会将用户桌面的快照降低灰度,而在前端显示UAC窗口,UAC窗口是安全桌面(vista系统的新特性类似登录桌面)并且在你给予权限之前禁止你与用户桌面的交互。
其他windows station存在但并不与用户交互。例如:加载到‘service-0x0-3e7$’无用户交互windows station中的服务。另外也有些需要与用户交互的服务被加载到winsta0。
内存页是被所有用户所共享的,但是每个用户会将其各自的session空间映射到虚拟内存。session空间被划分到四个不同的区域:
- session 结构存储区-内存控制器结构,其中包含session工作集
- session映像存储区-保留一块私有的win32k.sys修改过的数据,一个sin32k,sys代码副本和原始数据副本,还有各种驱动
- session视图存储区-包括桌面堆在内的session映射视图
- session分页存储区-用于这个session被分页了的内存池
正如前文所提到的,一个桌面正是被加载了显示信息的内核对象。其中包括窗口,菜单,还有钩子。session0是一个基础session,服务在其中运行,并且一般情况下也是控制台session。在windows Vista中session0仅仅用来运行服务,而控制台session一般在session1。下图显示了各自的关系,并且对比了vista和早期操作的区别。(来自 our earlier post on Session 0 Application Compatibility Issues)
Session 0 in Windows XP / Windows Server 2003 |
Session 0 / Session 1 in Windows Vista |
未完,待续。。。。。