SimRep File System Minifilter Driver サンプルを動かしてみる
今回は、ファイルシステム ミニフィルタ ドライバのサンプルSimRep File System Minifilter Driver をご紹介します。
このサンプルは、ファイルオープンを他のパスにリダイレクトするリパースポイントの動作をシミュレートする実装を確認できるサンプルです。これをWindows 10 (1709) x86 にインストールして、C:\x\y というフォルダへのアクセスが C:\a\b というフォルダへのアクセスにリダイレクトされるところをお見せしたいと思います。サンプルをビルドする、開発側のPC はWindows 10 (1709) x64 にVisual Studio 2017 とWDK for Windows 10 Version 1709 がインストールされています。
1. サンプルの入手
SimRep File System Minifilter Driver サンプルは、以下のサイトの右側の緑色の [Clone or Download] ボタンを押すと表示される [Download ZIP] ボタンでWindows-driver-samples-master.zip をダウンロードすると、Windows-driver-samples-master\filesys\miniFilter\simrep のフォルダにあります。
https://github.com/Microsoft/Windows-driver-samples
2. サンプルのビルド
このフォルダの simrep.sln を、Visual Studio 2017 で開きます。
[ ソリューション ‘simrep’] を右クリックして [構成マネージャー] をクリックします。
今回は、[アクティブソリューション構成] を [Debug] 、[アクティブ ソリューション プラットフォーム] を [Win32] とします。
[ソリューション ‘simrep’] を右クリックして[ソリューションのリビルド] をクリックします。\simrep\Debug\simrepフォルダに以下の3 つのファイルができます。
simrep.cat
simrep.inf
simrep.sys
3. サンプルのインストールと動作確認の準備
上記のファイルをWindows 10 (1709) x86 の環境にコピーします。例えば、C:\simrep というフォルダを作って、そこに置きます。simrep.inf を右クリックして、[インストール] をクリックすれば、インストールできます。
インストールしても、以下のようにまだこのサンプルドライバはロードされていません。(fltmc.exe の使い方の詳細は、以前の記事「fltmc.exe の使い方」<https://blogs.msdn.microsoft.com/jpwdkblog/2013/02/27/fltmc-exe/> をご参照ください。)
>fltmc
フィルター名 インスタンス数 階層 フレーム ------------------------------ ------------- ------------ ----- WdFilter 4 328010 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 2 40700 0 FileInfo 4 40500 0 |
そこで、以下のコマンドでこのサンプルドライバをロードします。
> fltmc load simrep |
これにより、以下のようにsimrep がロードされています。ただ、まだインスタンス数が0 であることから、ボリュームへのアタッチはされていません。
>fltmc
フィルター名 インスタンス数 階層 フレーム ------------------------------ ------------- ------------ ----- SimRep 0 371100 0 WdFilter 4 328010 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 2 40700 0 FileInfo 4 40500 0 |
この状態でC ドライブにアタッチすることはできますが、話を簡単にするために、事前に、C ドライブ直下にx\y (x フォルダの下に、y サブフォルダ)、とa\b (a フォルダの下に、b サブフォルダ) を作成します。
yフォルダの内容が、動作確認時にb フォルダのものとして見えるよう、y フォルダの下にtest.txt を作っておきます。
dir コマンドで各フォルダの状況をお見せします。
// C ドライブ直下 // x フォルダとa フォルダがあります
>dir c:\ ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は6EDD-0F4F です
c:\ のディレクトリ
2017/12/23 16:21 <DIR> a (略) 2017/12/23 16:10 <DIR> simrep (略) 2017/12/23 16:21 <DIR> x 2 個のファイル 34 バイト 7 個のディレクトリ 33,411,641,344 バイトの空き領域
// x フォルダにはy サブフォルダがあります
>dir \x ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は6EDD-0F4F です
C:\x のディレクトリ
2017/12/23 16:21 <DIR> . 2017/12/23 16:21 <DIR> .. 2017/12/23 16:21 <DIR> y 0 個のファイル 0 バイト 3 個のディレクトリ 33,411,510,272 バイトの空き領域
// y フォルダにはtest.txt ファイルがあります
>dir \x\y ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は6EDD-0F4F です
C:\x\y のディレクトリ
2017/12/23 16:31 <DIR> . 2017/12/23 16:31 <DIR> .. 2017/12/23 16:31 0 test.txt 1 個のファイル 0 バイト 2 個のディレクトリ 33,410,428,928 バイトの空き領域
// a フォルダにはb サブフォルダがあります
>dir \a ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は6EDD-0F4F です
C:\a のディレクトリ
2017/12/23 16:21 <DIR> . 2017/12/23 16:21 <DIR> .. 2017/12/23 16:21 <DIR> b 0 個のファイル 0 バイト 3 個のディレクトリ 33,411,391,488 バイトの空き領域
// b フォルダには何もありません
>dir \a\b ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は6EDD-0F4F です
C:\a\b のディレクトリ
2017/12/23 16:21 <DIR> . 2017/12/23 16:21 <DIR> .. 0 個のファイル 0 バイト 2 個のディレクトリ 33,410,428,928 バイトの空き領域 |
上記のフォルダが作成できたら、simrep をC ドライブにアタッチします。以下のコマンドを実行すると成功することが確認できます。
>fltmc attach simrep c:
ATTACH に成功しました... インスタンス名: SimRep |
以下のコマンドを実行することで、インスタンス数も増えており、C ドライブにアタッチできていることもわかります。
>fltmc
フィルター名 インスタンス数 階層 フレーム ------------------------------ ------------- ------------ ----- SimRep 1 371100 0 WdFilter 4 328010 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 0 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 2 40700 0 FileInfo 4 40500 0
>fltmc instances フィルター ボリューム名 階層 インスタンス名 フレーム SprtFtrs Vl 状態 -------------------- ------------------------------------- ------------ ---------------------- ----- -------- -------- FileInfo 40500 FileInfo 0 00000007 FileInfo C: 40500 FileInfo 0 00000007 FileInfo \Device\Mup 40500 FileInfo 0 00000007 SimRep C: 371100 SimRep 0 00000007 WdFilter 328010 WdFilter Instance 0 00000007 WdFilter C: 328010 WdFilter Instance 0 00000007 WdFilter \Device\Mup 328010 WdFilter Instance 0 00000007 Wof 40700 Wof Instance 0 00000007 Wof C: 40700 Wof Instance 0 00000007 luafv C: 135000 luafv 0 00000007 npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000 wcifs C: 189900 wcifs Instance 0 00000007 |
4. サンプルの動作確認
以上で準備ができたので、dir コマンドでy フォルダとb フォルダの内容を見てみます。
// y フォルダ以下にあった test.txt がなくなったのがわかります
>dir \x\y ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は 6EDD-0F4F です
C:\x\y のディレクトリ
2017/12/23 16:21 <DIR> . 2017/12/23 16:21 <DIR> .. 0 個のファイル 0 バイト 2 個のディレクトリ 33,410,052,096 バイトの空き領域
// b フォルダには、やはり test.txt はありません
>dir \a\b ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は 6EDD-0F4F です
C:\a\b のディレクトリ
2017/12/23 16:21 <DIR> . 2017/12/23 16:21 <DIR> .. 0 個のファイル 0 バイト 2 個のディレクトリ 33,410,166,784 バイトの空き領域 |
では、今度はさらにy フォルダに test2.txt を作成してみましょう。
>fsutil file createnew \x\y\test2.txt 0 ファイルC:\x\y\test2.txt が作成されました
// y フォルダにtest2.txt が作成できていることがわかります
>dir \x\y ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は 6EDD-0F4F です
C:\x\y のディレクトリ
2017/12/23 16:46 <DIR> . 2017/12/23 16:46 <DIR> .. 2017/12/23 16:46 0 test2.txt 1 個のファイル 0 バイト 2 個のディレクトリ 33,408,991,232 バイトの空き領域
// リダイレクト先のb フォルダにも当然test2.txt ができていることを確認できます
>dir \a\b ドライブC のボリューム ラベルがありません。 ボリューム シリアル番号は 6EDD-0F4F です
C:\a\b のディレクトリ
2017/12/23 16:46 <DIR> . 2017/12/23 16:46 <DIR> .. 2017/12/23 16:46 0 test2.txt 1 個のファイル 0 バイト 2 個のディレクトリ 33,408,991,232 バイトの空き領域 |
上記の内容が、ファイルシステムミニフィルタドライバを開発される方のお役に立てば幸いです。
WDK サポートチーム 津田