次の方法で共有


操作後コールバック ルーチン内で I/O 操作を保留にする

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

  1. FltAllocateDeferredIoWorkItem を呼び出して、I/O 操作の作業項目を割り当てます。

  2. FltQueueDeferredIoWorkItem を呼び出して、I/O 操作をシステム作業キューにポストします。

  3. FLT_POSTOP_MORE_PROCESSING_REQUIRED を返します。

次のいずれかの条件に該当する場合、FltQueueDeferredIoWorkItem の呼び出しは失敗します。

  • 操作は IRP ベースの I/O 操作ではありません。

  • 操作はページング I/O 操作です。

  • 現在のスレッドの TopLevelIrp フィールドが NULL ではありません。 (このフィールドの値を検索する方法の詳細については、 IoGetTopLevelIrp.)

  • I/O 操作のターゲット インスタンスが切断されています。 (フィルター マネージャーは、この FLTFL_POST_OPERATION_DRAINING 状況を示します。入力パラメーターに操作後コールバック ルーチンに「フラグ」を設定します)。

このエラーを処理するには、ミニフィルター ドライバーを準備する必要があります。 ミニフィルター ドライバーでこのようなエラーを処理できない場合は「I/O 操作を保留するのではなく、FLT_PREOP_SYNCHRONIZE を返す」で説明されている手法の使用を検討する必要があります。

ミニフィルター ドライバーの操作後コールバック ルーチンが FLT_POSTOP_MORE_PROCESSING_REQUIRED を返した後、ミニフィルター ドライバーの作業ルーチンが FltCompletePendedPostOperation を呼び出してフィルター マネージャーに操作の制御を返すまで、フィルター マネージャーは I/O 操作のそれ以上の完了処理を実行しません。 フィルター マネージャーは、作業ルーチンが操作のコールバック データ構造の IoStatus.Status フィールドにエラー NTSTATUS 値を設定した場合でも、この状況ではそれ以上の処理を実行しません。

I/O 操作の完了処理をデキューして実行する作業ルーチンは、FltCompletePendedPostOperation を呼び出して、フィルター マネージャーに操作の制御を返す必要があります。