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