Hook SetWindowLongW API - PullRequest
       2

Hook SetWindowLongW API

0 голосов
/ 29 января 2020

Вот так я запускаю ловушку

if (MH_CreateHookApiEx(L"user32", "SetWindowLongW", &MySetWindowLongW, (LPVOID*)&oSetWindowLongW, nullptr) != MH_OK)
    {
        std::cout << "MHook Fail To Install Hook." << std::endl;
        goto exit;
    }
    if (MH_EnableHook(&SetWindowLongW) != MH_OK)
    {
        std::cout << "MHook Fail To Enable Hook." << std::endl;
        goto exit;
    }
typedef LONG(WINAPI* _MySetWindowLongW)(HWND, int, LONG);
_MySetWindowLongW oSetWindowLongW = nullptr;

LONG MySetWindowLongW(
    HWND hWnd,
    int  nIndex,
    LONG dwNewLong
)
{
    return oSetWindowLongW(hWnd, nIndex, dwNewLong);
}

Работает ловушка, НО проблема в том, что после первого запуска c до MySetWindowLongW в Visual Studio я получаю has triggered a breakpoint. после функции fini sh.

Я думаю, что это стек или разговор. Я действительно не знаю.

Но я попробовал с CreateWindowExW, это работает нормально. Проблема только с SetWindowLongW.

1 Ответ

1 голос
/ 29 января 2020

Я не знаком с MinHook, но я понимаю, что он делает. Вот пара снимков в темноте:

Передача MySetWindowLongW в качестве функции обхода MH_CreateHookEx вместо &MySetWindowLongW. Это может или не может иметь значение. То есть:

if (MH_CreateHookApiEx(L"user32", "SetWindowLongW", MySetWindowLongW, (LPVOID*)&oSetWindowLongW, nullptr) != MH_OK)

Объявите и определите вашу функцию перехвата как stdcall, чтобы она соответствовала соглашению о вызовах перехватываемой вами функции

extern "C" LONG WINAPI MySetWindowLongW(
    HWND hWnd,
    int  nIndex,
    LONG dwNewLong) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...