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 で開きます。

 

clip_image002

 

[ ソリューション ‘simrep’] を右クリックして [構成マネージャー] をクリックします。

 

clip_image004

 

今回は、[アクティブソリューション構成] を [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 サポートチーム 津田