Posted on 2010-02-18 15:13
S.l.e!ep.¢% 閱讀(771)
評論(0) 編輯 收藏 引用 所屬分類:
Windows WDM
Windows NT文件系統內幕讀書筆記(一)
2008-11-22 11:29
“在WINDOWS NT執行體的內核組件創建的所有對象可以用兩種方式引用,一種是使用當創建或者打開的時候NT對象管理器返回的對象句柄,一種是使用對象的指針。注意通常由內核組件分配的對象的指針在所有執行環境中都有效,因為對象引用的虛擬地址將在核心虛擬地址空間。但是,前面提到的,對象的句柄是特定于得到這個句柄的線程的執行上下文的,因此只有在那個特定在執行上下文中有效。
??????? 記住每個NT對象管理器創建的對象都有一個相關的引用計數器。當對象最初創建的時候這個引用計數器設置為1.每當一個內核組件請求對象管理器增加引用計數器的時候引用計數器增加,通常是調用ObReferenceObjectByHandle(在DDK中描述)。引用計數器當在對象句柄上執行關閉操作的時候遞減。內核驅動使用ZwClose系統服務調用來關閉系統創建的任何對象句柄。引用計數器在內核組件調用 ObDereferenceObject()的時候也遞減,這個函數要求傳遞對象的指針。當對象計數器變成0的時候,NT對象管理器將會刪除這個對象。
在這本書的進程中,你會經常發現我們打開一個對象,收到一個句柄,然后得到這個對象的指針,然后藏到某個地方(可能在全局內存中),引用這個對象,關閉句柄。這給我們兩個好處:
1、通過保存對象的指針,我們能夠在不是原來的打開對象的線程上下文中重新得到相同對象的句柄,你會在這本書后面發現這樣的例子。
2、通過引用這個對象和關閉原來的句柄,我們確保對象不會被刪除(知道我們最后一次解除引用),我們還確保一旦我們最后解除引用,對象將會自動被刪除。”
……
“你初始化的例程將在系統進程上下文中被調用:這一點尤其重要要記住,如果你打開或者創建任何對象得到一個句柄,任何這樣的句柄只是在這個系統進程的上下文中才有效。為了能夠在其他進程的上下文中使用這些句柄,你不得不使用這章中前面講的方法,你可以得到這個對象的指針然后需要的時候再在其他線程上下文中得到對象的句柄。”
|