window station , desktop 等概念學習

來源:互聯網
上載者:User

其實可以通過在MSDN查詢HDESK來找到destop和window station等概念。

翻譯MSDN的內容,大體的寫了一些,可能有不正確的地方.

視窗站(window station):
包含剪貼簿(clipboard),一個原子表,一個或多個案頭(desktop)對象.視窗站是一個保護對象,當一個視窗站被建立,它被分配到當前進程和當前會話(session).
互動式視窗站Winsta0是唯一的可以顯示使用者介面和接受使用者輸入的視窗站,它被分配到目前使用者的登入工作階段,並且包含鍵盤,滑鼠和顯示器,其他視窗站都不能顯示使用者介面和接受使用者輸入.
當一個使用者登入到一個終端服務(Terminal Service)電腦,一個會話被啟動,每個會話被分配到自己的互動式視窗站.

案頭對象(desktop):
案頭對象有一個邏輯介面並包含使用者介面對象(例如:視窗,菜單,鉤子),它可以被用來建立和管理視窗,每個案頭對象是保護對象,當案頭對象被建立,它被分配給當前的線程所在的視窗站.
訊息只能在同一個案頭上的進程間發送,所以鉤子過程也只能在一個指定的案頭上接受訊息.
每個被分配到Winsta0視窗站的案頭對象可以顯示使用者介面和接受使用者輸入,但是同一時間只有一個案頭對象是活動的,可以使用OpenInputDesktop和SwitchDesktop去取得和切換不同的案頭.
在預設情況下,有3個案頭對象在Winsta0視窗站:預設案頭(default),螢幕保護裝置和登入視窗(Winlogon),螢幕保護裝置和登入視窗是保護案頭.非保護的螢幕保護裝置運行在Winsta0\default.
登入視窗(Winlogon)在使用者登入的過程被啟用,當外殼(shell)指示它將已經可以顯示什麼的時候,系統切換到預設案頭.在使用者會話過程中當使用者按下CTRL+ALT+DEL或在UAC對話方塊被開啟的情況下將切換到登入案頭.
應用程式不能訪問登入案頭,同時應用程式也不能在登入案頭被啟用的情況下切換案頭.

系統自動建立互動式視窗站,當一個使用者登入時可以系統將互動式視窗站綁定到一個會話上.同時建立一個預設案頭,可以用CreateWindowStation函數去建立一個新的視窗站,CreateDesktop和CreateDesktopEx建立案頭.
當一個非介面進程(例如服務進程)試圖串連到一個視窗站,若沒有視窗站存在在該進程所在的會話上,那麼系統將在該會話上建立一個視窗站和案頭,新建立的視窗站名字是基於登入工作階段標識符,案頭對象名稱描述如下:
如果一個服務運行在LocalSystem並且沒有包含SERVICE_INTERACTIVE_PROCESS屬性,那麼它使用下面的視窗站和案頭:Service-0x0-3e7$\default.這個視窗站是非互動的,所以這個服務不能顯示使用者介面,它建立的進程也不能顯示使用者介面.
如果服務運行在使用者安全上下文,則視窗站的命名是在基於使用者SID,0xZ1-Z2$,其中Z1是登入SID的高地址部分,Z2是登入SID低地址部分,兩個服務運行在同一個安全上下文中.

一個進程在它第一次調用USER32或GDI32函數的時候會自動的串連到視窗站和案頭,系統使用以下規律來決定一個進程究竟串連到什麼視窗站或案頭:
1.如果進程調用SetProcessWindowStation函數,該進程將串連到指定的視窗站上.
2.如果進程沒有調用SetProcessWindowStation,它將串連到父進程的視窗站上.
3.如果進程沒有調用SetProcessWindowStation,也沒有繼承父進程的視窗站,則系統開啟MAXIMUM_ALLOWED訪問標識符並使用下列規則串連到視窗站:
如果視窗站名稱在建立進程的時候被寫到STARTUPINFO.lpDesktop,則進程被串連到指定的視窗站.
否則,如果進程運行在互動使用者的登入工作階段,進程將串連到啟用的視窗站中.
如果進程運行在非互動的登入工作階段中,視窗站名稱是基於登入工作階段標識符的,並嘗試串連到該視窗站和案頭.若不存在,則建立視窗站和預設的案頭.

將進程串連到一個視窗站:
分配給某個進程的視窗站不能通過CloseWindowStation被關閉.
當進程串連到一個視窗站,系統在進程的控制代碼表尋找進程繼承的控制代碼,系統使用第一個找到的視窗站控制代碼.如果希望一個子進程串連到繼承的視窗站上,你必須保證只有希望的控制代碼被標識上.如果有多個繼承的視窗站控制代碼,則最後串連上的視窗站是不確定的.
系統已經在視窗站中開啟的控制代碼在串連一個進程到一個視窗站中的時候是不能被繼承的.

將線程串連到一個案頭:
在一個進程串連到一個視窗站後,系統分配一個案頭給線程,系統根據以下規則決定該案頭被分配哪個線程:
1.如果線程調用SetThreadDesktop,該線程被串連到指定的案頭上.
2.如果線程沒有調用SetThreadDesktop,它串連到通過父進程繼承的案頭上.
3.如果線程沒有調用SetThreadDesktop,也沒有繼承案頭,則系統嘗試使用MAXIMUM_ALLOWED許可權,並根據以下規則開啟案頭:
如果案頭的名稱被指定在STARTUPINFO.lpDesktop,則線程串連到指定的案頭上.
否則線程串連到所在進程串連的視窗站中的預設案頭上.

被分配的案頭在串連期間不能通過CloseDesktop關閉.
當進程串連一個案頭的時候,系統在進程的控制代碼表中查詢繼承的控制代碼.系統使用第一個查到的案頭控制代碼,如果你希望子進串連到一個指定的案頭上,你必須確定只有希望的控制代碼被標識為可繼承的,如果一個子進程繼承了多個案頭控制代碼,則最終串連到的左面是不確定的.

系統開啟的案頭控制代碼在進程串連到案頭是不可繼承的.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.