2016-05-10 3 views
0

Я использую Detours в моем проекте, чтобы сохранить GL-контекст окна.Сбой при сбоях с wglMakeCurrent

Так я следовал примеру кода, который поставляется с Detours 3.0 Express Edition:

static BOOL (WINAPI * trueWglMakeCurrent)(HDC, HGLRC) = wglMakeCurrent; 
BOOL WINAPI hookedWglMakeCurrent(HDC hdc, HGLRC hglrc); 

BOOL WINAPI hookedWglMakeCurrent(HDC hdc, HGLRC hglrc) 
{ 
    wContext = hglrc; 
    wDC = hdc; 

    return trueWglMakeCurrent(hdc, hglrc); //CRASH HERE 
    //return TRUE; 
} 

Но он выходит из строя при вызове оригинального метода WGL. Если я изменю это, вернемся к return TRUE, это не сработает. Но это тоже ничего не изменит.

hdc и hglrc имеют действительные адреса, и они, вероятно, соответствуют GL-контексту, который мне нужен, поскольку это называется сразу после желаемого создания окна.

РЕДАКТИРОВАТЬ

Это не ломается при применении того же метода к другим OpenGL функций, например, SwapBuffers, glFinish и т. Д.

В случае изолированного теста, в котором я просто загружаю свою DLL и выполняю команду wglMakeCurrent, она работает.

В случае ввода моей DLL в приложение, а затем с использованием wglMakeCurrent в этом приложении, Detours вызывает бесконечную рекурсию по вызову trueWglMakeCurrent.

+0

Попробуйте запустить его под отладчиком и получить стек вызовов во время сбоя. Затем разместите стек вызовов здесь. –

+0

@MarcSherman Я проверил больше и узнал, что это действительно бесконечная рекурсия, которая вредит программному обеспечению. Взгляните на мой новый Edit – KuramaYoko

+0

. Я предполагаю, что ваш крючок вызывает бесконечную рекурсию, вызывая trueWglMakeCurrent. Разбор trueWglMakeCurrent (для ex в windbg 'uf trueWglMakeCurrent') должен показать JMP, чтобы подключитьWglMakeCurrent в качестве первой инструкции. Я считаю, что API-интерфейсы Detours, устанавливающий hook, также возвращает указатель на функцию, который ваш хук должен вызывать, когда он хочет вызвать реальную реализацию. –

ответ

0

Проблема заключалась в бесконечной рекурсии, вызванной неправильным связыванием функций.

Объяснение создает указатель на оригинал wglMakeCurrent, который в моем случае я хранил в trueWglMakeCurrent. Однако он работает только в том случае, если я объявляю его и использую его в том же файле, который имеет DLLMain и использование DetourAPI. Точно так же, как в примере:

static BOOL (WINAPI * trueWglMakeCurrent)(HDC,HGLRC) = wglMakeCurrent; 

GTNSPECTRA_C_EXPORT BOOL WINAPI hookedWglMakeCurrent(HDC hDC, HGLRC hRC) 
{ 
    ... 
    return trueWglMakeCurrent(hDC, hRC); 
} 

BOOL APIENTRY DllMain(HMODULE hModule, 
        DWORD reason, 
        LPVOID lpReserved) 
{ 
    ... 
    DetourRestoreAfterWith(); 

    DetourTransactionBegin(); 
    DetourUpdateThread(GetCurrentThread()); 
    DetourAttach(&(PVOID&)trueWglMakeCurrent, hookedWglMakeCurrent); 
    DetourTransactionCommit(); 

    ... 
    return TRUE; 
} 
Смежные вопросы