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) 操作もサポートされます。 便宜的ロック操作の場合、ミニフィルター ドライバーは、FltInitializeOplock や FltOplockFsctrl などのフィルター マネージャー ルーチンを使用できます。これは、ファイル システムおよびレガシ フィルター ドライバーで使用される FsRtlInitializeOplock ルーチンと FsRtlOplockFsctrl ルーチンに相当します。
I/O 操作を処理するためのフィルター マネージャー ルーチン
FltMgr は、操作前および操作後のコールバック ルーチンで保留中の I/O に対して、次のサポート ルーチンを提供します。
次のルーチンは、操作前および操作後コールバック ルーチンで作業項目をキューに格納するために使用されます。
- FltAllocateDeferredIoWorkItem
- FltAllocateGenericWorkItem
- FltFreeDeferredIoWorkItem
- FltFreeGenericWorkItem
- FltQueueDeferredIoWorkItem
- FltQueueGenericWorkItem
次のルーチンは、キャンセル セーフなキューのサポートを提供します。
次のルーチンは、便宜的ロックのサポートを提供します。
I/O 操作を処理するためのミニフィルター コールバック ルーチン
次のコールバック ルーチンは、ミニフィルター ドライバーが処理する I/O 操作の種類ごとに、FLT_OPERATION_REGISTRATION 構造体に格納されます。
コールバック ルーチン名 | コールバック ルーチンの種類 |
---|---|
事前操作 | PFLT_PRE_OPERATION_CALLBACK |
PostOperation | PFLT_POST_OPERATION_CALLBACK |