none
怎么退出阻塞的recv呢? RRS feed

  • 问题

  • 写了一个程序和一个dll,程序采用windows钩子的方式给IE注入dll, dll中调用了detours库进行api hook, 拦截IE的send和recv函数. 功能已经实现, 但是退出程序时, IE中的dll也随之卸载, 有时会造成IE的崩溃.
    经检查, 认为是recv阻塞造成的. 部分代码如下.

    //API hook 替换的函数
    int WINAPI RecvMonitor(SOCKET s, char* buf, int len, int flags)
    {
    ++g_nThread;
    int iRet = RealRecv(s, buf, len, flags);
    --g_nThread;

    // 一些分析代码
    // ...

    return iRet;
    }

    //UnHook时会导致DLL卸载
    case DLL_PROCESS_DETACH:
    {
    if (g_bMonitor)
    {
    // 用临界区防止新开启了其他的send或recv线程
    EnterCriticalSection(&g_cs);
    // 这里检查g_nThread的值, 实际情况是, 如果为0, 则不会崩溃, 如果不为0, 则会崩溃.
    // 但是当g_nThread不为0时等待g_nThread为0, 却不会成功, 并且会造成IE一直无响应
    for (;;)
    {
    if (g_nThread == 0)
    break;
    }

    // 将API hook还原, 即IE会直接进入RealRecv, 而不再进入RecvMonitor.
    UnMonitorSocket();

    LeaveCriticalSection(&g_cs);
    }
    }

    请问各位高手, 有什么好的解决方法么?(理想情况是顺利卸载dll, 而IE也能继续正常运行)
    2009年10月10日 3:29

答案