被调用的功能没有被调用

时间:2013-06-12 20:04:12

标签: c++ detours

我正在使用带有CDetour的visual studio 2003 这次我不能给SSCE所以这就是我所做的:

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;

CDetour CreateDevice_Det;
IDirect3D9* Direct3DCreate9_Hook( UINT SDKVersion )
{
        MessageBox( GetForegroundWindow(), "Direct9 Create Hooked", "dForce.dll", MB_OK );
        d3d = Direct3DCreate9(D3D_SDK_VERSION);
        return d3d;
}

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
    switch(reason)
    {
        case DLL_PROCESS_ATTACH:
        {
            HMODULE hd3d = GetModuleHandle( "d3d9.dll" );
            if( hd3d == 0 )
            {
                MessageBox( GetForegroundWindow(), "d3d9.dll still not loaded", "dForce.dll", MB_ICONSTOP );
                return FALSE;
            }
            DWORD lpAddr = (DWORD)GetProcAddress( hd3d, "Direct3DCreate9" );
            if( lpAddr == 0 )
            {
                MessageBox( GetForegroundWindow(), "could not find valid d3d9.dll create device address", "dForce.dll", MB_ICONSTOP );
                return FALSE;
            }
            CreateDevice_Det.Detour( (LPBYTE)lpAddr, (LPBYTE)Direct3DCreate9_Hook );
            CString strDetoured;
            strDetoured.Format( "CreateDevice Hooked! Address: %x", (LPVOID)lpAddr );
            MessageBox( GetForegroundWindow(), strDetoured, "dFoce.dll", MB_ICONINFORMATION );
        }break;
    }
    return TRUE;
}

我已经用同样的方式挂钩了LoadLibrary(来自kernel32.dll)等其他函数,这个dll当然是在主程序的Direct3DCreate9之前加载的,我也试过这个一个控制台wi32程序,但仍然没有调用我的钩子函数。我错过了什么吗?

编辑

显然CDetour根本与MS Detours无关(发现它在谷歌上绕道而行。)

2 个答案:

答案 0 :(得分:1)

我在这里看不到detourTransactionBegin(),DetourUpdateThread()和DetourTransactioncommit()。 API Hooking with MS Detours有一个很好的解释。

答案 1 :(得分:0)

在你CreateDevice_Det.Detour( ...)之后你必须应用绕行,它不是自动的。 CreateDevice_Det.Apply()