ObReferenceObjectByHandleWithTag 函数 (wdm.h)

ObReferenceObjectByHandleWithTag 例程递增由指定句柄标识的对象的引用计数,并将四字节标记值写入对象以支持对象引用跟踪

语法

NTSTATUS ObReferenceObjectByHandleWithTag(
  [in]            HANDLE                     Handle,
  [in]            ACCESS_MASK                DesiredAccess,
  [in, optional]  POBJECT_TYPE               ObjectType,
  [in]            KPROCESSOR_MODE            AccessMode,
  [in]            ULONG                      Tag,
  [out]           PVOID                      *Object,
  [out, optional] POBJECT_HANDLE_INFORMATION HandleInformation
);

参数

[in] Handle

指定 对象的打开句柄。

[in] DesiredAccess

指定调用方请求的对象访问的类型。 此参数是 ACCESS_MASK 类型的位掩码。 此字段的解释取决于对象类型。 请勿使用任何通用访问权限。

[in, optional] ObjectType

指向指定对象类型的不透明结构的指针。 此参数指向 OBJECT_TYPE 结构。 将 ObjectType 设置为 NULL 或设置为以下指针值之一,这些值在 Wdm.h 头文件中声明:*ExEventObjectType, *ExSemaphoreObjectType、*IoFileObjectType、*PsProcessType*PsThreadType、*SeTokenObjectType、*TmEnlistmentObjectType、*TmResourceManagerObjectType、*TmTransactionManagerObjectType 或 *TmTransactionObjectType。 如果 ObjectType 不为 NULL,则例程将验证提供的对象类型是否与 Handle 参数指定的对象的对象类型匹配。

[in] AccessMode

指定要用于访问检查的访问模式。 它必须是 UserModeKernelMode。 驱动程序应始终为从用户地址空间接收的句柄指定 UserMode

[in] Tag

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

[out] Object

指向变量的指针,例程在该变量中写入指向 对象的指针。 下表列出了由可能的 ObjectType 参数值指定的 Object 指针类型。

ObjectType 参数 对象 指针类型
*ExEventObjectType PKEVENT
*ExSemaphoreObjectType PKSEMAPHORE
*IoFileObjectType PFILE_OBJECT
*PsProcessType PEPROCESS 或 PKPROCESS
*PsThreadType PETHREAD 或 PKTHREAD
*SeTokenObjectType PACCESS_TOKEN
*TmEnlistmentObjectType PKENLISTMENT
*TmResourceManagerObjectType 心声源管理
*TmTransactionManagerObjectType PKTM
*TmTransactionObjectType PKTRANSACTION

指针类型引用的结构是不透明的,驱动程序无法访问结构成员。 由于结构不透明,PEPROCESS 等效于 PKPROCESS,PETHREAD 等效于 PKTHREAD。

[out, optional] HandleInformation

驱动程序将此参数设置为 NULL

返回值

如果调用成功,ObReferenceObjectByHandleWithTag 将返回STATUS_SUCCESS。 可能的错误返回值包括:

返回代码 说明
STATUS_OBJECT_TYPE_MISMATCH ObjectType 参数为 Handle 参数标识的对象指定了错误的对象类型。
STATUS_ACCESS_DENIED 调用方没有对象所需的访问权限。
STATUS_INVALID_HANDLE 指定的句柄无效。

注解

此例程对指定的对象句柄进行访问验证。 如果可以授予访问权限,则例程将增加对象引用计数,并提供指向调用方的对象指针。 此增量可防止在调用方使用 对象时删除对象。 当不再需要对象时,调用方应通过调用 ObDereferenceObjectWithTagObDereferenceObjectDeferDeleteWithTag 例程来递减引用计数。

有关对象引用的详细信息,请参阅 对象的生命周期

ObReferenceObjectByHandleWithTag 不会关闭或使 Handle 参数指定的对象句柄失效。 当不再需要句柄时,调用方可以通过调用 ZwClose 例程来关闭句柄。

如果 AccessMode 参数值为 KernelMode,则始终允许请求的访问。 如果 AccessModeUserMode,则请求的访问权限与调用方对对象的访问权限进行比较。 只有最高级别的驱动程序才能安全地为 AccessMode 参数指定 UserMode 值。

从 Windows 7 开始,如果 AccessModeKernelMode 并且从用户地址空间收到句柄, 则驱动程序验证程序 会发出 bug 检查 C4,子代码 F6。

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

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

要求

要求
最低受支持的客户端 在 Windows 7 及更高版本的 Windows 操作系统中可用。
目标平台 通用
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport)

另请参阅

ACCESS_MASK

OBJECT_TYPE

ObDereferenceObjectDeferDeleteWithTag

ObDereferenceObjectWithTag

ObReferenceObjectByHandle

ZwClose