DeviceIoControlについて

フィルタドライバ内のDbgPrintをアプリケーション側で受け取りたいと思い,とりあえずDebugView.exeの動作を解析することに。

ただ流石にディスアスするのは嫌だったので,あたりを付けて解析することにした。

ドライバとアプリケーションがデータをやりとりするためには,DeviceIoControlというAPIをアプリケーション側で使用するはず。つまりDebugView.exeでもDeviceIoControlを使用しているはずである。

ということで,まずDependency WalkerでDebugView.exeを調べると,インポートセクションにDeviceIoControlが列挙されている。つまりプログラム内でDeviceIoControlが使用されていることが証明されたことになる。

次にDeviceIoControlをエクスポートしているkernel32.dllのラッパーDLL(_ernel32.dll)を作成し,DebugView.exeにロードさせてみる。このラッパーDLLはDeviceIoControlをフックし,その引数を出力するように実装している。_ernel32.dllをロードさせるためには,DebugView.exeをバイナリエディタで開き,KERNEL32とkernel32の文字列を全て_ernel32に変更する。これだけ。

で,実行させてみるとやはり,DeviceIoControlが0.5sごとにコールされていた。さらにCreateFileもフックし,その第一引数を調べてみるとWindowsのシステムフォルダ内のdbgv.sysを開いていた。つまりDbgPrintは,CreateFileでdbgv.sysをオープンし,取得したdbgv.sysのハンドルを使ってDeviceIoControlしていることが分かった。

ただDeviceIoControlに渡されるデータの構造が分からないため,結局実装はできず。

けれどやはりアプリケーションとドライバでデータのやりとりを行うためには,DeviceIoControlを用いる必要があることが分かった。ただ,DeviceIoControlはアプリケーション側でコールする必要があるため,無限ループを回す必要がある。しかしコールした瞬間にしかデータをアプリケーションに送れないと困るので,DeviceIoControlが呼ばれるまでの間,アプリケーションに送るためのデータをドライバ内に格納しておかなければいけない。格納するにはやはりリストかな。