刚刚对ie的一点新体会

首先,很多人一看见explorer出错,就以为是ie挂掉了,这是不正确的。因为它们完全是两个东西,explorer是windows的shell
而ie的全称是internet explorer,是windows的一个组件。
这两个东西应该是毫不相干的,因为当你关闭shell进程的时候,ie依旧可以正常工作.
之前我是这样认为的,但是,刚刚感觉又有点不对.于是准备细心探查下ie的究竟.

好吧,我们来看看ie由哪几部分组成

首先我们得明白,ie是windows的一个组件,而不只是一个简单的exe.
最上层是IEXPLORE.exe,它在ie被装载的时候初始化。(有人可能就会问了,什么时候ie会被装载呢?不就是点击IEXPLORE.exe的时候吗?不只是!其他的情况后面再说。)这个可执行程序,使用其他的组件来实现导航,历史记录管理,收藏夹,html的解析和呈现,等等。它自身只是提供一个windows窗体和它的工具栏。Iiexplore直接调用下层的shdocvw.dll.

Shdocvw.dll,你可以把它看成就是一个dll宿主,它操控着下面的mshtml.dll(用来进行html的解析和呈现)以及其他的活动文档组件(Active Document component ),比如MS office,acrobat reader,这就是你为什么能在ie中直接打开doc和pdf文件.而Shdocvw.dll自身只提供浏览器的一些很基本功能,导航,链接置换,历史记录管理,收藏夹,等等.Shdocvw.dll其实也就是我们通常所说的浏览器控件.上面所说的链接置换(In-place linking)是指如果你点击一个链接,它会在当前窗口实例中打开该文档,而不是新建一个新的浏览器实例(如果我们只有mshtml控件,而没有它的话).

最后剩下Mshtml.dll,我想我不用说,大家也都知道它是做什么的了吧.

好,我们再来打开注册表来看下
来看下这个项
HKEY_CLASSES_ROOT\CLSID{871C5380-42A0-1069-A2EA-08002B30309D}
{871C5380-42A0-1069-A2EA-08002B30309D}是shell的一个命名空间(namespace),默认的打开方式是"C:\Program Files\Internet Explorer\iexplore.exe"
InProcServer32项下默认键值是%SystemRoot%\System32\shdocvw.dll
这说明shdocvw.dll的确是作为ie的ole宿主的形式的存在.
我们再来看ie的图标,是的,你可以在shell32.dll中找到它,可是系统默认的实际位置却在
%systemroot%\system32\shdoclc.dll中,那么shdoclc.dll是什么呢?打开查看一下,
Shell Doc Object and Control Library,仔细看下版本号,和我的ie的版本号是一样的,这说明它也是ie的一部分.经查阅,对于ie6它来自于安装文件的Ie_s2.cab\Ie_2.cab
那么shdoclc.dll中究竟有些什么呢?
如果你在了浏览器中输入about:
对,你将看见一个标题为"没有可以显示的页面"的错误页面出来.那么这个页面是从哪来的呢?
在这res://shdoclc.dll/navcancl.htm
类似,打开这个页面res://C:\WINNT\system32\shdoclc.dll/http_404.htm#http://www.someservername.com/nopagehere.htm
对,你会看见熟悉的404
来,再来看看这个
res://C:\WINDOWS\System32\shdoclc.dll/preview.dlg
对,打印预览功能.
当你打开一个ie窗口时,看它的标题栏,对,Microsoft Internet Explorer字样,它也存在这个dll中.
它是作为字符串资源存储的,名称为IDS_MESSAGE_BOX_TITLE,id为2213.
所以当你打开tencent的浏览器看看它的标题栏也就不足为奇了.
于是我们可以得知
"shdoclc component provides user interface (UI) for Shdocvw.dll."
shdoclc组件为Shdocvw.dll提供GUI显示功能.
好,我们再回过头来看Shdocvw.dll是做什么的.
我意外的在嵌入式xp的一片文档中看见了这样的说明.
Shdocvw component implements core Internet Explorer and shell browser frames.
嗯,这个答案的后半句是比较令我吃惊的.
我想知道,当我打开一个文件夹的时候,文件夹内内容的显示,这个功能是由哪个dll提供的.
我在MS的一篇KB中找到了这样一句话
"if you ...,Internet Explorer and Windows Explorer no longer work because they rely on the rendering engine in shdocvw.dll."

果然不出我所料,查得shell extensions也是由shdocvw作host.
这就是为什么在前面注册表中看见的
"InProcServer32项下默认键值是%SystemRoot%\System32\shdocvw.dll"
再查"我的电脑",{20D04FE0-3AEA-1069-A2D8-08002B30309D}
"InProcServer32项下默认键值是%SystemRoot%\System32\shell32.dll"
嗯,看来 shdocvw.dll只是掌管了一部分shell namespace.这其中包括Shell Automation Inproc Service,Toolbar Extension for Executable,搜索,帮助和支持...o,明白,它是做为主的ole容器,然后调用shell32.dll,然后由shell32.dll来完成这些功能.

好,我们再回过头来看,而shdocvw.dll的版本号是ie的版本号,也就是说ie已经是作为xp的shell的核心一部分而存在,是它在调用shell32.dll!

于是,如果ie发生安全性问题,并不是说换掉ie不用就可以了,firefox,Opera能帮助你浏览网页,但是却不能帮你来管理windows shell!

所以如果有谁再说ie是捆绑销售,那么真是无稽之谈了!
那么MS为什么要这么做呢?如果你看下Longhorn的构架,就一目了然了.这种思想,真的是要领先 xwindows很多年.

好了,可是问题也来了,最近MS迟迟不出ie的补丁,ie的漏洞满天飞,看看下面这个

<script> a = new Array(); while (1) { (a = new Array(a)).sort(); } </script>

一句代码就可以让你的ie缓存区溢出!
但愿它还不足以对你的windows shell造成影响

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥