NtClose 函数 (ntifs.h)

NtClose 例程关闭对象句柄。

语法

__kernel_entry NTSYSCALLAPI NTSTATUS NtClose(
  [in] HANDLE Handle
);

参数

[in] Handle

任何类型的对象的句柄。

返回值

NtClose 在成功时返回STATUS_SUCCESS,或者返回相应的 NTSTATUS 错误代码,如下所示。

返回代码 含义
STATUS_INVALID_HANDLE 句柄 不是有效的句柄。
STATUS_HANDLE_NOT_CLOSABLE 调用线程没有关闭句柄的权限;也就是说,指定的对象句柄受到保护,防止 NtClose 的任何实例尝试关闭。

发生后一个 NTSTATUS 代码的示例是,调用 ZwDuplicateObject 时, OBJ_PROTECT_CLOSE 传递给 handle attributes 参数参数。 内核确保在这种情况下不能关闭句柄。

注解

NtClose 是一个泛型例程,可对任何类型的对象进行操作。

关闭打开的对象句柄会导致该句柄无效。 系统还会递减对象的句柄计数,并检查是否可以删除该对象。 在关闭对象的所有句柄并且未保留引用的指针之前,系统不会实际删除对象。

驱动程序必须在不再需要句柄后立即关闭它打开的每个句柄。 仅当以前的处理器模式为 KernelMode 时,才能关闭由系统线程或指定OBJ_KERNEL_HANDLE标志打开的内核句柄。 此要求既适用于系统线程,也适用于从内核模式颁发的 IRP 调度例程。 (有关以前的处理器模式的详细信息,请参阅 ExGetPreviousMode.) 例如, NtCreateKey 返回到 DriverEntry 例程的句柄随后无法由同一驱动程序的 调度例程关闭。 DriverEntry 例程在系统进程中运行,而调度例程通常在发出当前 I/O 请求的线程上下文中运行,或者对于较低级别的驱动程序,在任意线程上下文中运行。

仅当满足以下两个条件之一时,才能关闭非内核句柄:以前的处理器模式为 KernelMode,或者调用线程具有关闭句柄的足够权限。 当调用线程是创建句柄的线程时,将发生后者的示例。

NtClose 的调用方不应假定此例程在返回之前自动等待所有 I/O 完成。

如果在用户模式下调用此函数,则应使用名称“NtClose”而不是“ZwClose”。

对于来自内核模式驱动程序的调用,Windows 本机系统服务例程的 NtXxxZwXxx 版本在处理和解释输入参数的方式上的行为可能有所不同。 有关例程的 NtXxxZwXxx 版本之间的关系的详细信息,请参阅 使用本机系统服务例程的 Nt 和 Zw 版本

要求

要求
最低受支持的客户端 Windows 2000
目标平台 通用
标头 ntifs.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI、IrqlZwPassive、PowerIrpDDis、ZwRegistryCreate、ZwRegistryCreate (storport) 、ZwRegistryOpen、ZwRegistryOpen (storport)

另请参阅

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection