次の方法で共有


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

ミニフィルター ドライバーの操作前コールバック ルーチン は、システム作業キューに操作をポストし、FLT_PREOP_PENDING を返すことによって、I/O 操作をペンできます。 この状態値を返すことは、ミニフィルター ドライバーが I/O 操作の処理を再開する FltCompletePendedPreOperation を呼び出すまで、I/O 操作の制御を保持していることを示します。

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

  1. FltQueueDeferredIoWorkItem などの ルーチンを呼び出して、システム作業キューに I/O 操作をポストします。

  2. 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 を呼び出して操作の処理を再開する必要があります。