天天看點

[Windows] Windows下的對象系統

對象的分類:

對象分為三種:使用者對象、圖形裝置接口(GDI)對象、核心對象

三種對象的職責:

使用者對象:為視窗管理提供支援

GDI圖像裝置接口對象:為圖形展示提供支援

(!)核心對象:記憶體管理,程序執行,程序間通訊  三個主要用途

如果不做MFC相關程式設計,我們隻需要關心核心對象。

所有細分的對象清單:

​​​ https://docs.microsoft.com/en-us/windows/win32/sysinfo/object-categories​​

對象管理:

windows 對象(核心對象、使用者對象、GDI對象) 有标準的頭部結構和與之類型對應的屬性構成。正是因為有着較為統一的結構,故而windows系統可以很友善地統一管理這些對象。

頭部中包含了目前對象的名稱,正是有這個名稱的存在,才讓windows對象可以任意地在遊離于各個程序間。

windows對象管理器有如下職責:

1)建立對象

2)驗證某個程序是否可以通路某個對象

3)建立對象句柄,并回報給調用者

4)維護引用計數器

5)提供複制句柄的能力

6)關閉句柄

windows提供如下操作對象的接口:

1)建立對象

2)擷取一個指向對象的handle

3)擷取對象的資訊

4)設定對象的資訊

5)關閉句柄

6)摧毀對象  (确定有直接摧毀對象的接口?不是通過指向對象的句柄引用計數管理的麼?)

注:有些時候,當指向對象的所有handle都被關閉後(對象的引用計數為0),對象依舊可以存在于記憶體中。知道下一次被捕獲時,系統告知使用者目前對象已經被銷毀,這個時候核心才會釋放相應的記憶體。
  • 句柄 和 核心對象都會消耗記憶體。是以句柄洩露就是記憶體洩露。句柄洩露的最常見現象就是系統占用記憶體居高不下。
  • 程序退出時會釋放所有的句柄和核心對象。但是線程退出時不會。
  • 核心對象銷毀時,所有綁定在其上的handle也會一并銷毀。但是我們往往是通過closehandle讓引用計數為0而銷毀對象。而不是通過銷毀對象來反過來關閉句柄。
  • 有些對象隻能存在一個句柄指向它,有些對象可能有多個句柄指向它。

對象操作:

​​CloseHandle​​ Closes an open object handle.
​​CompareObjectHandles​​ Compares two object handles to determine if they refer to the same underlying kernel object.
​​DuplicateHandle​​ Duplicates an object handle.
​​GetHandleInformation​​ Retrieves certain properties of an object handle.
​​SetHandleInformation​​ Sets certain properties of an object handle.

區分核心對象的小竅門:

但凡需要指定 安全權限

工具: