フィルター マネージャーの概念
フィルター マネージャー (FltMgr.sys) は、ファイル システム フィルター ドライバーで一般的に必要な機能を実装して公開する、システム提供のカーネル モード ドライバーです。 サードパーティのファイル システム フィルター開発者は、FltMgr の機能を使用して、レガシ ファイル システム フィルター ドライバーよりも開発が簡単な "ミニフィルター" ドライバーを記述できます。 その結果、開発プロセスが短縮され、より品質が高く、堅牢なドライバーが作成されます。
FltMgr は Windows と共にインストールされますが、ミニフィルター ドライバーが読み込まれたときにのみアクティブになります。 これは、ターゲット ボリュームのファイル システム スタックにアタッチします。 ミニフィルター ドライバーは、ミニフィルター ドライバーがフィルター処理することを選択した I/O 操作の FltMgr に登録することによって、間接的にファイル システム スタックにアタッチします。
ミニフィルターは特定の順序でアタッチされます。 オペレーティング システムは、読み込み順序グループと高度によってアタッチ順序を決定します。 特定の高度で特定のボリュームにアタッチされたミニフィルター ドライバーは、ミニフィルター ドライバーのインスタンスと呼ばれます。
ミニフィルターの高度は、次のことを行います。
- ミニフィルター ドライバーのインスタンスが常に、他のミニフィルター ドライバー インスタンスに対して相対的に適切な場所に読み込まれるようにします。
- FltMgr が I/O を処理するためにミニフィルター ドライバーを呼び出す順序を決定します。
次の図は、フィルター マネージャーと 3 つのミニフィルター ドライバーのある簡略化された I/O スタックを示しています。
ミニフィルター ドライバーは、IRP ベースの I/O 操作と高速 I/O およびファイル システム フィルター (FSFilter) コールバック操作をフィルター処理できます。 ミニフィルターは、フィルター処理することを選択した I/O 操作ごとに、操作前コールバック ルーチン、操作後コールバック ルーチン、またはその両方を登録できます。 FltMgr は I/O 操作を処理するときに、その操作に登録されているミニフィルター ドライバーごとに適切なコールバック ルーチンを呼び出します。 そのコールバック ルーチンが返されると、FltMgr は操作に登録されている次のミニフィルター ドライバーの適切なコールバック ルーチンを呼び出します。
たとえば、この図の 3 つのミニフィルター ドライバーすべてが同じ I/O 操作に登録されているとします。 この状況では、次のようになります。
- FltMgr は I/O 操作を受け取ると、高度が最高から最低の順 (A、B、C) にミニフィルター操作前コールバック ルーチンを呼び出します。 続けて FltMgr は、さらに処理を行うために、I/O 要求を次の下位ドライバーに転送します。
- FltMgr は完了のための I/O 要求を受け取ると、各ミニフィルター ドライバーの操作後コールバック ルーチンを最低から最高という逆順 (C、B、A) で呼び出します。
レガシ フィルター ドライバーとの相互運用性を確保するために、FltMgr は複数の場所にあるファイル システム I/O スタックにフィルター デバイス オブジェクトをアタッチできます。 各 FltMgr のフィルター デバイス オブジェクトは、フレームと呼ばれます。 レガシ フィルター ドライバーの観点から見ると、各フィルター マネージャー フレームは、単なる別のレガシ フィルター ドライバーです。
各フィルター マネージャー フレームは、高度の範囲を表します。 FlgMgr は、既存のフレームを調整するか、新しいフレームを作成して、ミニフィルター ドライバーが正しい場所にアタッチできるようにすることができます。
FltMgr は、アタッチされた 2 つのレガシ フィルターの間にフィルター マネージャー フレームが既に存在しない限り、それらの間にミニフィルターをアタッチできません。 ミニフィルターをレガシ フィルターの上にアタッチする場合は、アタッチされている 2 番目のレガシ フィルターの存在に応じて、ミニフィルターをレガシ フィルターの下にアタッチできます。 ミニフィルターをレガシ フィルターの下にアタッチする場合は、代わりに、そのレガシ フィルターの上にミニフィルターをアタッチできます。
重要
常にレガシ フィルターとミニフィルターの相互運用性を確認するか、レガシ フィルターをミニフィルターで置き換えることを検討してください。 詳細については、「レガシ フィルター ドライバーの移植ガイドライン」を参照してください。
ミニフィルター ドライバーがアンロードされて再度読み込まれる場合は、アンロード元の同じフレームに同じ高度で再読み込みされます。
次の図は、2 つのフィルター マネージャー フレーム、ミニフィルター ドライバー インスタンス、およびレガシ フィルター ドライバーのある、簡略化された I/O スタックを示しています。