ZwClose 関数 (wdm.h)

ZwClose ルーチンは、オブジェクト ハンドルを閉じます。

構文

NTSYSAPI NTSTATUS ZwClose(
  [in] HANDLE Handle
);

パラメーター

[in] Handle

任意の型のオブジェクトを処理します。

戻り値

ZwClose は 、成功した場合はSTATUS_SUCCESS、失敗した場合は適切な NTSTATUS エラー コードを返します。 特に、 Handle が有効なハンドルでない場合はSTATUS_INVALID_HANDLEを返し、呼び出し元のスレッドにハンドルを閉じる権限がない場合はSTATUS_HANDLE_NOT_CLOSABLEを返します。

注釈

ZwClose は、任意の種類のオブジェクトを操作するジェネリック ルーチンです。

開いているオブジェクト ハンドルを閉じると、そのハンドルが無効になります。 また、オブジェクトのハンドル数をデクリメントし、オブジェクトを削除できるかどうかを確認します。 システムは、オブジェクトのすべてのハンドルが閉じられ、参照されたポインターが残らないまで、オブジェクトを実際に削除しません。

ドライバーは、ハンドルが不要になったらすぐに開くすべてのハンドルを閉じる必要があります。 カーネル ハンドルは、システム スレッドまたはOBJ_KERNEL_HANDLE フラグを指定して開かれるハンドルであり、前のプロセッサ モードが KernelMode の場合にのみ閉じることができます。 この要件は、システム スレッドと、カーネル モードから発行された IRP のディスパッチ ルーチンの両方に適用されます。 (以前のプロセッサ モードの詳細については、「 ExGetPreviousMode」を参照してください)。たとえば、 ZwCreateKeyDriverEntry ルーチンに返すハンドルを、同じドライバーの ディスパッチ ルーチンで閉じることはできません。 DriverEntry ルーチンはシステム プロセスで実行されますが、ディスパッチ ルーチンは通常、現在の I/O 要求を発行するスレッドのコンテキストで、または下位レベルのドライバーの場合は任意のスレッド コンテキストで実行されます。

カーネル以外のハンドルは、前のプロセッサ モードが KernelMode であるか、呼び出し元のスレッドがハンドルを閉じるのに十分なアクセス許可を持っているという 2 つの条件のいずれかが満たされている場合にのみ閉じることができます。 後者の例は、呼び出し元のスレッドがハンドルを作成したスレッドである場合に発生します。

ZwClose の呼び出し元は、このルーチンが返される前にすべての I/O が完了するまで自動的に待機することを想定しないでください。

この関数の呼び出しがユーザー モードで発生する場合は、"ZwClose" ではなく "NtClose" という名前を使用する必要があります。

カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なります。 ルーチンの NtXxx バージョンと ZwXxx バージョン間の関係の詳細については、「Using Nt and Zw Versions of the Native System Services Routines」を参照してください。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library 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