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