Filesystem & Filesystem Filterの巻
こんにちは。Clengです。今回は、ファイルシステムドライバとファイルシステムフィルタドライバの話をしたいと思います。
ファイルシステムドライバについて
いわゆるファイルシステムドライバは、ファイルの抽象概念をサポートするモジュールのことを言います。一般的には、ファイルシステムでは、ファイルの作成・削除、オープン・クローズ、リード・ライト、ディレクトリ管理などの機能を提供します。
一般的には、ファイルシステムドライバが、IoRegisterFileSystem関数を使って OS に対して登録を行います。この登録を行わない擬似ファイルシステムもありますが、登録を行いますと、マウントに参加したり、OSのシャットダウン時に自動的に通知を受けたりすることが可能になります。また、この登録を行いますと、OSがこのファイルシステムの存在をフィルタドライバに通知しますので、OSに登録==フィルタリングされるという話にもなります。
ファイルシステムは大きく分けて、ローカルファイルシステムとリモートファイルシステムの2種類があります。ローカルファイルシステムでは、ローカルにあるストレージのボリュームに対して「マウント」を行い、異なるボリュームを異なるデバイスオブジェクト(Volume Device Object)を使って管理します。一方、リモートファイルシステムは、ネットワーク上のシェアにあるファイルへのアクセスパスを提供するのが目的で、マウントの概念は存在しないし、全てのネットワークシェアへのアクセスを1つのデバイスオブジェクトで管理します。
ファイルシステムは、OSのキャッシュマネージャとメモリマネージャと非常に緊密な関係を持ち、三位一体となって、OSが問題なく動作するように勤めています。
そして、ファイルシステムドライバは、WDMドライバではなく、PnPと電源管理をサポートしません。
ファイルシステムフィルタドライバについて
ファイルシステムフィルタドライバは、名前の通り、ファイルシステムへのリクエストをフィルタリングするモジュールです。ファイルシステムフィルタドライバの実装方法は2つあって、1つはレガシーフィルタ、そしてもう1つはミニフィルタです。
レガシーフィルタは、全てのファイルシステムとのインタフェースを自分で管理し、全てのI/Oを自分で何とかしなければいけません。このため、実装が難しく、かつ非常に問題が発生しやすいです。フィルタドライバをこれから新規に開発する方は、ぜひ、ミニフィルタ方式をご検討ください。
ミニフィルタは、フィルタマネージャという名前のレガシーフィルタドライバの管理下で動作するファイルシステムフィルタドライバです。ミニフィルタは、通常のフィルタドライバで使用されるデバイススタックにアタッチする方式ではなく、コールバック方式を使います。つまり、ミニフィルタは、フィルタマネージャに各種コールバックルーチンをあらかじめ登録すれば、フィルタマネージャが適切なタイミングでコールバックルーチンを呼び出してくれます。また、フィルタマネージャではたくさんの関数が用意されていて、ミニフィルタがこれらの関数を利用して、簡単に独自のファイルI/Oを発行することが可能です。ミニフィルタ方式を利用することにより、レガシーフィルタに付きまとういくつかの問題点を防げるだけではなく、実装もレガシーフィルタドライバと比較しますと、非常に簡単になりました。
しかし、簡単になったからと言って、ファイルシステムの仕組みを理解しなくてもミニフィルタドライバを作成できる、というわけではありません。ファイルシステム自身の仕組みの複雑さもありますし、ほかにもたとえばフィルタドライバ間の「相性問題」などもありまして、ファイルシステムフィルタドライバは、Windowsのドライバの中で一番難しいドライバだと思います。このため、ここでこんなことを言うのはどうかなと思う方がいるかもしれませんが、ファイルシステムフィルタドライバ以外に他の選択肢があれば、その選択肢をを選らぶことをお勧めします。1つの例を挙げますと、ディレクトリの変化を監視したい、ということを実現するには、フィルタドライバより、以下のMSDNドキュメントに紹介されているWin32 API をまず検討してください。
Obtaining Directory Change Notifications
https://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
どうしてもフィルタドライバでなければ実現できない、という状況になりましたら、長期戦になることを覚悟した上で、慎重にドライバの設計と実装を進めていただきたいと思います。
開発キットについて
ご存知の方もいると思いますが、以前 Windowsのファイルシステムとファイルシステムフィルタドライバの開発はドライバの開発キット(DDK)とは別のキットとなっていて、名前はIFS Kit となっていました。当時、IFS Kit を入手するのに皆さんがかなり苦労したと思います。DDKがWDKに変わるタイミングで、IFS Kit も WDK に統合され、今はWDKを使ってファイルシステムとフィルタドライバを開発することが可能になっています。
WDK のファイルシステム関連のサンプルコードはsrc\filesys配下にあり、中身は以下のようになっています。
· ローカルファイルシステムのサンプル
CDFS、FASTFAT
· リモートファイルシステムのサンプル
NULMRX、SMBMRX
· レガシーフィルタのサンプル
FILTER\FILESPY、FILTER\SFILTER
· ミニフィルタのサンプル
MINIFILTER配下、複数
この中に、ミニフィルタのサンプルは、それぞれ1つ機能にフォーカスする小さいサンプルとなっていますので、非常に参考になると思います。
次回はミニフィルタドライバに纏わるもっと細かい話をしたいと思います。
それでは、ごきげんよう