操作前コールバック ルーチン内で I/O 操作を完了する
I/O 操作を完了するとは、操作の処理を停止することを意味し、最終的な NTSTATUS 値を割り当てて、フィルター マネージャーに戻します。
ミニフィルター ドライバーが I/O 操作を完了するとき、フィルター マネージャーは次のことを行います。
現在のミニフィルター ドライバーの下のミニフィルター ドライバー、レガシ フィルターまたはファイル システムに操作を送信しません。
ミニフィルター ドライバー インスタンス スタックの現在のミニフィルター ドライバーの上のミニフィルター ドライバーの操作前コールバック ルーチンを呼び出します。
操作に対して現在のミニフィルター ドライバーの操作後コールバック ルーチンが存在していても呼び出しません。
ミニフィルター ドライバーの操作前コールバック ルーチンは、次の手順を実行して I/O 操作を完了します。
コールバック データ構造体の IoStatus.Status フィールドを操作の最後の NTSTATUS 値に設定します。
FLT_PREOP_COMPLETE を返します。
I/O 操作を完了する操作前コールバック ルーチンは、NULL 以外の完了コンテキストを (CompletionContext 出力パラメーターに) 設定できません。
ミニフィルター ドライバーは、次の手順を実行して、前に保留されていた I/O 操作の作業ルーチンでの操作を完了することもできます。
コールバック データ構造体の IoStatus.Status フィールドを操作の最後の NTSTATUS 値に設定します。
作業ルーチンが FltCompletePendedPreOperation を呼び出すときに、CallbackStatus パラメーターで FLT_PREOP_COMPLETE を渡します。
I/O 操作を完了するとき、ミニフィルター ドライバーは、コールバック データ構造体の IoStatus.Status フィールドを操作の最終的な NTSTATUS 値に設定する必要がありますが、この NTSTATUS 値を STATUS_PENDING または STATUS_FLT_DISALLOW_FAST_IO にすることはできません。 クリーンアップまたはクローズ操作の場合は、このフィールドを STATUS_SUCCESS にする必要があります。 これらの操作を他の NTSTATUS 値で完了することはできません。
I/O 操作の完了は、NTSTATUS の値に応じて、操作の成功または失敗と呼ばれることがよくあります。
I/O 操作を成功させるということは、STATUS_SUCCESS のような成功または情報の NTSTATUS 値で完了することを意味します。
I/O 操作を失敗させるということは、STATUS_INVALID_DEVICE_REQUEST や STATUS_BUFFER_OVERFLOW のようなエラーまたは警告の NTSTATUS 値で完了することを意味します。
NTSTATUS の値は ntstatus.h で定義されています。 これらの値は、成功、情報、警告、エラーの 4 つのカテゴリに分類されます。 これらの値について詳しくは、「NTSTATUS 値の使用」をご覧ください。