完了処理が安全な IRQL で実行されるようにする
「操作後コールバック ルーチンの記述」で説明しているように、IRP ベースの I/O 操作の操作後コールバック ルーチンは IRQL = DISPATCH_LEVEL で呼び出すことができますが、ミニフィルター ドライバーの操作前コールバック ルーチンが FLT_PREOP_SYNCHRONIZE を返すことで操作を同期していない場合、または操作が作成操作 (本質的に同期されている) ではない場合に限ります。 (この戻り値の詳細については、「FLT_PREOP_SYNCHRONIZE が返される場合」を参照してください。)
ただし、まだ同期されていない IRP ベースの I/O 操作の場合、ミニフィルター ドライバーは 2 つの手法を使用して、完了処理が IRQL <= APC_LEVEL で確実に実行されるようにできます。
最初の手法は、操作後コールバック ルーチンによって、完了処理が IRQL <= APC_LEVEL で実行できるようになるまで I/O 操作を保留する方法です。 この手法については、「操作後コールバック ルーチン内で I/O 操作を保留にする」で説明しています。
2 つ目の手法は、ミニフィルター ドライバーの操作後コールバック ルーチンで FltDoCompletionProcessingWhenSafe を呼び出す方法です。 FltDoCompletionProcessingWhenSafe が I/O 操作を保留するのは、現在の IRQL が >= DISPATCH_LEVEL の場合のみです。 それ以外の場合、このルーチンは、ミニフィルター ドライバーの SafePostCallback ルーチンをすぐに実行します。 この手法については、「FltDoCompletionProcessingWhenSafe」で説明しています。