ObCloseHandle 函数 (wdm.h)
ObCloseHandle 例程关闭对象句柄。
语法
NTSTATUS ObCloseHandle(
[in] HANDLE Handle,
[in] KPROCESSOR_MODE PreviousMode
);
参数
[in] Handle
系统提供的任何类型的对象的句柄。
[in] PreviousMode
指定打开句柄的线程的上一个处理器模式。 若要关闭内核句柄,请将此参数设置为 KernelMode。 若要关闭 用户句柄,请将此参数设置为 UserMode。 有关这两种句柄类型的详细信息,请参阅备注。
返回值
如果调用成功,ObCloseHandle 将返回STATUS_SUCCESS。 可能的错误返回值包括以下 NTSTATUS 代码。
返回代码 | 说明 |
---|---|
STATUS_INVALID_HANDLE | 句柄 不是有效的句柄。 |
STATUS_HANDLE_NOT_CLOSABLE | 调用线程没有关闭句柄的权限。 |
注解
内核模式驱动程序调用 ObCloseHandle 以关闭由 Windows 内核创建的任何类型的对象的句柄。 驱动程序必须在不再需要句柄后立即关闭它打开的每个句柄。
在 ObCloseHandle 关闭对象的句柄后,调用方必须将句柄视为无效,并避免使用该句柄访问对象。 但是,同一对象上的其他句柄可能保持打开状态。 在 ObCloseHandle 调用期间,系统会递减对象的句柄计数,并检查是否可以删除该对象。 在关闭对象的所有句柄并释放对象的所有引用计数指针之前,系统不会删除对象。
PreviousMode 参数指定要关闭的句柄是内核句柄还是用户句柄。 若要关闭内核句柄,请将 PreviousMode 设置为 KernelMode。 若要关闭用户句柄,请将 PreviousMode 设置为 UserMode。
内核句柄是由系统线程或内核模式驱动程序打开的句柄,该驱动程序将 OBJ_KERNEL_HANDLE 属性分配给句柄。 (例如,请参阅 ZwCreateFile 中OBJ_KERNEL_HANDLE的说明。) 如果内核模式驱动程序打开句柄供其专用,并且此驱动程序在用户模式线程的上下文中运行,则驱动程序必须使用 OBJ_KERNEL_HANDLE 属性打开句柄。 此属性可确保用户模式应用程序无法访问句柄。
用户句柄是由用户模式应用程序或内核模式驱动程序打开的句柄,该驱动程序在用户模式线程的上下文中运行,但不使用 OBJ_KERNEL_HANDLE 属性打开句柄。 如果驱动程序创建供用户模式应用程序使用的用户句柄,但发生错误,要求驱动程序代表应用程序关闭句柄,则驱动程序可以调用 ObCloseHandle 来关闭句柄。
ZwClose 例程类似于 ObCloseHandle,但只能关闭内核句柄。 调用 ZwClose (hObject) 关闭内核句柄 hObject,其效果与调用 ObCloseHandle (hObject、 KernelMode) 相同。 有关关闭内核句柄的详细信息,请参阅 ZwClose。
若要确定句柄是内核句柄还是用户句柄,接收句柄的驱动程序可以调用 ExGetPreviousMode 例程。 或者,驱动程序可以从描述 I/O 请求的 IRP 结构中读取 RequestorMode 字段。 I/O 管理器将 RequestorMode 字段设置为请求 I/O 操作的线程的上一个处理器模式。
ObCloseHandle 的调用方不应假定此例程在返回之前自动等待所有挂起的 I/O 操作完成。
有关详细信息,请参阅 对象句柄。
在 Windows 7 之前的头文件中未声明 ObCloseHandle。 若要在驱动程序中使用此例程,请在驱动程序代码中包含以下函数声明:
#if (NTDDI_VERSION < NTDDI_WIN7)
NTKERNELAPI
NTSTATUS
ObCloseHandle(
__in HANDLE Handle,
__in KPROCESSOR_MODE PreviousMode
);
#endif
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | wdm.h |
Library | Ntoskrnl.lib |
DLL | Ntoskrnl.exe |
IRQL | PASSIVE_LEVEL |