WindowStations窗口站?一聽到這個名詞,很多網民覺得一頭霧水,什麼是WindowStations窗口站呢?這是很專業的名詞嗎?我們不需要了解吧,這是很多網友的第一印象,小編告訴你,非也非也.其實, Window stations 和桌面可能是Windows NT服務中最與眾不同的了。絕大多數編程者都不會直接接觸這兩種對象,盡管用戶每時每刻都要碰到它們。window station 和桌面對象就象其它Windows NT對象,如事件、互斥量和信號量一樣,是安全(securable)的。一個window station 對象包括一個剪貼板、一個全局原子集和更多的桌面對象。一個window station或者是可見的或者是不可見的。一個可見的window station接收用戶來自於鼠標或鍵盤的輸入。一個顯示設備也與之相連這樣信息可以顯示給交互式用戶。
在 Windows NT 4.0中,只有一個window station 能被看得到,就是WinSta0。可見的window station也被定義成交互式的。一個不可見的window station是不可交互的,而且也不能接收任何用戶的輸入也沒有顯示設備與之相連。
如前所述,桌面包含在window station對象中。一個桌面對象包含一個邏輯的顯示表面,和窗口、菜單等。只有屬於可見window station的桌面才能被看見並接收用戶的輸入。這個桌面叫做活動桌面。
作為交互式用戶你在不同的時候碰到三種不同的桌面:缺省(Default)、 Winlogon和Screen-saver。Winlogon 桌面是當你按下Ctrl+Alt+Delete組合鍵時顯示在你面前的對話框。缺省(Default)桌面是浏覽器(Explorer)或者是由交互式用戶啟動的所有進程。它更應當被理解成交互式的應用程序桌面。最終的桌面是Screen-saver,它顯示你的屏幕saver。你可能已經注意到可以在不同的桌面之間切換。當一個用戶按下Ctrl+Alt+Delete組合鍵時,操作系統可以從缺省狀態切換到Winlogon桌面。當你在登錄對話框中選擇取消,系統將再切換回缺省桌面。有人問我當切換進行的時候,是否其它桌面上的東西都被破壞掉了,答案是 "不"。雖然你看不到其它桌面,但它們仍然在那裡。
系統中所有的進程都與window station 和桌面相聯系。當一個用戶第一次登錄時,交互式window station, WinSta0,和缺省桌面都與這個用戶的Shell進程相關聯。這樣用戶就能看到shell了,如果不是這樣,用戶是什麼也看不到的。而且在這之後,由shell啟動的所有進程也會和WinSta0 及缺省桌面相關聯。
你還可以通過STARTUPINFO 數據結構的lpDesktop 成員指定你的進程同哪個window station 和桌面相關聯。這個數據結構傳遞給CreateProcess 和 CreateProcessAsUser兩個函數。你可以將lpDesktop 初始化為NULL,意思是讓CreateProcess函數使用和調用進程相同的window station 和桌面。你可以將你自己的window station 和桌面組合定義成"WinSta0\Default" 或者就定義成空字符串。這個參數會讓操作系統為啟動進程創建一個新的不可見的window station 及桌面。與這兩個新對象關聯的安全性授予每個組對它們的完全訪問權限。
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Window stations和桌面是具有安全性的對象。與window station 和桌面將關聯的進程必須由對這些對象的合適的訪問權限。如果進程沒有訪問權,你會看到這兩個消息之一"User32.dll initialization failure(User32.dll初始化失敗)" 或 "Kernel32.dll initialization failure.(Kernel32.dll初始化失敗)"。由進程返回的退出碼為128 或 ERROR_NO_WAIT_CHILDREN。那麼我所指的合適的訪問權是什麼意思呢?假如你有一個文件這樣的對象。你可以為這個文件創建一個DACL以使用戶具有對這個文件的讀訪問權。Window station 和 桌面是以相同的方式工作的。 上一頁12下一頁共2頁