Gdikdx が使えたらなぁ

Windows Graphics Programming Win32 GDI and DirectDraw® から斜め読み

ローカルの WinDbg によるデバッグはユーザー空間のみ可能
リモートではユーザー、カーネルともに可能だがNULLモデムケーブルなどで接続したりすることが必要

カーネルデバッグなら1台で完結するので SoftIce/W とかがよいらしいが、これは Vista 前に Obsolete のようだ。

成り行きで、IsWindowVisible(HWND) でガードされたブロックで SetDIBitsToDevice(...) が呼ばれているのか、動作しているのかといったあたりで悩んでいる。IsWindowVisible() が(関連する親子 window しだいの面もあるが)想定外の値を返しているのは、SetDIBitsToDevice() の延長に何かあるのか...

Gdikdx.dll (GDI kernel mode debugger extension) を "> load gdikdx.dll" としてロードすると使えるコマンドが増えるらしい。これをローカルのプロセスにアタッチした WinDbg で打つとエラー。そもそも load というコマンドがない。.load はあったので、試してみたがモジュールが見つからないというエラーになる。

なかなか魅力的に見えるコマンドが並んでいるのだが...

dumphmgr [-?] GDIオブジェクトのサマリ
dh [-?] object handle ...
dht [-?] object handle GDI handle type..
ddc [...] hdc device context
dpso [...]surfobj SURFACE struct
... ... ...

少し後に内部動作が書かれていたが、やはり GDI 側のリソースはカーネル側にあり、デバッグも host から target のカーネルデータを取得するという形で動作するようだ。

最近流行の仮想化ソフトで複数 windowsインスタンスをあげて remote kernel debug とかできるんだろうか...

WinDbg の module の dll は WDBGEXTS.h のインターフェイスに従えば作れるらしい。