ファイルシステムミニフィルタードライバーのサンプル

ファイルシステムミニフィルタードライバーには、どのようなサンプルがあるかご存知でしょうか。   皆さん、こんにちは。Windows Driver Kit サポートチームの津田です。今回は、ファイルシステムミニフィルタードライバーのサンプルにどのようなものがあるかの一覧とそれぞれがある場所についてご案内します。サンプルの場所自体は、以下のサイトの [Download ZIP] ボタンで Windows-driver-samples-master.zipをダウンロードしていただいたことを前提に、ポイントします。   <https://github.com/Microsoft/Windows-driver-samples>   AVScan   AVScan は、Anti-Virus (アンチウィルス) を目的として、ファイル内のデータをスキャンする動作を示すサンプルです。   \Windows-driver-samples-master\filesys\miniFilter\avscan フォルダにあります。     CancelSafe   ミニフィルターでのキャンセルセーフキューの使い方のサンプルです。   \Windows-driver-samples-master\filesys\miniFilter\cancelSafe フォルダにあります。     CDO   ミニフィルターでの Control Device Object (CDO) の使い方のサンプルです。ミニフィルターには、アプリケーションとの通信方法が用意されているので、必ずしもアプリケーションがミニフィルターの CDO を CreateFile でオープンして、そのハンドルを使ってミニフィルターと通信する、という必要はありません。ただ、そのような方法を必要とされる方のために、参考として公開されています。   \Windows-driver-samples-master\filesys\miniFilter\cdo フォルダにあります。   Change   ファイルの変更を検知するサンプルです。   \Windows-driver-samples-master\filesys\miniFilter\change フォルダにあります。  …


NameChanger File System Minifilter Driver サンプルを動かしてみる

あるボリューム内で、あるフォルダへのアクセスを別のフォルダにリダイレクトするサンプルをご紹介します。   皆さん、こんにちは。WDK サポートチームの津田です。今回は、このようなサンプルとして、NameChanger File System Minifilter Driver ファイル システム ミニ フィルタ ドライバのサンプルを使用します。これを Windows 10 にインストールして、C:\A\B というフォルダへのアクセスが C:\X\Y というフォルダへのアクセスにリダイレクトされるところをお見せしたいと思います。   1.   サンプルの入手   NameChanger File System Minifilter Driver サンプルは、以下のサイトの [Download ZIP] ボタンで Windows-driver-samples-master.zipをダウンロードすると、Windows-driver-samples-master\filesys\miniFilter\NameChanger のフォルダにあります。   https://github.com/Microsoft/Windows-driver-samples   2.   サンプルのビルド   このフォルダの NameChanger.sln を、Visual Studio 2015 で開きます。     [ソリューション ‘NameChanger’] を右クリックして [構成マネージャー] をクリックします。    …


fltmc.exe の使い方

皆さん、こんにちは。A寿です。   突然ですが、皆さんは、ATVに乗ったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。     さて、以前の記事で、ファイルシステムのフィルターマネージャーの概念や基本的な用語をご紹介しましたので、今回は、ミニフィルターのサンプルをインストールしてみて、 fltmc.exe でロードやアタッチをして、その状況をfltmc.exe で確認してみようと思います。   今回は、例として、 PassThrough ファイルシステムミニフィルタードライバー サンプルを使用します。 このサンプルは、以下から入手可能です。     PassThrough File System Minifilter Driver   http://code.msdn.microsoft.com/windowshardware/passThrough-File-System-f9975611   ドキュメントに従い、 Windows 8 にインストールしたという前提で以下進めます。   (1) 管理者権限でコマンドプロンプトを起動します。       fltmc.exe は管理者権限のコマンドプロンプトでないと、アクセス拒否のエラーとなり、実行できません。   (2) fltmc /? を実行してオプションを確認します。   C:\windows\system32>fltmc /?   ** 無効なコマンド 有効なコマンド:     load        フィルター ドライバーを読み込みます     unload      フィルター…


フィルターマネージャー

皆さん、こんにちは。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をレプリケート(複製)されるよりも前に、アンチウィルスフィルターでスキャンする必要があるためです。   なお、高度は、弊社が発行・管理しております。下記ドキュメントの「ファイルシステム ミニフィルターの高度割り当て」や「ミニフィルターの高度割り当ての要求 (英語) 」のリンクを見ていただければ、どこの会社がどの種類のどの高度を使っているかですとか、弊社への申請方法がわかります。     ファイル システム フィルター ドライバー   http://msdn.microsoft.com/ja-jp/library/windows/hardware/gg462968.aspx   ミニフィルターを開発されるお客様で、もし弊社のサンプルの高度をそのまま使っているお客様がいらっしゃいましたら、他社様のミニフィルターや、自社でのテスト用サンプルミニフィルターなどとの衝突を起こさないように、変更していただくことをおすすめいたします。   続いて、フィルターマネージャーにおいて基本的な 3 つの用語、フレーム、ボリューム、インスタンス、について、以下の図を用いて説明します。図のデバイススタックについて簡単に説明しますと、ボリューム \Device\HarddiskVolume2 の上に、ミニフィルターCとミニフィルターBが登録されたフィルターマネージャー (fltmgr.sys) 、(fltmgr.sys 以外の何らかの)レガシーフィルター、ミニフィルターAが登録されたフィルターマネージャー、というスタックになっています。(便宜上、ボリュームとフィルターマネージャーの間の、ファイルシステムやストレージドライバーのスタックは省略しています。)ボリューム…


ファイル I/O の API とフィルタドライバのふかーい関係

こんばんは。cleng です。 前回 5/13 のポストから、約一ヶ月間が経ち、この一ヶ月間の間、いくつかの出来事があって、皆さんに紹介したいと思います。また前回のポストでは、次回はミニフィルタの話をすると予告しましたが、フィルタドライバの話をする前に、ファイル I/O の API の話を少しお話したほうがいいかもしれないと、思うようになりました。ミニフィルタの話は、また今度ということで、ご勘弁ください。 まず、コンサートの話です。マイクロソフトには社員が有志で作った管弦楽団があり、毎年1回ファミリーコンサートを開催しています。開催時期は大体 5 月です。コンサートのチケットは、開催日より約 1ヶ月前から無料配布していますので、ご興味のある方は来年 4 月になったら http://msjso.org を覗いてみてください。そして、今年のコンサートでは、WDK チームのさなえすさんが合唱団の一員として華麗なるデビューを果たしました!!もちろん当日コンサート会場に駆けつけましたが、合唱団は舞台の一番後ろに立たされ、しかも皆さん同じ服装をしていたので、残念ながら、どれがさなえすさんなのかは全く分かりませんでした。でも、きっと得意の語学力を存分に生かし、「乾杯の歌」、「第九」などをイタリア語、ドイツ語で歌っていたに違いないと思います。 次に、先週ある加工機のメーカ様のところにお邪魔しました。そこで、高精度・高剛性の頂点に立つ巨大な加工機を見せてもらい、普段携わっているコンピュータソフトウェアと全く別の世界に存在する「ものづくり」の美しさに魅了されました。特に印象深いのは、加工済みサンプルの中にある一枚の鏡でした。その鏡は、なんと、このメーカ様の加工機の精密な動きにより、金属の塊から削りだしたものです。鏡であるゆえに、少しでもゆがみなどがあればすぐに「ばれて」しまいますが、その鏡は完璧なものでした。その鏡の前で感嘆しつつ、Windowsがこんなところでも役に立っていることをとても誇りに思いました。 さて、本題のファイル I/O の API に入ります。今日お話したいテーマは2つあり、メモリマップドファイルと非同期処理です。 ——————————–メモリマップドファイル——————————–ファイルデータをリードする場合、以下の2つの方法があります。 1. ReadFile方式CreateFile -> ReadFile/ReadFileEx -> CloseHandle 2. メモリマップドファイル方式A. CreateFile -> CreateFileMapping -> MapViewOfFile/MapViewOfFileEx を使って、ディスク上にあるファイルを仮想メモリにマッピングするB. MapViewOfFile/MapViewOfFileEx から返されるアドレスに対して、普通のメモリアクセスを行うC. リードが終わったら、UnmapViewOfFile -> CloseHandle(マッピングハンドルのクローズ) -> CloseHandle (ファイルハンドルのクローズ) を行う アプリケーションレベルではこの2つの方法のどれでも、ファイルデータのリードが簡単にできて、違いは呼出し手順だけですが、ファイルシステムフィルタドライバにとっては、この2つの方法は天と地の違いがあります。 ReadFile 方式の場合、アプリケーションがReadFileを呼び出す時点で、フィルタドライバにFastI/O か、IRP_MJ_READ のキャッシュI/O リクエストがディスパッチされますが、メモリマップドファイル方式の場合、この2種類のキャッシュI/Oリクエストのどれもがフィルタドライバにディスパッチされません。なぜなら、アプリケーションがファイルデータのマッピングされているメモリに直接アクセスしているだけです。 幸いなことに、ファイルシステムフィルタドライバにとって、この2つの方式に共通するところがあります。どの方式においても、データを得るのにディスク上にあるファイルからデータを読み込む必要があるので、このディスクからファイルを読み込むリクエストは、共通項になります。このようなリクエストは、ページングI/Oとも呼ばれています。 この2つのファイルアクセスの方式が一因となり、ファイルシステムフィルタドライバではキャッシュI/Oリクエストではなく、ページングI/O(とノンキャッシュI/O)をフィルタリングするのは一般的なつくりとなっています。…


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 http://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…