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 (hObjectKernelMode) 相同。 有关关闭内核句柄的详细信息,请参阅 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

另请参阅

ExGetPreviousMode

IRP

ZwClose

ZwCreateFile