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


Функция ZwClose (wdm.h)

Подпрограмма ZwClose закрывает дескриптор объекта.

Синтаксис

NTSYSAPI NTSTATUS ZwClose(
  [in] HANDLE Handle
);

Параметры

[in] Handle

Дескриптор объекта любого типа.

Возвращаемое значение

ZwClose возвращает STATUS_SUCCESS при успешном выполнении или соответствующий код ошибки NTSTATUS при сбое. В частности, он возвращает STATUS_INVALID_HANDLE, если дескриптор не является допустимым дескриптором, или STATUS_HANDLE_NOT_CLOSABLE, если вызывающий поток не имеет разрешения на закрытие дескриптора.

Комментарии

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

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

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

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

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

Если вызов этой функции происходит в пользовательском режиме, следует использовать имя NtClose вместо ZwClose.

Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы собственных системных служб Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями процедуры NtXxx и ZwXxx см. в разделе Использование версий Nt и Zw для процедур собственных системных служб.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDDIs(storport), IrqlZwPassive(wdm), PowerIrpDDis(wdm), ZwRegistryCreate(storport), ZwRegistryCreate(storport), ZwRegistryCreate(wdm), ZwRegistryOpen(storport), ZwRegistryOpen(storport), ZwRegistryOpen(wdm)

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

Использование версий Nt и Zw собственных процедур системных служб

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection