首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetWindowsHookEx崩溃

SetWindowsHookEx崩溃
EN

Stack Overflow用户
提问于 2013-04-02 07:59:29
回答 2查看 1.2K关注 0票数 0

我有一个NPAPI插件,它利用幕后的SetWindowsHookEx来做一些屏幕抓取。这个插件似乎可以在我测试过的大多数机器上成功运行。然而,在一台机器(32位Windows7)上,当我在Chrome (26.0.1410.43m)下运行插件时,对SetWindowsHookEx的调用导致托管插件的进程崩溃。这并不是说SetWindowsHookEx返回了一个错误--它只是使进程崩溃。同样,这只发生在一台机器上:它在我们测试过的所有其他机器上都工作得很好。

但奇怪的是。正如你可能知道的,Chrome有几种定位插件的方法。通常,我们的setup.exe会创建一些指向插件的注册表项,如下所示(从NSIS安装程序):

代码语言:javascript
复制
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\" "Path" "$INSTDIR\npWinVnc.dll"
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\" "ProductName" "Alanta Remote Desktop Server"
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes\application/x-alanta-vnc" "Description" "Alanta's VNC Server NPAPI Plugin"

当Chrome从该位置加载插件时,它会在SetWindowsHookEx调用时崩溃。

但是,如果我卸载了这个插件,然后将完全相同的DLL复制到%ProgramFiles%\Mozilla Firefox\Plugins\,那么Chrome就可以很好地加载和运行该插件,而且对SetWindowsHookEx()的调用也会成功。

这里是实际的(相当于沼泽标准的)调用:

代码语言:javascript
复制
// Add the CallWnd hook
hCallWndHook = SetWindowsHookEx(
                WH_CALLWNDPROC,                 // Hook in before msg reaches app
                (HOOKPROC) CallWndProc,         // Hook procedure
                hInstance,                      // This DLL instance
                0L                              // Hook in to all apps
               //   GetCurrentThreadId()            // DEBUG : HOOK ONLY WinVNC
                );

调试器指示所有参数都指向合法、有效的内容。

对这个问题有什么建议吗?有没有人注意到在这种情况下SetWindowsHookEx中可能会出现的任何奇怪之处?

编辑:CallWndProc如下所示:

代码语言:javascript
复制
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  // Do we have to handle this message?
  if (nCode == HC_ACTION)
  {
      // Process the hook if the WinVNC thread ID is valid
      if (vnc_thread_id)
      {
          CWPSTRUCT *cwpStruct = (CWPSTRUCT *) lParam;
          HookHandle(cwpStruct->message, cwpStruct->hwnd, cwpStruct->wParam, cwpStruct->lParam);
      }
  }

   // Call the next handler in the chain
   return CallNextHookEx (hCallWndHook, nCode, wParam, lParam);
}

CallWndProc中的断点似乎没有命中,所以我怀疑崩溃是在钩子的设置过程中发生的,而不是在以后的处理过程中。

EN

回答 2

Stack Overflow用户

发布于 2013-04-02 08:23:14

如果相同的DLL放在不同的目录中时表现不同,则表明这改变了插件的加载顺序。

( DLL从其中加载的目录不影响用于查找和加载其依赖项的搜索路径)

我当然会看看在同一系统上加载的其他插件,看看它们的存在是否会触发(或者甚至是导致)您的崩溃。

在那之后,我建议卸载并重新安装Chrome,可能是在一个新的目录下,以防其中一个Chrome二进制文件被破坏或破坏。

票数 0
EN

Stack Overflow用户

发布于 2013-04-02 12:22:33

事实证明这是一个激进的安全程序。显然,它的启发式允许一些DLL通过,而不允许其他DLL通过。当它看到对SetWindowsHookEx()的调用时,它立即终止了宿主进程。用一些合理的东西替换它解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15753911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档