由于不是搞安全的,對這塊的東西一直不是很清楚,今天特意整理下。
總的來說,他們的關系如下:

我們知道Windows是支持多用戶的,Session可以理解為每個用戶登錄,比如當前登錄和遠程登陸。
Window Stations可以理解為登陸后的不同用戶組,我們在任務管理器中可以看到不同的用戶名(比如 Richard, system, local service等),其中只有一個活動Station WinSta0, 只有這個Station是接受用戶鼠標鍵盤輸入的。而WinSta0 Station 又包括3個Desktop(包括Winlogon, Disconnect, Default), 其中Winlogon指的是登陸Desktop,當我們按Ctrl+Alt+Del時就會進入該Desktop;Disconnect指的是屏保Desktop; Default指的就是我們平時有任務欄的Desktop, 當然真正的Default Desktop是沒有應用程序的在上面的,我們看到的桌面其實是啟動Shell Explorer后的界面。
總結幾點和我們平時寫程序有關的:
(1)我們平時通過GetDesktopWindow()得到的桌面句柄, 是Csrss.exe創建的一個窗口,它被放在WinStation內的Desktop內.
而我們通過Win+D看到的桌面, 其實是Expolore.exe創建的一個Pop up窗口, 它和我們普通的pop up 窗口一樣, Owner是GetDesktopWindow()
(2)我們可以通過CreateDesktop, OpenDesktop, SwitchDesktop等API創建和切換Desktop。
(3)我們平時寫服務程序時發現窗口彈不出來, 因為服務不是運行在Station WinSta0下面. 通過FindWindow也找不到我們要找的窗口,因為它下面沒有我們的當前WinStation
的Desktop。
(4)一個window station 對象包括一個剪貼板、一個全局原子集和多個Desktop對象, 所以你可以在同一個一個window station內的多個Desktop之間通過剪貼板傳送數據.
(5)所有的進程都和Session, WinStation, Desktop相關聯,所以我們可以把它表示成這樣一個路徑: Session 1\WinSta0\Default, 這樣我們也就理解為什么有些API需要我們傳類似這樣的信息.
參考資料:
posted on 2012-05-12 23:37
Richard Wei 閱讀(4475)
評論(0) 編輯 收藏 引用 所屬分類:
windows desktop