標籤:
1. 核心對象
Windows中每個核心對象都只是一個記憶體塊,它由作業系統核心分配,並只能由作業系統核心進行訪問,應用程式不能在記憶體中定位這些資料結構並直接更改其內容。這個記憶體塊是一個資料結構,其成員維護著與對象相關的資訊。少數成員(安全性描述元和使用計數)是所有核心對象都有的,但大多數成員都是不同類型對象特有的。
2. 核心對象的使用計數與生命期
核心對象的所有者是作業系統核心,而非進程。換言之也就是說當進程退出,核心對象不一定會銷毀。作業系統核心通過核心對象的使用計數,知道當前有多少個進程正在使用一個特定的核心對象。初次建立核心對象,使用計數為1。當另一個進程獲得該核心對象的訪問權之後,使用計數加1。如果核心對象的使用計數遞減為0,作業系統核心就會銷毀該核心對象。也就是說核心對象在當前進程中建立,但是當前進程退出時,核心對象有可能被另外一個進程訪問。這時,進程退出只會減少當前進程對引用的所有核心對象的使用計數,而不會減少其他進程對核心對象的使用計數(即使該核心對象由當前進程建立)。那麼核心對象的使用計數未遞減為0,作業系統核心不會銷毀該核心對象。樣本如下:
(1)進程1退出,2不退出時。核心對象A,B的引用計數減為0,被作業系統核心銷毀,而進程1隻減少自身對C,D的引用計數,不會影響進程2對C,D的引用計數,此時C,D引用計數不為0,不會被銷毀。
(2)進程2退出,1不退出時。進程2減少自身對C,D的引用計數,不會影響進程1,故A,B,C,D都不會被銷毀
(3)進程1,2均退出時,核心對象A,B,C,D的引用計數均遞減為0,被核心銷毀
(4)進程1和2均為退出時,核心對象A,B,C,D的引用計數只要有一個遞減為0,那麼遞減為0的核心對象便被核心銷毀
3. 操作核心對象
Windows提供了一組函數進行操作核心對象。成功調用一個建立核心對象的函數後,會返回一個控制代碼,它表示了所建立的核心對象,可由進程中的任何線程使用。在32位進程中,控制代碼是一個32位值,在64位進程中控制代碼是一個64位值。我們可以使用唯一標識核心對象的控制代碼,調用核心操作函數對核心對象進行操作。
3. 核心對象與其他類型的對象
Windows進程中除了核心對象還有其他類型的對象,比如視窗,菜單,字型等,這些屬於使用者物件和GDI對象。要區分核心對象與非核心對象,最簡單的方式就是查看建立這個對象的函數,幾乎所有建立核心對象的函數都有一個允許我們指定安全屬性的參數。
Windows核心對象