举个例子来说。假如你目前的Windows使用了一个版本号为5.1的系统文件System.dll,它放在Windows系统目录下的System目录中。你现在安装一个名为Winkiller的应用软件(呵呵,举例而已),但这个软件却要使用版本为3.0的System.dll系统文件,Winkiller的安装程序会把旧版本的System.dll拷贝到Windows系统目录下的System目录中,更有甚者安装程序根本就不理会新旧版本的系统文件而直接覆盖(很多游戏和不负责的应用软件都会这样做)。
系统文件被覆盖会有什么后果呢?很难说,如果够幸运,也许什么问题也不会出现;但大多数情况是在一些特定的时候让你的系统不稳定或干脆死机。这种情况用微软工程师的术语来说就是DLL Hell——Windows系统是以Dynamic Link Library(动态链接库)的方式让系统和应用软件共用所有的系统文件的,DLL Hell的意思就是因为系统文件被覆盖而让整个系统像是掉进了地狱一样,万劫不复。
OK,在你诅咒完微软之后,我们还是来看看微软在其新版的Windows Me中对这一情况的改进(或是补救)措施——System File Protection。
严格说来,System File Protection(系统文件保护,简称SFP)应该是System File Checker的加强版本。微软曾经在Windows 98 SE版中加入了自动检查系统文件状况的功能——System File Checker,但实际上,System File Checker并没有太大作用——如果真的有效,大概现在也就不会出现SFP了^_^。
SFP自Windows Me启动之后就实时检测系统文件,只要SFP发现系统文件将被覆盖或删除,它会“假装”准许用户或应用程序覆盖或删除系统文件,但实际上SFP会立即备份将被覆盖或删除的系统文件。只要用户或应用程序完成覆盖或删除的过程,SFP就会马上还原先前所备份下来的系统文件。
要达到上述的保护效果,SFP保存了两份清单。一份记录了所有被SFP保护的系统文件的名称,这份清单存放在C:WINDOWSSYSTEMsfpsfpdb.sfp中(假设Windows Me的安装目录为C:WINDOWS)。sfpdb.sfp是一个可读的文本文件,你可以使用“记事本”等工具打开;在sfpdb.sfp中,一整行记录就是一笔被保护的系统文件资料。
但是,只有sfpdb.sfp还是不够的——如果只有文本文件格式的sfpdb.sfp,任何人都可以自行篡改sfpdb.sfp的内容,如此的保护就等于没有保护了。因此微软又以“安全目录”的文件(后缀名为.cat)来存放这些被保护的数字签名,目前这些被保护的系统文件的数字签名都存放在C:WINDOWSSYSTEMCatRoot{F750E6C3-38EE-11D1-85E5-00C04FC295EE}SYSTEM.CAT中。你可以用鼠标双击SYSTEM.CAT文件,系统会弹出如图2的“安全目录”窗口,如果按下窗口右下角的“查看签名”按钮,就会出现如图3的“数字签名详细信息”窗口。
我们可以自行测试SFP的保护功能:首先浏览sfpdb.sfp的内容,找一个被SFP保护的系统文件,然后到存放该文件的目录去直接删除或者以其它文件覆盖。如果你还是对SFP功能有些不放心,那么可以将受保护的系统文件移到其它地方。
来看看一个试验的例子吧。我将C:WINDOWSSYSTEM MSRATING.DLL删除,结果在短短几秒之内,SFP便自动将它恢复了。整个过程中,你除了可以在“资源管理器”中直接观察测试结果外,也可以通过SFP的系统记录文件C:WINDOWSSYSTEMsfpsfplog.txt来查看SFP的运作过程。
SFP是否真的可以万无一失地保护用户不会掉进DLL Hell?这个问题其实应该从两个方面来说:首先,光靠SFP是无法完全解决DLL Hell的,SFP只是被动地防止系统文件被删除或覆盖(如同Windows 2000用Wondows File Protection来提供类似的功能);程序开发人员只有注意运用系统文件时所带来的问题,进而在开发软件时避免覆盖系统文件的操作,才能取得解决整个DLL Hell问题的双重保障。另外,在一些情况下,某些受保护的系统文件是SFP无法还原的,所以大家还是不能高枕无忧……