Windows のFile System Filter Driversを見てきました。この「FsFilter」の例から始めました。
http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial
努力の結果、64 ビット Win8 から 32 ビット WinXP まですべてで動作するバージョンをビルドしてサインインすることができました。 (まあ、 .SYS ファイルに署名するために Microsoft に $250 を支払わなかったので、テスト証明書を受け入れるように実行する限り. :-/)Bcdedit.exe -set TESTSIGNING ON
ここで、FsFilter を変更したいと思います。特定の種類のファイルへの書き込みアクセスをフィルターでトラップしたいと考えています。次に、ユーザーがアクセスを許可または拒否できるダイアログ ボックスを受け取るようにします。
おそらく明らかに...カーネル モード コードは UI を表示できません。ユーザーモードプロセスにシグナルを送る必要があり、(任意の潜在的な期間の後) ユーザーの希望をドライバーに通知します。 User-Mode Interactions: Guidelines for Kernel-Mode Drivers を少し調べました( .DOC ではなく、Google の Cache as HTMLです)。
これを攻撃する最善の方法が何であるかはわかりません。私が調べた唯一の例は、SysInternals FileMon です。インストールされるドライバーは、WM_TIMER ループに従って .EXE によって定期的に要求されるバッファーにデータを収集します。
// Have driver fill Stats buffer with information
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_GETSTATS,
NULL, 0, &Stats, sizeof Stats,
&StatsLen, NULL ) )
{
Abort( hWnd, _T("Couldn't access device driver"), GetLastError() );
return TRUE;
}
同様の手法を使用する必要がありますか? おそらく、フィルター ドライバーは、確認する要求を受信すると、2 つの HEVENT を含むバッファーに要求を追跡するためのレコードを配置できます。次に、これら 2 つの HEVENT で WaitForMultipleObjects を実行します。これは、アクセスを許可するかどうかについて、ユーザー モードから "YES" または "NO" のシグナルが送信されたことを表します。
(ユーザー モードで実行されている) 監視プロセスは、定期的に、カスタム IOCTL を使用して別のスレッドからドライバーをポーリングします。フィルター ドライバーは、要求情報と、要求が待機している 2 つの HEVENT を返します。モニターはユーザーのフィードバックを待ち、利用可能な場合は適切なイベントを通知します。
このモデルを逆にすることもできます。ユーザー モード コードは、カスタム IOCTL を使用して、ドライバーによって通知される HEVENT などのデータを渡し、ある種の安全なプロトコルを実装するだけです。これにより、ポーリングの必要がなくなります。
基本的には、方法に関するガイダンス、または Web 上の実際の例を探しているだけです! また、非同期ファイル アクセスの仕組みについても知りたいと思います。チェックされている非同期呼び出しを行うクライアントが実行を継続し、要求が終了するのを待っているときにのみ保留される方法があると思います...?
(注: フィルターをビルドしてデバッグする過程で、"miniFilters" を介した最新の手法がいくつかあることを知りました。これは、フィルター マネージャー モデルと呼ばれるものの一部です。しかし、今のところ、私はそれほど心配していません。レガシーモデルがサポートされている限り.とにかく似ています.)