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 |