我用HOOK API技术实现了对MessageBox和TextOut以及BitBlt等函数都成功,但拦截Sleep函数时在执行UnhookWindowsHookEx时出现错误使程序异常退出,这是怎么回事是因为Sleep是kernel32.dll的内核函数吗还是另有原因,请哪位大侠给帮帮忙

解决方案 »

  1.   

    Sleep本身是阻塞的,具体为什么失败,应该得看Sleep函数里面是怎么实现的。
      

  2.   

    我又发现一些蛛丝马迹,我的挂钩程序没有问题是出在被挂程序上了.程序太多了我说一下原理吧:
    我的API HOOK是建立一个全局钩子在钩子处理程序中替换API函数的地址如果只替换MessageBox,TextOut,BitBlt等这些非kernel32.dll中的函数在挂钩程序退出时当前被挂程序得到焦点时就没有问题如果替换中加上Sleep函数在挂钩程序退出时,如果被挂程序不得到焦点就没事,一旦得到焦点就出现错误,看错误原因好像是钩子没有卸掉而钩子Dll已经释放导致调用错误,那么为什么有Sleep时,钩子就没卸掉呢?各位大侠们再分析分析,草民在这里谢过了!!!!
      

  3.   

    Kernel32中的API与其它动态库中的函数并没有什么区别,Kernel32中的函数很多都是能够在用户态正常运行的,包括 Sleep 在内
    另外你是在何时卸载钩子的,在 PROCESS_DETACH 的时候?
    你的 Sleep 钩子在原始 Sleep 的前后分别进行了什么处理?
      

  4.   

    我测试挂钩 Sleep 没有问题
    typedef void (WINAPI *SleepProc)(DWORD);
    SleepProc oSleep;
    void WINAPI _Sleep( DWORD dwMilliseconds )
    {
    AppendLog("截获调用前: Sleep(%u);\r\n", dwMilliseconds);
    oSleep(dwMilliseconds);
    AppendLog("截获调用后: Sleep(%u);\r\n", dwMilliseconds);
    }
    能够正常结束
    你所说的程序得到焦点是怎么一回事?
      

  5.   

    我也看了不少hook API的资料~~应该是可以hook到~你说在unhook时出错~而挂钩窗体没焦点就没事~
    这没遇到过~~应该可以解决吧~
    呵呵~~发代码给我看看 应该没问题的~    [email protected]
    你再看看sleep后面你做了什么~窗体做了什么~觉得就是那的问题~
      

  6.   

       TO:
          qrMs(空 气)
          楼主有问题你 写的没有?看看你怎么写的
    和楼主对比一下
          我
      

  7.   

    rageliu(我自横刀向天笑) 
    我发到你邮箱了,你看看是怎么回事吧!多谢了
      

  8.   

    UP.是的,就像要进行参数较正时,C编译器显得很无助.
      

  9.   

    我测试挂钩 Sleep 没有问题
    typedef void (WINAPI *SleepProc)(DWORD);
    SleepProc oSleep;
    void WINAPI _Sleep( DWORD dwMilliseconds )
    {
    AppendLog("截获调用前: Sleep(%u);\r\n", dwMilliseconds);
    oSleep(dwMilliseconds);
    AppendLog("截获调用后: Sleep(%u);\r\n", dwMilliseconds);
    }
    能够正常结束
    用这种方法处理GetTickCount()就不好使了,一挂程序就错误,别的有返回值的函数怎么没事如GetVersion()它的结构和GetTickCount()是一样的呀