这几天Green Browser一直不老实工作,只要我点下载或另存文件就异常退出,升级成最新版本问题也没能解决。然后检查IE8,同样会出异常退出,看来是IE8的问题。
先禁掉可疑add-on插件,问题照旧,还是不能下载任何文件。启动IE8 w/o add-on模式,问题还是存在,这下快轮到我崩溃了。
调用Visutal Studio分析,发现问题在Wpc.dll模块中,stack trace如下:
Wpc.dll!WPCSecurity::CheckSID() + 0x1d bytes
Wpc.dll!CWpcSettings::Initialize() + 0x11 bytes
Wpc.dll!CWebSettings::Initialize() + 0x3a bytes
Wpc.dll!CWindowsParentalControls::GetWebSettings() + 0x68 bytes
> ieframe.dll!InitWPCSettings() + 0xeb bytes
ieframe.dll!CheckFileDownloadSettings() + 0x26 bytes
ieframe.dll!CDocObjectHost::CDOHBindStatusCallback::_ProcessCONTENTDISPOSITIONBindStatus() + 0x11d bytes
ieframe.dll!CDocObjectHost::CDOHBindStatusCallback::_ProcessSecurityBindStatus() + 0x7a6f0 bytes
ieframe.dll!CDocObjectHost::CDOHBindStatusCallback::OnProgress() - 0x15 bytes
urlmon.dll!CBSCHolder::OnProgress() + 0x40 bytes
urlmon.dll!CBinding::CallOnProgress() + 0x31 bytes
urlmon.dll!CBinding::OnTransNotification() + 0xfb50 bytes
urlmon.dll!CBinding::ReportProgress() + 0x2c bytes
urlmon.dll!COInetProt::ReportProgress() + 0x58 bytes
urlmon.dll!CTransaction::DispatchReport() - 0xa bytes
urlmon.dll!CTransaction::DispatchPacket() + 0x31 bytes
urlmon.dll!CTransaction::OnINetCallback() + 0x83 bytes
urlmon.dll!TransactionWndProc() + 0x28 bytes
user32.dll!_InternalCallWinProc@20() + 0x23 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xd3 bytes
user32.dll!_DispatchMessageWorker@8() + 0xee bytes
user32.dll!_DispatchMessageW@4() + 0xf bytes
ieframe.dll!CTabWindow::_TabWindowThreadProc() - 0x32182 bytes
ieframe.dll!LCIETab_ThreadProc() + 0x4433 bytes
iertutil.dll!CIsoScope::RegisterThread() - 0x3227 bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x23 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
ieframe.dll!InitWPCSettings() 尝试加载Wpc.dll,然后在Wpc中发生异常。Wpc.dll是处理Parental Controls的模块,对此了解不多,网上也没有多少介绍。
先找到我上次做的系统备份,是一个月前做的,竟然没找到这个文件,于是揣测是近期新装的程序或Windows update安装的。但到底是什么软件还很难去定位。
c:\Windows\SysWOW64>dir Wpc.dll
2009/07/14 09:16 308,736 Wpc.dll
c:\Windows\SysWOW64>dumpbin /headers wpc.dll |grep version
9.00 linker version
6.01 operating system version
6.01 image version
6.01 subsystem version
0 Win32 version
查看PE文件头,OS竟是6.1,资源中的版本号是1.0.0.1。这里要注意一点:Windows 6.1是Windows 7,Microsoft比较搞笑。我当前的系统是Windows Server 2008 AMD64,是Windows 6.0,就试着用另一台Visata AMD64的Wpc.dll替代这个,结果竟然正常运行。看来IE8 crash是这个Wpc.dll的问题。
再检查一下Vista系统的Wpc.dll
C:\Windows\SysWOW64>dir Wpc.dll
2008/01/21 10:51 296,960 Wpc.dll
C:\Windows\SysWOW64>dumpbin /headers Wpc.dll | grep -i version
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
8.00 linker version
6.00 operating system version
6.00 image version
6.00 subsystem version
0 Win32 version
Vista系统的Wpc.dll资源中的版本号也是1.0.0.1。看来二者是用同一source code分别针对Vista和Win7做的不同的编译。
同时将本系统的64位Wpc.dll恢复成Vista系统的,至此Green Browser/IE8下载又正常工作了。
今天找到原因,Wpc.dll文件来源于Windows games explorer (http://www.win2008workstation.com/forum/viewtopic.php?f=25&t=927).
我很喜欢Vista上的Tinker游戏,相当有趣。曾想过办法在Server 2008 X64上运行。为此之间安装过games explorer,但没能成功。在清除/卸载时没清理彻底,致使IE8无辜受累。之所以没早发现,大概因为工作忙没上网下载,还有这阵子基本在用Firefox和Chrome。
既然Server 2008不能很好地支持Win7的DLL,就用Vista系统的替换掉games explorer包中其它的DLL文件后,Think游戏竞然能运行了。呵呵,这下空闲的时候有得玩了。