次の方法で共有


I/O 操作の処理

FltMgr は、ミニフィルター ドライバーの I/O 操作の処理を簡略化します。 レガシ フィルター ドライバーは、すべての I/O 要求を次の下位ドライバーに正しく渡し、要求に関連する作業を行うかどうかに関係なく、保留中の要求、同期、I/O 完了を正しく処理する必要があります。 これに対し、ミニフィルター ドライバーは、処理する必要がある I/O 操作に対してのみ登録します。

特定の I/O 操作の場合、FltMgr は、その操作の操作前コールバック ルーチンを登録するミニフィルター ドライバーのみを呼び出します。 FltMgr は、次のスタックの場所にパラメーターをコピーし、IRP PendingReturned フラグを伝達するなど、ミニフィルター ドライバーの代わりに特定の IRP メンテナンス タスクも処理します。

操作前コールバック ルーチンでのミニフィルター ドライバーの動作は次のようになります。

  • I/O 操作に必要な処理を実行します。
  • 操作前コールバック ルーチンから適切な値を返すことによって IRP に何を行う必要があるかを示します。

たとえば、完了ルーチンなしで次の下位ドライバーに IRP を転送するために、ミニフィルター ドライバーは FLT_PREOP_SUCCESS_NO_CALLBACK を返します。 完了ルーチン (I/O 操作のミニフィルター ドライバーの操作後コールバック ルーチン) で同じ操作を行うために、ミニフィルター ドライバーは FLT_PREOP_SUCCESS_WITH_CALLBACK を返します。

ミニフィルター ドライバーは、操作前コールバック ルーチンで、必要に応じて FltQueueDeferredIoWorkItem を呼び出すことによって、ワーカー スレッドに操作をキューに格納できます。 その後、ミニフィルター ドライバーは、I/O 操作が保留中であることを示すために、操作前コールバック ルーチンから FLT_PREOP_PENDING を返します。 ミニフィルター ドライバーは、要求の処理を完了または再開する役割を担います。 処理を再開するために、ミニフィルター ドライバーは、ワーカー スレッドから FltCompletePendedPreOperation を呼び出します。

ミニフィルター ドライバーは、処理対象である未処理の I/O 操作のインスタンスごとにキャンセル セーフ キューを維持する必要がある場合、次の呼び出しを行うことでそうしたキューを設定できます。

  • InstanceSetupCallback ルーチンでの FltCbdqInitialize の呼び出し。
  • キューに I/O 操作を挿入するために必要な、操作前コールバック ルーチンでの FltCbdqInsertIo の呼び出し。

FltMgr は、下位フィルター ドライバー (レガシ フィルターとミニフィルター ドライバー) が完了処理を終了すると、I/O 操作のためにミニフィルター ドライバーの操作後コールバック ルーチンを呼び出します。

その後、ミニフィルター ドライバーは操作後コールバック ルーチンで、完了処理が安全な IRQL で実行されるように FltDoCompletionProcessingWhenSafe を呼び出すことができます。 または、必要に応じて FltQueueDeferredIoWorkItem を呼び出すことによって、操作の完了処理をワーカー スレッドにキューに入れることもできます。 ミニフィルター ドライバーはそれを実行した後で、I/O 操作の FltMgr の完了処理を停止する操作後コールバック ルーチンから FLT_POSTOP_MORE_PROCESSING_REQUIRED を返します。 完了処理を再開するために、ミニフィルター ドライバーは、ワーカー スレッドから FltCompletePendedPostOperation を呼び出します。

FltMgr は、"汎用" 作業項目 (I/O 操作ではなくミニフィルター ドライバーまたはミニフィルター ドライバー インスタンスに関連付けられている作業項目) のキューをサポートします。 ミニフィルター ドライバーは、FltQueueGenericWorkItem を呼び出すことによって、システム作業キューに作業項目を挿入できます。 このルーチンは ExQueueWorkItem などのルーチンに似ています。たとえば、作業項目 (FltAllocateGenericWorkItem を呼び出すことによって割り当てられる) を再利用できます。 ただし、未処理の作業項目がまだ処理中の間、FltMgr はミニフィルター ドライバーまたはミニフィルター ドライバー インスタンスでアンロードできないため、ミニフィルター ドライバーの場合は FltQueueGenericWorkItem のほうが安全です。

FltMgr では、便宜的ロック (oplock) 操作もサポートされます。 便宜的ロック操作の場合、ミニフィルター ドライバーは、FltInitializeOplockFltOplockFsctrl などのフィルター マネージャー ルーチンを使用できます。これは、ファイル システムおよびレガシ フィルター ドライバーで使用される FsRtlInitializeOplock ルーチンと FsRtlOplockFsctrl ルーチンに相当します。

I/O 操作を処理するためのフィルター マネージャー ルーチン

FltMgr は、操作前および操作後のコールバック ルーチンで保留中の I/O に対して、次のサポート ルーチンを提供します。

次のルーチンは、操作前および操作後コールバック ルーチンで作業項目をキューに格納するために使用されます。

次のルーチンは、キャンセル セーフなキューのサポートを提供します。

次のルーチンは、便宜的ロックのサポートを提供します。

I/O 操作を処理するためのミニフィルター コールバック ルーチン

次のコールバック ルーチンは、ミニフィルター ドライバーが処理する I/O 操作の種類ごとに、FLT_OPERATION_REGISTRATION 構造体に格納されます。

コールバック ルーチン名 コールバック ルーチンの種類
事前操作 PFLT_PRE_OPERATION_CALLBACK
PostOperation PFLT_POST_OPERATION_CALLBACK