操作前コールバック ルーチン内で I/O 操作を完了する

I/O 操作を完了するとは、操作の処理を停止することを意味し、最終的な NTSTATUS 値を割り当てて、フィルター マネージャーに戻します。

ミニフィルター ドライバーが I/O 操作を完了するとき、フィルター マネージャーは次のことを行います。

  • 現在のミニフィルター ドライバーの下のミニフィルター ドライバー、レガシ フィルターまたはファイル システムに操作を送信しません。

  • ミニフィルター ドライバー インスタンス スタックの現在のミニフィルター ドライバーの上のミニフィルター ドライバーの操作前コールバック ルーチンを呼び出します。

  • 操作に対して現在のミニフィルター ドライバーの操作後コールバック ルーチンが存在していても呼び出しません。

ミニフィルター ドライバーの操作前コールバック ルーチンは、次の手順を実行して I/O 操作を完了します。

  1. コールバック データ構造体の IoStatus.Status フィールドを操作の最後の NTSTATUS 値に設定します。

  2. FLT_PREOP_COMPLETE を返します。

I/O 操作を完了する操作前コールバック ルーチンは、NULL 以外の完了コンテキストを (CompletionContext 出力パラメーターに) 設定できません。

ミニフィルター ドライバーは、次の手順を実行して、前に保留されていた I/O 操作の作業ルーチンでの操作を完了することもできます。

  1. コールバック データ構造体の IoStatus.Status フィールドを操作の最後の NTSTATUS 値に設定します。

  2. 作業ルーチンが 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 値の使用」をご覧ください。