共用方式為


ObDereferenceObjectWithTag 宏 (wdm.h)

ObDereferenceObjectWithTag 例程會遞減指定對象的參考計數,並將四位元組標記值寫入物件,以支援對象參考追蹤

語法

void ObDereferenceObjectWithTag(
  [in]  a,
  [in]  t
);

參數

[in] a

物件的指標。 呼叫端會在建立 物件時,或從先前呼叫 ObReferenceObjectByHandleWithTag 例程開啟對象之後取得這個指標。

[in] t

指定四位元組的自訂標籤值。 如需詳細資訊,請參閱接下來的<備註>一節。

傳回值

備註

ObDereferenceObjectWithTag 會傳回保留供系統使用的值。 驅動程式必須將此值視為 VOID。

核心模式驅動程式會呼叫此例程,將對象的參考計數遞減一。 如果物件建立為 暫存 (,則建立物件) 時未指定OBJ_PERMANENT旗標,而參考計數達到零,則物件管理員會刪除物件。

當對象的參考計數達到零時,核心模式元件可以刪除物件。 不過,驅動程式只能刪除它所建立的物件,而且驅動程式不應該嘗試刪除它未建立的任何物件。

如果物件是以指定的物件屬性旗標建立OBJ_PERMANENT,則為 永久 物件。 (如需物件屬性的詳細資訊,請參閱 InitializeObjectAttributes.) 使用一個初始參考計數建立永久物件,因此驅動程式移除其最後一個對象參考時不會刪除物件。

若要準備要刪除的永久對象,驅動程式可以呼叫 ZwMakeTemporaryObject 例程讓物件暫存。 驅動程式應該只會刪除它所建立的永久物件。 使用下列步驟來刪除永久物件:

  1. 呼叫 ObDereferenceObjectWithTag

  2. 取得物件的句柄。 如有必要,請呼叫適當的 ZwOpenXxxZwCreateXxx 例程以取得物件句柄。

  3. 使用步驟 2 中取得的句柄呼叫 ZwMakeTemporaryObject

  4. 使用步驟 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)

另請參閱

InitializeObjectAttributes

IoGetDeviceObjectPointer

ObDereferenceObject

ObDereferenceObjectDeferDeleteWithTag

ObReferenceObjectByHandleWithTag

ZwClose

ZwMakeTemporaryObject