windows核心程式設計 核心物件和控制代碼洩漏

2022-08-27 17:33:11 字數 1819 閱讀 6564

1. 什麼是核心物件?

核心物件是作業系統分配的乙個記憶體塊,該記憶體塊是乙個資料結構,用於管理物件的各種資訊。

當應用程式要與系統裝置進行互動的時候,將使用到核心物件,出於安全的考慮,程序是不能直接訪問核心物件的,作業系統提供了對應的函式來對它們進行訪問。

訪問符號物件、事件物件、檔案物件、作業物件、互斥物件、管道物件、等待計時器物件等都是核心物件。我們在程式設計時經常要建立、開啟和操作它們。

核心物件由核心擁有,並不是程序所擁有,每個核心物件都有乙個計數器來儲存有多少個程序在使用它的資訊。程序呼叫時,計數器增1,呼叫結束,計數器減1,核心物件計數器為零時,銷毀此核心物件.

核心物件有安全描述符的保護,安全描述符描述了誰建立了該物件以及誰能夠使用該物件。用於建立核心物件的函式幾乎都有乙個指向sec urity_attributes 結構的指標作為其引數。

大多數應用程式通過傳null值建立具有預設安全性的物件。如果想限制別人對物件的訪問,就需要單獨建立乙個security_attributes物件並對其初始化。

2. 什麼是控制代碼?

通俗的概念:控制代碼是wondows用來標識被應用程式所建立或使用的物件的唯一整數,windows使用各種各樣的控制代碼標識諸如應用程式例項,視窗,控制,位圖,gdi物件等等。當應用程式訪問核心物件時,將返回乙個標示核心物件的東東,這些則是控制代碼。核心物件的「控制代碼」,可以惟一地標誌物件。當應用建立核心物件時,返回的就是控制代碼。此核心物件程序的所有執行緒都可以利用這個控制代碼訪問核心物件。

3. 核心物件建立?

4. 關閉核心物件

無論程序怎樣建立核心物件,在不使用該物件的時候都應當通過bool closehandle(handle hobj)

來向作業系統宣告結束對該物件的訪問。

這裡有乙個問題:為什麼結束程序能釋放所有占用的資源?

是因為程序在執行時有可能出現記憶體洩露。在程序終止執行時,系統會自動掃瞄程序的控制代碼表。若表中擁有任何無效專案(程序終止前沒關閉的物件),系統將關閉這些物件的控制代碼。物件的計數器被置

0,核心便會撤銷這些物件。

5. 如何發現和分析控制代碼洩露?

經上面的了解知道當應用程式使用完核心物件之後需要釋放資源關閉核心物件。如果沒用closehandle,那麼將可能導致當前程序無法再開啟對應的核心物件,而從系統層面上來說將會大量占用記憶體,導致系統變慢。所以有時候發現應用程式程序本身占用記憶體不多,但是系統記憶體占用卻很高,可能就因為控制代碼洩露導致。

下面簡單介紹兩種判斷控制代碼洩露的方法:

1)、開啟任務管理器:選擇選單:檢視—選擇列,勾上「控制代碼數「,如下圖:

此時任務管理器中多了一列控制代碼數,如果你發現乙個程序控制代碼數在不斷增加,那麼可能該程序就存在記憶體洩露了。

2)使用工具process explorer,該工具能夠非常明了的看到程序所正在使用的核心物件,當存在控制代碼物件時,它能夠協助你分析找到原因。下面以乙個存在控制代碼洩露的簡單程式為例:

該程式在訪問1.txt這個檔案的時候,沒有關閉控制代碼,導致檔案不斷被開啟。

從這裡你還可以看到有gdi handles和user handles的概念,我理解為這些handle可以統稱為核心對像的handle,只是對應了不同的內容,handles直接操作檔案,登錄檔這類東西,而gdi與user操作的是可見的這些東西,gdi與user又有細份,gdi更關注圖形,而user更關注互動。

WINDOWS核心程式設計 核心物件

今天想把看的第三章的心得寫下來。這章主要介紹了核心物件。在windows中,核心物件是由作業系統來管理,儘管使用者能夠建立它,但是在建立之後,使用者對該核心物件的操作都是委託給作業系統。通常使用者建立和使用的物件分為 使用者物件 如 hicon createicon prama gdi物件函式以及核...

Windows核心程式設計 核心物件

每個核心物件只是核心分配的乙個記憶體塊,只能由核心訪問.該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊,由得物件型別相同,但大多數不同,比如程序物件有個程序id,乙個基本優先順序,乙個退出 檔案物件則有乙個位元組位移,乙個共享模式,乙個開啟模式 如果核心控制代碼傳遞給另外乙個程序,那麼這另...

Windows核心程式設計 核心物件

每個核心物件只是核心分配的乙個記憶體塊,只能由核心訪問.該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊,由得物件型別相同,但大多數不同,比如程序物件有個程序id,乙個基本優先順序,乙個退出 檔案物件則有乙個位元組位移,乙個共享模式,乙個開啟模式 如果核心控制代碼傳遞給另外乙個程序,那麼這另...