フィルターマネージャー
皆さん、こんにちは。A寿です。
突然ですが、皆さんは、カクテルコンペティションに行ったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。
さて、今回は、ファイルシステムのフィルターマネージャーの概念や基本的な用語をご紹介したいと思います。フィルターマネージャーのお話が出てくる経緯としてレガシーフィルターやミニフィルター等の用語については、以前の cleng さんの記事をご参照いただければと思います。
まず、もっとも単純な概念図として、以下の図をご覧ください。
この図を使って、I/Oの流れを説明します。ユーザーモードからのI/O要求が、I/Oマネージャーによってファイルシステムに送られます。I/O はファイルシステムドライバースタックの上位ドライバーから順に処理されていきます。この時、フィルターマネージャーは、ファイルシステムドライバーの上方に位置しており、ここでファイルシステムドライバーへのI/O要求を横取りします。フィルターマネージャーは、登録されたミニフィルターに対し、「高度 (Altitude) 」が高いミニフィルターから順に、I/O要求を渡していきます。渡されたI/O要求に対応するコールバックをミニフィルターが持っていれば、それが呼び出されます。そして、I/Oはファイルシステムドライバーや、その下のボリュームのストレージドライバーのスタックへと送られていきます。
ちなみに、ここで、デバイススタックの話をしておきますと、フィルターマネージャーは、レガシーフィルターであるため、そのデバイスオブジェクトに対して !devstack を実行すれば、ファイルシステムドライバーのデバイスオブジェクトの上に fltmgr として表示されます。これは、通常のデバイススタックにアタッチするデバイスオブジェクトと同様に、デバイススタック全体が削除・追加されないと、レガシーフィルターは取り外したり挿入したりできないことを意味します。それに対して、ミニフィルターの場合は、予めデバイススタックとして積まれたフィルターマネージャーに対して登録したり解除したりできるので、動的に挿入したり取り外したり(ロードしたりアンロードしたり)できます。
さて、ここで、「高度 (階層、Altitude) 」について補足します。高度は、全てのミニフィルターが一意の値を持つ、浮動小数です。この値が高いと、よりデバイススタックとして上位であることを表します。そして、浮動小数であることにより、弊社やサードパーティ様が新しいミニフィルターを開発しても、任意の高度を与えることができます。また、ミニフィルターの種類によって高度の範囲が決まっています。例えば、上図の通り、アンチウィルスフィルター (FSFilter Anti-Virus) は、レプリケーションフィルター (FSFilter Replication) よりも高い高度を持っています。これは、別のサーバーにI/Oをレプリケート(複製)されるよりも前に、アンチウィルスフィルターでスキャンする必要があるためです。
なお、高度は、弊社が発行・管理しております。下記ドキュメントの「ファイルシステム ミニフィルターの高度割り当て」や「ミニフィルターの高度割り当ての要求 (英語) 」のリンクを見ていただければ、どこの会社がどの種類のどの高度を使っているかですとか、弊社への申請方法がわかります。
ファイル システム フィルター ドライバー
https://msdn.microsoft.com/ja-jp/library/windows/hardware/gg462968.aspx
ミニフィルターを開発されるお客様で、もし弊社のサンプルの高度をそのまま使っているお客様がいらっしゃいましたら、他社様のミニフィルターや、自社でのテスト用サンプルミニフィルターなどとの衝突を起こさないように、変更していただくことをおすすめいたします。
続いて、フィルターマネージャーにおいて基本的な 3 つの用語、フレーム、ボリューム、インスタンス、について、以下の図を用いて説明します。図のデバイススタックについて簡単に説明しますと、ボリューム \Device\HarddiskVolume2 の上に、ミニフィルターCとミニフィルターBが登録されたフィルターマネージャー (fltmgr.sys) 、(fltmgr.sys 以外の何らかの)レガシーフィルター、ミニフィルターAが登録されたフィルターマネージャー、というスタックになっています。(便宜上、ボリュームとフィルターマネージャーの間の、ファイルシステムやストレージドライバーのスタックは省略しています。)ボリューム \Device\Mup の上には、ミニフィルターBが登録されたフィルターマネージャー、ミニフィルターAが登録されたフィルターマネージャーというスタックになっています。
フレーム (Frame) とは、ファイルシステムデバイススタックに挿入されるフィルターマネージャー (fltmgr.sys) のデバイスオブジェクトの位置を表します。例えば、ファイルシステムデバイススタックにおいて、ファイルシステムドライバーのデバイスオブジェクトのすぐ上に来るフィルターマネージャーのデバイスオブジェクトの位置は、「フレーム 0」です。そして、このフレーム 0 に属する全てのミニフィルターよりも高い高度を持つレガシーフィルターがある場合は、フレーム 0 に属するフィルターマネージャーのデバイスオブジェクトの上に、レガシーフィルターのデバイスオブジェクトが載ります。そして、もし、レガシーフィルターよりも高い高度を持つミニフィルターがある場合は、「フレーム 1」に属するフィルターマネージャーのデバイスオブジェクトが載ります。上図では、下の2つのミニフィルターがフレーム 0 に属しており、この2つより高い高度を持つレガシーフィルターが、フレーム 0 の上にあり、さらにそのレガシーフィルターよりも高い高度を持つミニフィルターがフレーム 1 に属しています。
ボリューム (Volume) とは、単一のドライブレターが割り当てられるディスクパーティションのことを表します。図の緑色で示した部分が、ボリュームそのものを表します。また、図の黄色で示した部分は、フィルターマネージャーが管理している、ボリュームを表す構造体です。これは、フィルターマネージャーのデバイスオブジェクトに相当しています。「\Device\HarddiskVolume2」や「\Device\Mup」といったボリューム名 1 つに対し、フレーム 1つにつき1つあります。
インスタンス (Instance) とは、ボリュームにアタッチされるミニフィルターの「オブジェクト」です。1つのボリュームにつき、同じミニフィルターの複数のインスタンスをアタッチできるので、上図では、ミニフィルターBのインスタンスが、ボリューム \Device\Mup に対して、2 つアタッチされています。
以上の知識があれば、ミニフィルターのサンプルをインストールしてみて、 fltmc.exe でロードやアタッチをして、その状況をfltmc.exe で確認した時に、表示されている用語の意味がよりわかりやすくなるのではと思います。 fltmc.exe の使い方などは別の機会にご紹介できればと思います。お役に立てば幸いです。
Appendix
Filter Manager Concepts (Windows Drivers)
https://msdn.microsoft.com/ja-JP/library/windows/hardware/ff541610
――――――――――――――――
【閑話休題】突然ですが、皆さんは、カクテルコンペティションに行ったことはありますか?
私はこの夏の終わりごろに初めて参加しました。もちろんカクテルを作る側ではなく、審査する側でもなく、単に見たり飲んだりする客としてです。私が参加したカクテルコンペは、とあるチェーン展開されているバーの各店舗を代表するバーテンダーさんが腕を競うものでした。同時に数名ずつステージに出てきて、予め課題として与えられたカクテルや、オリジナルのカクテルなどを作っていくものでした。結構な人数のバーテンダーさんがカクテルを作るので、 「全員分のオリジナルカクテルを飲んだら酔っ払うどころじゃすまないなあ」と、私はお酒に弱いにもかかわらずお気楽な妄想をしていましたが、残念ながらというか、当然ながらというか、あくまでも競技会ですので、作られたカクテルは審査員の人数分しかなく、観客には全く回ってきませんでした。 なので、最初は競技の雰囲気を楽しんでいたお客さんたちも、スポンサーであるお酒のメーカーなどが試飲可能なカクテルを提供する別室が用意されるやいなや、こぞって別室に流れ込みました。お客さんの中には、応援しているバーテンダーさんがステージに出ている間は客席にいる方たちもいたので、全員別室に行ったわけではありませんでしたが、やっぱりカクテルを作っているところを見ると飲みたくなるよなあ、と思いました。ただ、そこはやはりメーカーの人が試飲用に作るカクテルなので、バーテンダーさんのオリジナルのカクテルが飲めないのかな、と思っていると、競技がすべて終わり、最終審査に入った段階で、決勝に残ったバーテンダーさん達が、別室にカクテルを作りに来てくれました。しかし、観客の数は圧倒的で、バーテンダーさん各自が一人で作れるカクテルの数はたかが知れており、熾烈な争いの結果(というよりは人の波でカクテルになかなかたどり着けず・・・)、ようやく一人のカクテルだけを飲むことができたのでした。皆様も、カクテルコンペに行く時は、できるだけ多くのカクテルが飲めるよう、ご注意ください。(とはいえ、自分のキャパシティ分以上にお酒を飲めましたし、最後にはブッフェもあり、初めてのカクテルコンペを十分満喫することができました。)