Hook на WndProc
От: pk_sly http://www.vocord.ru/
Дата: 05.12.03 07:50
Оценка:
Задача: мне надо поставить hook на WndProc другому процессу, причём определённому thread'у.

Решение: написал DLL со своей функцией для перехватчика, вызываю
 hDLL = LoadLibrary("mydll.dll");
 pFn = (HOOKPROC)GetProcAddress(hDLL, "_func@12");
 SetWindowsHookEx(WH_CALLWNDPROC, pFn, hDLL, threadId);

возвращает Invalid Parameter

Проблема ещё в том, что во всех БЕЗ ИСКЛЮЧЕНИЯ примерах, которые я нашёл, threadId указывается 0. Мне этого не надо — хук должен быть привязан к thread'у и, судя по документации, для WH_CALLWNDPROC это сделать можно.

Далее. Во всех БЕЗ ИСКЛЮЧЕНИЯ примерах GetProcAddress искал функцию по имени "func". Но позвольте, это же не переменная! Если функция — cdecl, то её имя в DLL будет "_func", если функция — stdcall (это — как раз, наш случай), то "_func@12". Либо я чего-то не понимаю, либо все до одного примеры — нерабочие.

Далее. Параметр pFn довольно загадочно описан в MSDN:

lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.


Когда это — указатель на функцию в текущем процессе, вопросов нет.
Но что означает "указывать на процедуру перехвата в DLL"???
Это что, смещение относительно начала файла? RVA?
Или, учитывая, что экземпляр этой DLL загружен в память, это должен быть указатель на область памяти, в которую загружена DLL?
Как тогда понимать, что в противоположном случае, указатель должен указывать на область памяти текущего процесса? Что, загруженная и проинициализированная DLL — не в области памяти процесса?
Бред какой-то.

Буду очень благодарен за разъяснения по этим вопросам.

05.12.03 11:46: Перенесено модератором из 'C/C++' — ПК
VAX/VMS rulez!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.