2008年11月3日月曜日

CallNextHookEx()のHHOOK引数

SetWindowsHookEx( WH_CBT, CBTProc, ... )でDLL injectionしています。このCBTProc()のドキュメントによると、正確な型宣言は

LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam );
です。そしてこのhookプロシージャの中ではnCodeが負のときはCallNextHookEx()を呼び更にその戻り値を返すこととあります。

さてCallNextHookEx()のドキュメントによると、正確な型宣言は
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam );
です。ちなみに記述が矛盾していて、CallNextHookEx()の呼び出しはoptionalだが、呼び出すことを強く推奨するそうです。CBTProc()側では負の時呼べばいいのに、こう書かれてしまうと0または正の時にも呼ばざるを得なくなります。仕方がないので呼ぶことにしましょう。

問題はここからです。CallNextHookEx()の第一引数hhk。hookプロシージャは進入した各プロセスで実行されます。にもかかわらずCBTProc()には存在しないパラメータが要求されています。とても面倒くさいですが、SetWindowsHookEx()の戻り値を共有メモリに格納しておき、それを読み出して使っていました。

ところが今日ふと気がついたら、
Windows NT/XP/2003: Ignored.
などと書かれているではありませんか。うーん…今まで共有メモリにわざわざ準備していたhhkは無駄でしたか…。

0 件のコメント: