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 特性参数参数。 内核可确保在这种情况下无法关闭句柄。
言论
NtClose 是一个对任何类型的对象进行操作的泛型例程。
关闭打开的对象句柄会导致该句柄无效。 系统还会递减对象的句柄计数,并检查是否可以删除该对象。 在关闭所有对象的句柄并且没有引用的指针保留之前,系统不会实际删除该对象。
驱动程序必须关闭它打开的每个句柄,只要不再需要句柄。 内核句柄(即系统线程打开的句柄或指定OBJ_KERNEL_HANDLE标志)只能在上一个处理器模式 KernelMode时关闭。 此要求适用于系统线程和从内核模式颁发的 IRP 调度例程。 (有关以前的处理器模式的详细信息,请参阅 ExGetPreviousMode。)例如,NtCreateKey 返回到 DriverEntry 例程的句柄随后无法由同一驱动程序 调度例程关闭。 DriverEntry 例程在系统进程中运行,而调度例程通常在发出当前 I/O 请求的线程上下文中运行,或者对于较低级别的驱动程序,在任意线程上下文中运行。
仅当满足以下两个条件之一时,才能关闭非内核句柄:以前的处理器模式 KernelMode,或者调用线程有足够的权限关闭句柄。 调用线程是创建句柄的线程时,会出现后者的示例。
NtClose 的调用方不应假定此例程在返回之前自动等待所有 I/O 完成。
如果在用户模式下调用此函数,则应使用名称“NtClose”而不是“ZwClose”。
对于内核模式驱动程序的调用,NtXxx 和 ZwXxx 版本的 Windows 本机系统服务例程的行为方式可能以不同的方式处理和解释输入参数。 有关 NtXxx 与 ZwXxx 例程之间的关系的详细信息,请参阅 使用 Nt 和 Zw 版本的本机系统服务例程。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 |
目标平台 | 普遍 |
标头 | ntifs.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDIs、IrqlZwPassive、PowerIrpDDis、ZwRegistryCreate、ZwRegistryCreate(storport)、ZwRegistryOpen、ZwRegistryOpen(storport) |