2016-05-10 17 views
0

Ich verwende Umleitungen auf meinem Projekt, um den GL-Kontext eines Fensters zu speichern.Umwege stürzt mit wglMakeCurrent ab

So habe ich das Code-Beispiel gefolgt, die mit Detours 3.0 Express Edition kommt:

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; 
} 

Aber es stürzt ab, wenn die ursprüngliche WGL-Methode aufgerufen wird. Wenn ich diese Rückkehr zu return TRUE ändere, stürzt es nicht ab. Aber es wird offensichtlich auch nichts machen.

hdc und hglrc haben gültige Adressen und sie entsprechen wahrscheinlich dem GL Kontext, den ich brauche, da dies direkt nach der gewünschten Fenstererstellung aufgerufen wird.

EDIT

Es stürzt nicht, wenn die gleiche Methode auf andere OpenGL-Funktionen der Anwendung, z.B. SwapBuffers, glFinish usw.

Im Falle eines isolierten Tests, in dem ich einfach meine DLL lade und die wglMakeCurrent ausführe funktioniert es.

Im Falle der Injektion meiner DLL in eine Anwendung und dann wglMakeCurrent für diese Anwendung, verursacht Umleitungen eine unendliche Rekursion auf dem trueWglMakeCurrent Aufruf.

+0

Versuchen Sie es unter einem Debugger ausgeführt und einen Aufruf Stapel zum Zeitpunkt des Absturzes. Dann posten Sie den Call-Stack hier. –

+0

@MarcSherman Ich habe mehr getestet und herausgefunden, dass es wirklich eine unendliche Rekursion ist, die die Software zum Absturz bringt. Werfen Sie einen Blick auf meine neue Edit – KuramaYoko

+0

Meine Vermutung ist, dass Ihr Hook die unendliche Rekursion durch den Aufruf von TrueWglMakeCurrent verursacht. Das Zerlegen von trueWglMakeCurrent (für ex in windbg 'uf trueWglMakeCurrent') sollte einen JMP zu hookedWglMakeCurrent als die erste Anweisung anzeigen. Ich glaube, dass die Detours-API, die den Hook installiert, auch einen Funktionszeiger zurückgibt, den Ihr Hook aufrufen sollte, wenn er die echte Implementierung aufrufen möchte. –

Antwort

0

Das Problem war die unendliche Rekursion, die verursacht wurde, indem die Funktionen nicht ordnungsgemäß verknüpft wurden.

Umwege erstellt einen Funktionszeiger auf das Original wglMakeCurrent, die in meinem Fall ich in trueWglMakeCurrent gespeichert. Es funktioniert jedoch nur, wenn ich es deklariere und es für die gleiche Datei verwende, die die DLLMain und die DetourAPI-Verwendung hat. Genau wie im Beispiel:

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; 
}