操作後コールバック ルーチン内で I/O 操作を保留にする
ミニフィルター ドライバーの操作後コールバック ルーチンは、次の手順を実行して I/O 操作を保留できます。
FltAllocateDeferredIoWorkItem を呼び出して、I/O 操作の作業項目を割り当てます。
FltQueueDeferredIoWorkItem を呼び出して、I/O 操作をシステム作業キューにポストします。
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 を呼び出して、フィルター マネージャーに操作の制御を返す必要があります。