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 ルーチンはシステム プロセスで実行されますが、ディスパッチ ルーチンは通常、現在の I/O 要求を発行するスレッドのコンテキストで、または下位レベルのドライバーの場合は任意のスレッド コンテキストで実行されます。
2 つの条件のいずれかが満たされている場合にのみ、非カーネル ハンドルを閉じることができます。前のプロセッサ モードが KernelMode であるか、呼び出し元のスレッドにハンドルを閉じるのに十分なアクセス許可があります。 後者の例は、呼び出し元のスレッドがハンドルを作成したスレッドである場合に発生します。
NtClose の呼び出し元は、このルーチンが戻る前にすべての I/O が完了するまで自動的に待機することを想定しないでください。
要件
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntifs.h (Wdm.h、Ntddk.h、Ntifs.h を含みます) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs、IrqlZwPassive、PowerIrpDDis、ZwRegistryCreate、ZwRegistryCreate(storport)、ZwRegistryOpen、ZwRegistryOpen(storport) |