DETOUR_TRAMPOLINE(FARPROC WINAPI MyGetProcAddress2( IN HMODULE hModule, IN LPCSTR lpProcName ), GetProcAddress);
FARPROC WINAPI MyGetProcAddress1( IN HMODULE hModule, IN LPCSTR lpProcName )
{
if(detr<100)
{
if (lstrcmpiA("Direct3DCreate9", lpProcName) == 0 )
return MyGetProcAddress2(hModule,"Direct3DCreate9" );
}
detr++;   //这是一个全局变量
return MyGetProcAddress2(hModule,lpProcName);
}
我使用detours已经成功拦截住了这个函数,目的是打算在里面比较字符串,如果是我想要的函数就改成我的。但是如果我把if(detr<100)这句话去掉(即每一次调用都比较字符串),程序就会出错。总之,它就是在我比较次数不多的时候可以正常运行。不知道这是为什么啊?

解决方案 »

  1.   

    MyGetProcAddress2怎么写的?估计是形成递归了。
      

  2.   

    if(detr <100) 的限制使得你的递归可以返回,否则就死掉了;加上 else return NULL 吧。
      

  3.   

    建议你看看本人的Detours文章中的第四部分:开发实例!http://blog.csdn.net/vcPlayer/archive/2008/07/20/2681758.aspx
      

  4.   

    MyGetProcAddress2保存的是原来函数的地址呀,我要是在函数中调用GetProcAddress才会行成递归啊。
    我要是把
    if(detr <100) 

    if (lstrcmpiA("Direct3DCreate9", lpProcName) == 0 ) 
    return MyGetProcAddress2(hModule,"Direct3DCreate9" ); 

    这去掉,程序也能正常运行啊。
      

  5.   

    补充一下,它是弹出一个框,说是内存不能为read之类的。
      

  6.   

    你先只Hook本进程,然后自己调用GetProcAddress(0, "Direct3DCreate9")用F11单步调试一下。