IoCancelFileOpen 関数 (ntddk.h)
IoCancelFileOpen ルーチンは、ファイル システム フィルター ドライバーによって使用され、フィルター ドライバーのデバイス スタック内のファイル システム ドライバーによって開かれたファイルを閉じます。
構文
void IoCancelFileOpen(
[in] PDEVICE_OBJECT DeviceObject,
[in] PFILE_OBJECT FileObject
);
パラメーター
[in] DeviceObject
フィルター ドライバーのデバイス オブジェクトのすぐ下にあるデバイス スタックの上部へのポインター。
[in] FileObject
閉じるファイルのファイル オブジェクトへのポインター。
戻り値
なし
解説
ファイル システム フィルター ドライバーが、STATUS_SUCCESSで下位レベルのドライバーが要求を既に完了した後に、ファイルを開く要求またはファイル作成要求が失敗する必要があると判断した場合は、 IoCancelFileOpen を 使用して、下位レベルのドライバーによって開かれたファイルを閉じます。
STATUS_REPARSEは成功した NTSTATUS 値ですが、STATUS_REPARSEで完了した作成操作に対して IoCancelFileOpen を呼び出す必要はありません。これは、この状態値はファイルが正常に開かれていないことを示しているためです。
IoCancelFileOpen の呼び出しが成功すると、次の効果があります。ファイル システム スタック内の呼び出し元より上にあるミニフィルターとレガシ フィルターでは、作成要求が失敗したように見えます。 呼び出し元の下にあるユーザーには、ファイルが開かれている (または作成された) ように見え、閉じられているように見えます。
IoCancelFileOpen では、ファイルの変更は元に戻されないことに注意してください。 たとえば、 IoCancelFileOpen は、新しく作成されたファイルを削除したり、上書きまたは以前の状態に置き換えられたファイルを復元したりしません。
一般的な例は次のとおりです。
フィルター ドライバーは、上位レベルのフィルター ドライバーと下位レベルのファイル システム ドライバーの間に存在します。
フィルター ドライバーは、IRP_MJ_CREATE要求をデバイス スタックをファイル システム ドライバーに渡し、ファイル システム ドライバーは状態STATUS_SUCCESSでIRP_MJ_CREATE要求を完了します。
フィルター ドライバーは、作成要求を完了する前に、ファイルを閉じる必要があると判断します。
フィルター ドライバーは 、IoCancelFileOpen を使用して、ファイル システム ドライバーによって開かれたファイルを閉じます。
IoCancelFileOpen を呼び出した後、フィルター ドライバーは、STATUS_UNSUCCESSFULやSTATUS_ACCESS_DENIEDなどの適切なエラー コードで作成要求を完了する必要があります。 さらに、Irp-IoStatus.Information> フィールドを 0 に設定する必要があります。
IoCancelFileOpen は、ファイルのハンドルが作成される前に呼び出す必要があります。 呼び出し元は、FileObject パラメーターが指すFILE_OBJECT構造体の Flags メンバーをチェックできます。 FO_HANDLE_CREATED フラグが設定されている場合は、ファイルに対して 1 つ以上のハンドルが作成されているため、 IoCancelFileOpen を呼び出しても安全ではありません。
IoCancelFileOpenは、FileObject が指すファイル オブジェクトの Flags メンバーのFO_FILE_OPEN_CANCELLED フラグを設定します。 このフラグは、IRP_MJ_CREATE要求が取り消され、このファイル オブジェクトに対してIRP_MJ_CLOSE要求が発行されることを示します。 作成操作が取り消されると、その操作は再発行できません。つまり、 IoCreateFileOpen ルーチンを呼び出した場合、STATUS_REPARSEレガシ フィルター ドライバーから返すことはできません。
ミニフィルターでは、 IoCancelFileOpen の代わりに FltCancelFileOpen を使用する必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | このルーチンは、Microsoft Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h (Ntddk.h、Ntifs.h、Fltkernel.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |