轉載請注明出處http://www.shnenglu.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 |
未完,待續。。。。。