Задача: мне надо поставить 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++' — ПК
Здравствуйте, 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.