Detours与wglMakeCurrent崩溃

时间:2016-05-10 18:23:33

标签: winapi opengl detours

我在项目中使用Detours以保存窗口的GL上下文。

所以我遵循了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,则不会崩溃。但它显然也不会呈现任何东西。

hdchglrc具有有效地址,它们可能对应于我需要的GL上下文,因为这是在创建所需窗口后立即调用的。

修改

将相同的方法应用于其他OpenGL函数时不会崩溃,例如SwapBuffers,glFinish等

在隔离测试的情况下,我只需加载我的DLL并执行wglMakeCurrent即可。

如果将我的DLL注入应用程序然后在此应用程序上使用wglMakeCurrent,Detours会在trueWglMakeCurrent调用上导致无限递归。

1 个答案:

答案 0 :(得分:0)

问题是无法正确链接函数引起的无限递归。

Detours创建一个指向原始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;
 }