OutputDebugStringとDbgPrint

VistaでDbgViewを起動すると大変なことになる(デバッグ情報の出力レベルが最大になり画面が埋め尽くされた挙句ハングアップ)という記憶があって、今は違うだろうと思いDbgView(DebugView)の最新版を取りに行ったら、なんとSysInternalsがMicrosoftに買収されていた。
非公開のAPIでもがんがん解析してやるぜ的なイメージがあったので、良い子ちゃんになってしまって少しさびしかったり。


Vista(x64)で試してみたらdbgv.sysにアクセスできませんと言われてカーネルデバッグ出力が取れなかった。ちなみに大量にメッセージが出たのはたぶんRC1の時点の話で、正式版では違うようだ。


昨日のプレゼンで「OutputDebugStringとDbgPrintは同じI/F」とてきとーな書いたのだけど、どうやらあまり正確ではなかった。
仕組みとしては「\device\dbgv」というデバイスに対して出力するようになっていて、(ユーザー空間の)デバッグビュアーは二通りの方法で取得できるようだ。

※ \device\dbgvはカーネル空間の名前なので、ユーザーアプリケーションからは\\.\dbgvをCreateFileでオープンすることにより、シンボリックリンクである\DosDevices\dbgv(\??\dbgv)経由で\device\dbgvにアクセスすることができる。


WaitForDebugEventで取得する方法は「Win32デバッガの作り方」、DeviceIoControlについては「今日の進捗 - 窓のプログラミング」に少し書いてある。


余談だがDebugViewの作者のMark Russinovich氏といえばSONYの「rootkit問題」で有名になった人。あれはセキュリティホールなのは確かだがrootkitと呼ぶのはどうかと思った。
実際は隠蔽+スパイウェアであり、任意のプログラムを注入するI/Fがあったわけではなさそうだが、世間的には隠蔽=rootkitらしい。
そういえばAPIフックの調査をしていて、怪しげなソースをビルドしたらウィルスとして検出されて「おおーちゃんと仕事してるなあ」という思い出が。