操作前コールバック ルーチン内で I/O 操作を保留にする
ミニフィルター ドライバーの操作前コールバック ルーチン は、システム作業キューに操作をポストし、FLT_PREOP_PENDING を返すことによって、I/O 操作をペンできます。 この状態値を返すことは、ミニフィルター ドライバーが I/O 操作の処理を再開する FltCompletePendedPreOperation を呼び出すまで、I/O 操作の制御を保持していることを示します。
ミニフィルター ドライバーの操作前コールバック ルーチンは、次の手順を実行して I/O 操作を保留します。
FltQueueDeferredIoWorkItem などの ルーチンを呼び出して、システム作業キューに I/O 操作をポストします。
FLT_PREOP_PENDINGを返します。
すべての (またはほとんどの) 受信 I/O 操作を保留する必要があるミニフィルター ドライバーでは、FltQueueDeferredIoWorkItem などのルーチンを保留操作に使用しないでください。このルーチンを呼び出すと、システム作業キューが殺到する可能性があるためです。 代わりに、このようなミニフィルター ドライバーは、キャンセル セーフ キューを使用する必要があります。 キャンセルセーフ キューの使用の詳細については、FltCbdqInitialize を参照してください。
次のいずれかの条件に該当する場合、FltQueueDeferredIoWorkItem の呼び出しは失敗します。
操作は IRP ベースの I/O 操作ではありません。
操作はページング I/O 操作です。
現在のスレッドの TopLevelIrp フィールドが NULL ではありません。 (このフィールドの値を検索する方法の詳細については、 IoGetTopLevelIrp.)
I/O 操作のターゲット インスタンスが切断されています。
ミニフィルター ドライバーの操作前コールバック ルーチンが FLT_PREOP_PENDING を返す場合は、CompletionContext 出力パラメーターで NULL を返す必要があります。
ミニフィルター ドライバーは、IRP ベースの I/O 操作に対してのみ FLT_PREOP_PENDING を返すことができます。 操作が IRP ベースの I/O 操作であるかどうかを確認するには、FLT_IS_IRP_OPERATION マクロを使用します。
I/O 操作をデキューして処理する作業ルーチンは、FltCompletePendedPreOperation を呼び出して操作の処理を再開する必要があります。