У меня есть приложение, состоящее из одного EXE и нескольких DLL. Прочитав Windows через C / C ++, я пытаюсь выполнить перехват функции Sleep
в одной из DLL , и ожидается, что ловушка будет работать как с EXE, так и со всеми библиотеками DLL. Обратите внимание, что код CAPIHook
получается из Windows через образец кода C / C ++
В проекте DLL
void WINAPI MySleep( DWORD dwMilliseconds );
CAPIHook g_Sleep("Kernel32.dll", "Sleep", (PROC)MySleep);
typedef void (WINAPI *Sleep_Type)( DWORD dwMilliseconds );
// Hook function.
void WINAPI MySleep( DWORD dwMilliseconds )
{
printf ("-------> In MySleep\n");
((Sleep_Type)(PROC)g_Sleep)(dwMilliseconds);
}
// This is an example of an exported function.
DLL_API int dll_function_which_is_going_to_call_sleep(void)
{
printf ("DLL function being called\n");
printf ("Call Sleep in DLL function\n");
Sleep(100);
return 42;
}
В проекте EXE
void CexeDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
printf ("Button being clicked\n");
printf ("Call Sleep in EXE function\n");
Sleep(100);
dll_function_which_is_going_to_call_sleep();
printf ("Call Sleep in EXE function\n");
Sleep(100);
dll_function_which_is_going_to_call_sleep();
}
Это результат, который я получаю
Button being clicked
Call Sleep in EXE function
-------> In MySleep
DLL function being called
Call Sleep in DLL function
Call Sleep in EXE function
-------> In MySleep
DLL function being called
Call Sleep in DLL function
Меня удивляет то, что я ожидаю, что CAPIHook
вступит в силу для всего одного процесса. Поскольку EXE и DLL принадлежат одному процессу, оба должны иметь доступ к MySleep
. Однако, по моим наблюдениям, MySleep
достигает только вызов из EXE, но не DLL.
Я нахожу здесь образец кода CAPIHook -doesnt-have-effect-in-entire-process.zip, он содержит проекты dll
и exe
.
Однажды я также заменил CHookAPI
кодом в apihijack. Та же проблема все еще возникает. Эффект зацепления не распространяется на весь процесс.
Я что-то упустил? Пожалуйста, не предлагайте мне использовать EasyHook, Detours, ..., так как я просто хочу знать, почему приведенный выше код не работает и как я могу это исправить.