ObDereferenceObjectWithTag 宏 (wdm.h)
ObDereferenceObjectWithTag 例程會遞減指定對象的參考計數,並將四位元組標記值寫入物件,以支援對象參考追蹤。
語法
void ObDereferenceObjectWithTag(
[in] a,
[in] t
);
參數
[in] a
物件的指標。 呼叫端會在建立 物件時,或從先前呼叫 ObReferenceObjectByHandleWithTag 例程開啟對象之後取得這個指標。
[in] t
指定四位元組的自訂標籤值。 如需詳細資訊,請參閱接下來的<備註>一節。
傳回值
無
備註
ObDereferenceObjectWithTag 會傳回保留供系統使用的值。 驅動程式必須將此值視為 VOID。
核心模式驅動程式會呼叫此例程,將對象的參考計數遞減一。 如果物件建立為 暫存 (,則建立物件) 時未指定OBJ_PERMANENT旗標,而參考計數達到零,則物件管理員會刪除物件。
當對象的參考計數達到零時,核心模式元件可以刪除物件。 不過,驅動程式只能刪除它所建立的物件,而且驅動程式不應該嘗試刪除它未建立的任何物件。
如果物件是以指定的物件屬性旗標建立OBJ_PERMANENT,則為 永久 物件。 (如需物件屬性的詳細資訊,請參閱 InitializeObjectAttributes.) 使用一個初始參考計數建立永久物件,因此驅動程式移除其最後一個對象參考時不會刪除物件。
若要準備要刪除的永久對象,驅動程式可以呼叫 ZwMakeTemporaryObject 例程讓物件暫存。 驅動程式應該只會刪除它所建立的永久物件。 使用下列步驟來刪除永久物件:
呼叫 ObDereferenceObjectWithTag。
取得物件的句柄。 如有必要,請呼叫適當的 ZwOpenXxx 或 ZwCreateXxx 例程以取得物件句柄。
使用步驟 2 中取得的句柄呼叫 ZwMakeTemporaryObject 。
使用步驟 2 中取得的句柄呼叫 ZwClose 。
如果目前線程立即刪除物件可能會導致死結,請勿呼叫 ObDereferenceObjectWithTag 來取消參考物件。 相反地,呼叫 ObDereferenceObjectDeferDeleteWithTag 例程來取值物件。
例如,如果 ObDereferenceObjectWithTag 用於在驅動程式堆疊上的較高層級驅動程式持有鎖定時,將 核心交易管理員 (KTM) 對象取值,就會發生這類死結。
如需對象參考的詳細資訊,請參閱 物件的生命週期。
ObDereferenceObject 例程類似於 ObDereferenceObjectWithTag,不同之處在於它不會讓呼叫端將自定義標記寫入物件。 在 Windows 7 和更新版本的 Windows 中, ObDereferenceObject 一律會將預設卷標值寫入物件 ('tlfD') 。 呼叫 ObDereferenceObject 的效果與指定 Tag = 'tlfD' 的 ObDereferenceObjectWithTag 呼叫相同。
若要在 Windows 偵錯工具中檢視對象參考追蹤,請使用 !obtrace 核心模式調試程式延伸模組。 在 Windows 7 中,如果已啟用對象參考追蹤, 則會增強 !obtrace 延伸模組以顯示物件參考標記。 根據預設,對象參考追蹤會關閉。 使用 全域旗標編輯器 (Gflags) 來啟用對象參考追蹤。 如需詳細資訊,請參閱 使用標記進行對象參考追蹤。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 可在 Windows 7 和更新版本的 Windows 作業系統中使用。 |
目標平台 | 桌面 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIS (storport) |
另請參閱
ObDereferenceObjectDeferDeleteWithTag