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!
Re: Hook на WndProc
От: a-lex Россия  
Дата: 05.12.03 08:34
Оценка:
Здравствуйте, pk_sly, Вы писали:
[]
_>Проблема ещё в том, что во всех БЕЗ ИСКЛЮЧЕНИЯ примерах, которые я нашёл, threadId указывается 0. Мне этого не надо — хук должен быть привязан к thread'у и, судя по документации, для WH_CALLWNDPROC это сделать можно.

Тогда указывайте NULL вместо hDLL.

hMod
Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process



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


С помощью .def-файла можно заставить функцию экспортироваться под любым нужным Вам именем. В MSDN это описывается в отдельной статье, а в примерах просто эти детали опущены.

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

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

Нет. Просто в этом случае процедура обязана располагаться в DLL. Если же Вы ставите хук только для собственного процесса, Вам DLL не нужна (в качестве хук-процедуры можно использовать обычную функцию).

_>Как тогда понимать, что в противоположном случае, указатель должен указывать на область памяти текущего процесса? Что, загруженная и проинициализированная DLL — не в области памяти процесса?


Конечно, в области. Имеется в виду, что подходит любой код текущего процесса, а не только располагающийся в DLL.
Re[2]: Hook на WndProc
От: PK Sly http://www.vocord.ru/
Дата: 05.12.03 08:40
Оценка:
Здравствуйте, a-lex, Вы писали:

AL>Тогда указывайте NULL вместо hDLL.


Внимательнее, пожалуйста.
1. Thread, на который я ставлю hook — не в моём процессе.
2. hook мне нужен не глобальный, а на определённый thread
поэтому необходимо указывать все параметры.
VAX/VMS rulez!
Re[3]: Hook на WndProc
От: a-lex Россия  
Дата: 05.12.03 13:00
Оценка:
Здравствуйте, PK Sly, Вы писали:

[]

PS>1. Thread, на который я ставлю hook — не в моём процессе.

Извините, упустил из вида.

[]

Действительно ли threadId соответствует живой GUIшной нити? Вроде как больше не про что ему invalid parameter говорить...
Re[4]: Hook на WndProc
От: PK Sly http://www.vocord.ru/
Дата: 05.12.03 13:40
Оценка:
AL>Действительно ли threadId соответствует живой GUIшной нити? Вроде как больше не про что ему invalid parameter говорить...

скорее всего, thread уже есть, но ещё не запущен.
VAX/VMS rulez!
Re[5]: Hook на WndProc
От: a-lex Россия  
Дата: 05.12.03 14:45
Оценка:
Здравствуйте, PK Sly, Вы писали:
[]
PS>скорее всего, thread уже есть, но ещё не запущен.

Ага! Вероятно, в этом и причина. Если мне не изменяет память, хуку для установки нужна message queue целевого потока.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.