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 とかできるんだろうか...