Поделиться через


Функция 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 передан в аргумент параметра атрибутов дескриптора. Ядро гарантирует, что в этом случае дескриптор не может быть закрыт.

Комментарии

NtClose — это универсальная подпрограмма, которая работает с объектом любого типа.

Закрытие дескриптора открытого объекта приводит к тому, что этот дескриптор становится недействительным. Система также уменьшает количество дескрипторов для объекта и проверяет, можно ли удалить объект. Система фактически не удаляет объект до тех пор, пока все дескрипторы объекта не будут закрыты, а указатели на них не остаются.

Драйвер должен закрыть каждый открывающийся дескриптор, как только дескриптор больше не требуется. Дескрипторы ядра, которые открываются системным потоком или путем указания флага OBJ_KERNEL_HANDLE, могут быть закрыты только в том случае, если предыдущий режим процессора — KernelMode. Это требование применяется как к системным потокам, так и к подпрограммам отправки для irP, которые были выданы из режима ядра. (Дополнительные сведения о предыдущем режиме процессора см. в разделе ExGetPreviousMode.) Например, дескриптор, который NtCreateKey возвращает в подпрограмму DriverEntry , впоследствии не может быть закрыт теми же подпрограммами диспетчеризации драйвера. Подпрограмма DriverEntry выполняется в системном процессе, тогда как подпрограммы диспетчеризации обычно выполняются либо в контексте потока, отправляющего текущий запрос ввода-вывода, либо в произвольном контексте потока для драйверов более низкого уровня.

Неядерный дескриптор может быть закрыт, только если выполняется одно из двух условий: предыдущий режим процессора — KernelMode или вызывающий поток имеет достаточно разрешений для закрытия дескриптора. Пример последнего возникает, когда вызывающий поток является тем, который создал дескриптор.

Вызывающие ntClose не должны предполагать, что эта подпрограмма автоматически ожидает завершения всех операций ввода-вывода перед возвратом.

Если вызов этой функции выполняется в пользовательском режиме, следует использовать имя "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 HwStorPortProhibitedDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport)

См. также раздел

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection