如何更改我的 IE 扩展以解决导致 IE 崩溃的另一个模块 (flash.ocx) 中的访问冲突?

How to change my IE extension to resolve an Access Violation in another module (flash.ocx) crashing IE?

我有一个 Internet Explorer 扩展程序 (BHO),它在数千台机器上运行良好,但在某些情况下似乎会导致 Flash 因访问冲突而崩溃 iexplore.exe。我可以尝试做些什么来避免这种冲突?

更多详情:

在一个客户的环境中,我们遇到这样一种情况:在访问带有 Flash 的网站并关闭 IE 选项卡后,选项卡进程崩溃。只有在启用了 Flash 和我的扩展程序并且到目前为止无法在该公司环境之外的工作站上复制时才会发生这种情况。如果我的扩展被配置为在该页面上什么都不做,它仍然会发生 - 即我的一些代码仍然执行但很少。

如果该网站不在受信任的站点中,则该选项卡 运行 处于保护模式并且崩溃的结果是 window 表示该网页想要 运行 dw20.exe(即华生医生)

如果将网站添加到受信任的站点,则会将错误写入 windows 应用程序事件日志,并且 IE 会重新打开该选项卡,并显示一条小信息栏消息,说明 IE 已从崩溃中恢复。无论哪种方式都令人沮丧!用户真的不关心当他们关闭选项卡时进程是否崩溃,所以我很高兴有一个解决方法,这意味着不会向用户显示错误消息并且选项卡不会重新打开。

windows 应用程序事件日志并没有说明太多,但它确实表明 iexplore.exe 进程因故障模块闪存而崩溃:

Error / Application Error / EventID=1000

Faulting application name: iexplore.exe, version 9.0.8112.16592, time stamp 0x544e95a7
Faulting module name: Flash32_13_0_0_214.ocx, version 13.0.0.214, time stamp 0x5359c422
Exception code: 0xc0000005
Fault offset: 0x00073678
Faulting application start time: 0x01d0099db319df49
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe
Faulting module path: C:\Windows\system32\Macromed\Flash\Flash32_13_0_0_214.ocx
ReportId: 0094988b-7591-11e4-93e6-6cf0492a8610

这是一个相当新的 Flash 版本,但不是最新的。他们已尝试升级到最新版本,但出现了相同的症状。

他们的工作站安装了 Sophos 防病毒软件 运行ning,在极少数情况下,我们发现防病毒软件导致我们的扩展出现问题。我们在停止所有提到 Sophos 的 windows 服务后进行了测试,同样的问题发生了,所以我 相当 确定它与此无关。

我的扩展是使用 .NET 3.5 SP1 构建的,这不是实现它的理想方式,因为可能 运行 与其他扩展存在时间冲突,但目前是这样。

如果我禁用我的扩展程序,问题就会消失。如果我禁用 Flash,问题就会消失。故障模块 Flash32_13_0_0_214.ocx 强烈指出它是那里的一个错误,但我想理论上它可能是我的代码中的一个问题。我的扩展没有执行任何非托管代码,所以不可能,所以我想不出我的扩展可以做的任何可能导致 AccessViolation 的事情。这留下了 Flash 中出现错误的可能性,这似乎是完全可能的,或者我与 IE 中的 COM 对象交互的方式存在问题。然而,Flash 团队不太可能调查这样的错误报告,除非我可以指出一些具体的和可复制的东西,而现在我无法在任何开发机器上复制,所以这不是很好。即使它是 Flash 错误,从客户的角度来看,这与它是我产品中的错误没有什么不同:要么我修复它,要么我的产品将被卸载,他们将保留 Flash。

选项

我希望得到一些想法:

我可能需要一段时间才能与客户一起测试不同的选项,所以我想尝试一些事情。非常感谢任何想法。

到目前为止我有一些随机的想法。其中任何一个听起来值得一试?

更新

客户再次复制了问题,故障模块不是 Flash ocx,而是 jscript9.dll。他们还报告说在 ntdll.dll 上看到了同样的情况,尽管我自己还没有看到。

Faulting application name: iexplore.exe, version: 9.0.8112.16575, time stamp: 0x53ee1acb 
Faulting module name: jscript9.dll, version: 9.0.8112.16575, time stamp: 0x53ee1c49 
Exception code: 0xc0000005 
Fault offset: 0x00007264 
Faulting process id: 0x1bb4 
Faulting application start time: 0x01cfec57f247cb53 
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe 
Faulting module path: C:\Windows\System32\jscript9.dll 
Report Id: 50b58f63-584b-11e4-bc66-6cf0492a8610 
Faulting package full name: %14 
Faulting package-relative application ID: %15

所以我想这会导致与 Flash 无关...

问题是,使用 .Net,您几乎无法主动破坏内存。因此,除非您经常使用 Api 调用,否则很难确定是您代码中的某些内容导致了错误。

在我看来,重定位 dll 是最有前途的事情;不搞乱 GCC,似乎也是一个很好的选择(而且它总是,不仅在这种情况下)。

另一个问题是不是你的模块出错了,这是需要认真考虑的事情:不是你的代码试图到达由另一个 dll 分配的内存区域,而是他们的代码试图弄乱你的 dll 的内存 space.

最好的选择可能是 DW;通过让它保存转储,您可以遍历堆栈跟踪以找到导致问题的代码。再次回溯,可以找到某个参数变成垃圾的时刻。最后,你可以使用这个 https://msdn.microsoft.com/en-us/windows/hardware/hh852365 来实时调试崩溃。为什么这一切?好吧,因为如果你没有在你的 dll 中做任何奇怪的事情(比如手动 malloc'ing),在 .Net 中你不能以任何方式弄乱内存从而在另一个 dll 中导致 0x05; 99% 是这个具有特定配置的特定 IE 导致了一切,因此您最快的解决方案是调试,找到有问题的代码,然后压缩您拥有的所有信息并将其邮寄给 MS。