ObDereferenceObjectDeferDeleteWithTag 函数 (wdm.h)

ObDereferenceObjectDeferDeleteWithTag 例程递减指定对象的引用计数,延迟删除对象以避免死锁,并将四字节标记值写入对象以支持对象引用跟踪

语法

void ObDereferenceObjectDeferDeleteWithTag(
  [in] PVOID Object,
  [in] ULONG Tag
);

参数

[in] Object

指向对象的指针。 调用方在创建对象时或从之前对 ObReferenceObjectByHandleWithTag 例程的调用打开对象后获取此指针。

[in] Tag

指定四字节自定义标记值。 有关更多信息,请参见下面的“备注”部分。

返回值

备注

ObDereferenceObjectDeferDeleteWithTag 类似于 ObDereferenceObjectWithTag ,但当对象的引用计数达到零时, ObDereferenceObjectDeferDeleteWithTag 会将对象删除请求传递给工作线程。 在 IRQL = PASSIVE_LEVEL 上运行的工作线程稍后会删除该对象。

如果当前线程立即删除对象可能会导致死锁,请不要调用 ObDereferenceObjectWithTag 来取消引用该对象。 请改为调用 ObDereferenceObjectDeferDeleteWithTag 以取消引用对象。

例如,如果 ObDereferenceObjectWithTag 用于取消引用 内核事务管理器 (KTM) 对象,则当驱动程序堆栈上的较高级别驱动程序持有锁时,可能会发生此类死锁。

有关对象排列和对象属性的详细信息,请参阅 ObDereferenceObjectWithTag。 有关对象引用的详细信息,请参阅 对象的生命周期

ObDereferenceObjectDeferDelete 例程类似于 ObDereferenceObjectDeferDeleteWithTag,只是它不允许调用方将自定义标记写入对象。 在 Windows 7 及更高版本的 Windows 中, ObDereferenceObjectDeferDelete 始终将默认标记值写入对象 ('tlfD') 。 对 ObDereferenceObjectDeferDelete 的调用与对 ObDereferenceObjectDeferDeleteWithTag 的调用的效果相同,该调用指定 Tag = 'tlfD'。

若要在 Windows 调试工具中查看对象引用跟踪,请使用 !obtrace 内核模式调试器扩展。 在 Windows 7 中,如果启用了对象引用跟踪, 则会增强 !obtrace 扩展以显示对象引用标记。 默认情况下,对象引用跟踪处于关闭状态。 使用 全局标志编辑器 (Gflags) 启用对象引用跟踪。 有关详细信息,请参阅 带有标记的对象引用跟踪

要求

   
最低受支持的客户端 在 Windows 7 及更高版本的 Windows 操作系统中可用。
目标平台 通用
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

另请参阅

ObDereferenceObjectDeferDelete

ObDereferenceObjectWithTag

ObReferenceObjectByHandleWithTag