當乙個程序被初始化時,系統要為它分配乙個控制代碼表。該控制代碼表只用於核心物件,不用於使用者物件或gdi物件。
它只是個資料結構的陣列。每個結構都包含乙個指向核心物件的指標、乙個訪問遮蔽和一些標誌。
程序的控制代碼結構 索引
核心物件記憶體塊的指標
訪問遮蔽(標誌位的dword)
標誌(標誌位的dword )
0 x ? ? ? ? ? ? ? ?
0 x ? ? ? ? ? ? ? ?
0 x ? ? ? ? ? ? ? ?
0 x ? ? ? ? ? ? ? ?
0 x ? ? ? ? ? ? ? ?
0 x ? ? ? ? ? ? ? ?
建立核心物件
當程序初次被初始化時,它的控制代碼表是空的。然後,當程序中的執行緒呼叫建立核心物件的函式時,核心就為該物件分配乙個記憶體塊,並對它初始化。這時,核心對程序的控制代碼表進行掃瞄,找出乙個空項。該指標成員將被設定為核心物件的資料結構的記憶體位址,訪問遮蔽設定為全部訪問權,同時,各個標誌也作了 設定。
控制代碼值實際上是放入程序的控制代碼表中的索引,它用於標識核心物件的資訊存放的位置。
關閉核心物件
無論怎樣建立核心物件,都要向系統指明將通過呼叫closehandle來結束對該物件的操作:
bool closehandle(handle hobj);
該函式首先檢查呼叫程序的控制代碼表,以確保傳遞給它的索引(控制代碼)用於標識乙個程序實際上無權訪問的物件。如果該索引是有效的,那麼系統就可以獲得核心物件的資料結構的位址,並可確定該結構中的使用計數的資料成員。如果使用計數是0 ,該核心便從記憶體中撤消該核心物件。
在closehandle返回之前,它會清除程序的控制代碼表中的專案,該控制代碼現在對你的程序已經無效,不應該試圖使用它。無論核心物件是否已經撤消,都會發生清除操作。當呼叫closehandle 函式之後,將不再擁有對核心物件的訪問權,不過,如果該物件的使用計數沒有遞減為 0 ,那麼該物件尚未被撤消。這沒有問題,它只是意味著乙個或多個其他程序正在使用該物件。當其他程序停止使用該物件時(通過呼叫closehandle),該物件將被撤消。
對於核心物件來說,系統將執行下列操作:當程序終止執行時,系統會自動掃瞄程序的控制代碼表。如果該錶擁有任何無效專案(即在終止程序執行前沒有關閉的物件),系統將關閉這些物件控制代碼。如果這些物件中的任何物件的使用計數降為0 ,那麼核心便撤消該物件。
程序的核心物件控制代碼表
當程序初始化的時候,系統會為其分配乙個控制代碼表。該控制代碼表只用於核心物件。具體該控制代碼表在系統中是種怎樣的結構和是怎麼被系統管理的,現在沒有說明文件。程序控制代碼表的大體結構如下 index pointer to kernal object memory block access mask f...
win32程序概念之控制代碼表,以及核心物件
我們知道.我們使用createprocess 的時候會返回乙個程序控制代碼.以及執行緒控制代碼.其實在呼叫createprocess的時候.核心中會新建乙個eprocess結構來儲存我們的程序資訊.例如如下圖 但是有乙個問題.怎麼給三環使用.難道直接返回eprocess?其實不是這樣的.第一epro...
核心物件與控制代碼的關係
一 乙個物件是不是核心物件,通常可以看建立此物件api的引數中是否需要 psecurity attributes 型別的引數。三 每個程序中有乙個控制代碼表 handle table 這個控制代碼表僅供核心物件使用,如下圖 四 解開此中的秘密 比如呼叫建立乙個執行緒的api handle hthre...