Windows對象管理

Windows對象管理是WindowsExecutive的一個子系統實現,用於管理Windows資源。資源包括物理設備、檔案、檔案目錄、註冊表條目、正在運行的進程等等。所有子系統訪問資源都必須通過對象管理子系統。

簡介

對象管理是Windows Executive的一個子系統實現,用於管理Windows資源。 資源包括物理設備、檔案、檔案目錄、註冊表條目、正在運行的進程等等。所有子系統訪問資源都必須通過對象管理子系統。

體系結構

Windows NT作業系統體系結構中,對象管理子系統管理所有的資源。資源被表示為對象。對象管理子系統保持著對每個對象的引用計數。任何訪問對象的系統調用都必須通過對象管理子系統。Windows對象可分為核心對象、用戶對象、GDI對象:

•用戶對象(User interface object):支持視窗管理。每個對象僅有一個句柄,句柄不能複製或繼承,不能引用其他用戶會話中的進程的用戶句柄。任何進程只要有對某個用戶句柄的安全訪問許可權,即可以訪問該用戶對象,即用戶對象在當前會話下是全局的。一個進程最多有 65536 個用戶對象句柄。用戶對象包括:快捷鍵表HACCEL、插入點HCaret、滑鼠指針HCURSOR、DDE 會話、視窗鉤子HOOK、圖示 HICON、選單 HMENU、視窗 HWND、視窗位置Window position。

•GDI 對象:支持圖形。每個對象僅有一個句柄,句柄為進程私有。一個進程最多有 65536 個 GDI 對象句柄。GDI 對象包括:點陣圖 HBITMAP、畫刷 HBRUSH、設備環境HDC、增強型圖元檔案(EMF)、EMF 設備環境、字型 HFONT、記憶體 DC、圖元檔案Metafile、圖元檔案 DC、調色板 HPALETTE、畫筆 HPEN、區域(Region)HRGN。

•核心對象:支持記憶體管理、進程執行、進程間通信。核心對象句柄是進程私有的,必須創建或者打開核心對象以獲取其句柄。當進程創建或打開核心對象時,進程的句柄表中增加一個條目指向核心對象實例。進程的句柄表的索引稱為句柄(handle)。對象管理子系統使用句柄與命名兩種方式管理對象實例。句柄在一個進程內部是執行緒共享的,但在進程之間不是直接可復用,需要特別方式在進程間傳遞對象句柄。一個進程任何時刻最多擁有 2,即大約 16,000,000 個句柄。句柄按照對象的分類可分為檔案句柄、事件句柄、進程句柄等。一個進程對一個對象可以有多個句柄,以便按照不同許可權來訪問對象。

對象可分為 核心對象(Kernel objects)與 執行對象(Executive objects)。核心對象表示一些基本資源,如物理設備、同步服務等等。用戶態的程式不能訪問核心對象。用戶態的系統服務與應用程式使用執行對象,這是Windows Executive對外暴露的對象,用來封裝一個或多個核心對象。執行對象還用於實現 NT 子系統或 POSIX 子系統的一些功能。

對象結構

每個被對象管理子系統所管理的對象,包含頭部和體部。頭部是對象管理子系統使用的狀態信息。體部是對象相關的數據與暴露的服務。

對象頭部對外暴露的信息稱為Properties, 包括:

•Object Name,用來標識對象

•Object Directory,對象所屬類別

•Security Descriptors,對象的訪問許可權,一般在創建對象時傳入,大多數時候傳入值為NULL,表示採用默認安全屬性。

•Quota Charges,對象的資源使用信息

•Open handle count,打開的句柄計數

•Open handle list,活動引用的進程列表

•Reference count,活動引用進程的計數

•Type,用來標識對象體部結構

對象管理子系統所管理的對象必須提供下屬服務:

•Close,關閉對象的一個句柄

•Duplicate,創建對象的另一個句柄,用來給另一個進程共享訪問該對象

•Query object,獲得對象的屬性與性質等信息

•Query security,得到對象的安全描述信息

•Set security,改變對象的安全訪問信息

•Wait,同步一個或多個對象,通過特定事件。

同一類型的對象具有一些相同的屬性,如類型名、是否分配在非分頁記憶體、訪問許可權、同步信息等。這些由一個類型對象(type object)來表示。所有同一類型的對象實例共享這唯一的類型對象。 可以創建新的對象類型,這通過把一個對象的屬性作為對外暴露的狀態,把其方法作為對外暴露的服務來實現。

對象名(Object name)是一個對象的描述性標識。對象管理子系統保持一個已經用於表示對象的名字列表,映射每個名字到對象實例。實際上大多數訪問對象的行為是通過句柄;通過對象名來查找對象實例僅發生在創建對象時、跨進程共享一個對象時。

Object directories用於按照類型來分類對象。預定義的Object directories包括:

•\??(Win32 設備名,其中只有符號連結)

•\BaseNamedObjects(互斥、事件、信號量、可等待計時器和段對象)

•\Callback(回調函式)

•\Device(設備)

•\Drivers

•\FileSystem

•\KnownDlls

•\Nls(language tables)

•\ObjectTypes(對象類型對象)

•\RPC Controls(RPC連線埠)

•\Security(安全子系統對象)

•\Windows(視窗子系統對象)

對象屬於命名空間( Namespace). 每個用戶會話(user session)是一個名字空間。這使得多個客戶同時運行一個應用程式而不會發生干擾。在所有名字空間共享的對象屬於 GLOBAL命名空間。例如,在Global命名空間中創建一個事件,名字叫CSAPP :

相關詞條

相關搜尋

熱門詞條

聯絡我們