フックと格闘
全般
- SetWindowsHookEx() すると、同種のフックチェインの先頭に登録される。
- フックの種類やら何やらが定義されているのは winuser.h
- フックチェインの内容を調べる方法は、どうやら存在しない。
低レベルキーボードフック
- _WIN32_WINNT を 0x400 以上にセットすべし。本当に使えるのは NT4SP3 から。
- フックプロシージャで非0を返すとキーを握りつぶす。
- 何もせずそのまま通過させるには、CallNextHookEx() の戻り値を返す。
- これはどこにも書かれていないが、0を返すと次以降のフックの起動を抑止できる。
高レベルフック
- 高レベルフックは大概、ターゲットプロセスのプロセス空間内で動く。
そのためフック本体はDLLとして実装することになる。
ここで、CallNextHookEx() の第一引数はフックハンドルである。
ということは、プロセス間でフックハンドルを共有する必要が出てくる。
プロセス側ではフックの存在など知る由もないので、
DLL側で何とかしなければならない。そこでよく使われるのが、
共有データセグメントに置いたグローバル変数に格納するというやり方。
- フックが実際に使われそうになるまで、
DLLはターゲットプロセスにアタッチされない。
また UnhookWindowsHookEx() しても、すぐにはデタッチされない。
デタッチされるのはフックがかかってないことがわかったとき。
(このへんは Advanced Windows 参照。たしかにそうだった。)
- WH_DEBUG のフックプロシージャで非0を返すと、
受け取ったフックの起動を抑止できる。性悪フックの排除に使える。
- NT系では idThreadInstaller を取得できない。必ず0になる。
[2006.1.23]
モドル