我有一个NPAPI插件,它利用引擎盖下的SetWindowsHookEx
进行一些屏幕抓取。这个插件似乎在我测试过的大多数机器上都能成功运行。但是,在一台计算机(32位Windows 7)上,当我在Chrome(26.0.1410.43m)下运行插件时,对SetWindowsHookEx
的调用会破坏托管插件的进程。并不是SetWindowsHookEx
返回错误 - 它只会导致进程崩溃。而且,这只发生在一台机器上:它在我们测试的所有其他机器上都能正常工作。
但这是奇怪的事情。您可能知道,Chrome有几种查找插件的方法。通常,我们的setup.exe创建一些指向插件的注册表项,如此(来自NSIS安装程序):
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()
的调用会成功。
对于它的价值,这是实际的(漂亮的标准)电话:
// 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
看起来像这样:
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
中的断点似乎没有受到影响,因此我怀疑在设置挂钩期间发生了崩溃,而不是在其后续处理过程中发生。
答案 0 :(得分:0)
如果同一个DLL放在不同的目录中时表现不同,则表明这会改变插件加载的顺序。
( DLL加载的目录不会影响用于查找和加载其依赖项的搜索路径)
我当然会看看在同一系统上加载的其他插件,看看它们的存在是否触发(或者甚至可能导致)崩溃。
之后,我建议卸载并重新安装Chrome,可能在新目录中,以防其中一个Chrome二进制文件损坏或被破坏。
答案 1 :(得分:0)
原来这是一个积极的安全计划。显然它的启发式允许一些DLL通过而不允许其他人。一看到SetWindowsHookEx()
的电话,就会杀死托管进程。用合理的东西替换它可以解决问题。