2016-05-10 3 views
0

ウィンドウのGLコンテキストを保存するために私のプロジェクトでDetoursを使用しています。迂回がwglMakeCurrentで発生する

だから私は迂回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作成に必要なものです。希望のウィンドウ作成の直後に呼び出されるためです。

EDIT

他のOpenGL関数に同じ方法を適用する場合は、例えば、クラッシュしませんSwapBuffers、glFinishなど。

私が単にDLLをロードし、wglMakeCurrentを実行する孤立したテストの場合、それは動作します。

私のDLLをアプリケーションに注入し、このアプリケーションでwglMakeCurrentを使用すると、呼び出しでDetoursが無限再帰を引き起こします。

+0

クラッシュ時にデバッガでコールスタックを実行してみます。次に、コールスタックをここに掲示します。 –

+0

@MarcSherman私はより多くのテストを行い、実際にソフトウェアをクラッシュさせている無限再帰であることを知りました。私の新しいEditを見てくださいEdit – KuramaYoko

+0

私の推測では、あなたのフックがtrueWglMakeCurrentを呼び出すことによって無限再帰を引き起こしていると思います。 trueWglMakeCurrentを逆アセンブルすると(例えばwindbg'uf trueWglMakeCurrent'の場合)、最初の命令としてhookedWglMakeCurrentにJMPが表示されます。私は、フックをインストールするDetours APIも実際の実装を呼び出すときにあなたのフックが呼び出すべき関数ポインタを返すと信じています。 –

答えて

0

問題は、関数を適切にリンクしないことによって引き起こされた無限再帰です。

私の場合はtrueWglMakeCurrentに格納された元のwglMakeCurrentへの関数ポインタを作成します。しかし、それは私がそれを宣言し、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; 
} 
関連する問題