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