不要删除"$hf_mig$"文件夹
基本上来说,现在微软Windows补丁包中的更新文件大致包含了两类。一类叫做GDR(普通分发版本),一类叫做QFE(快速修补工程更新)。其中,GDR文件经过了大量严格的测试,稳定性很高。而对QFE所做的测试相对则要相对少一些,所以稳定性亦要低一些。
所以,微软的补丁包也可以按此分为两类。一类就是安全修补程序,这类补丁包中同时包含了GDR和QFE版本的更新文件,也就是两个副本。微软的很多关键性安全补丁就属于此类。还有一类叫做修复程序,仅包含了QFE版的更新文件。常见的就是一些需要正版验证的补丁。
那么为什么安全修补程序要包含两种版本的文件呢?如果你要在系统中安装修复程序,也就是说要安装QFE更新文件。然而当前系统中需要被替换的文件为GDR版,而且版本号要比补丁包中的QFE文件版本号高,那么就不能用补丁包中的QFE文件来替换,而需要用与当前GDR文件版本相同的QFE文件来修补。那么到哪里取得这个文件呢?其实这个QFE文件在你以前安装GDR版更新文件(就是当前系统中使用的文件)时就已经被同时复制到了你的硬盘中。这就是安全修补程序需要同时包含GDR和QFE更新文件,且两类文件版本号都相同的原因。
以名为WindowsXP-KB896688-x86-CHS.exe的安全修补程序为例来说明,该补丁包需要更新MSHTML.DLL这个文件。如果安装程序检测到系统中当前的MSHTML.DLL为GDR版时,则会用补丁包中GDR版的MSHTML.DLL(文件说明为xpsp_sp2_gdr.051004-1415)来进行更新,并且把QFE版的MSHTML.DLL复制到"%windir%\$hf_mig$"这个文件夹。反之,如果安装程序检测到系统中当前的MSHTML.DLL为QFE版时,则会用补丁包中QFE版的MSHTML.DLL(文件说明为xpsp.051004-1419)来进行更新。两个文件的版本号都是6.00.2900.2769。
同时在注册表中也可以发现这个特点。在我的系统中反映为两个注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3\KB896688\Filelist\8和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3\KB896688\Filelist\50。两个项下的FileName字串值都是"MSHTML.DLL",而Location字串值分别为"C:\WINDOWS\system32"和"c:\windows\$hf_mig$\KB896688\SP2QFE",也就是分别存放GDR和QFE文件的位置。
如果你在安装了GDR版的KB896688补丁之后,又要重新安装一个需要把MSHTML.DLL更新为QFE版的修复程序。但是该修复程序中的MSHTML.DLL版本号比6.00.2900.2769要低,那么这时候更新程序就不会选取补丁包中的MSHTML.DLL来更新,而是到"%windir%\$hf_mig$"去找之前预留的QFE版MSHTML.DLL来更新。所以说一般最好不要轻易删除Windows目录下的"$hf_mig$"文件夹。
所以,微软的补丁包也可以按此分为两类。一类就是安全修补程序,这类补丁包中同时包含了GDR和QFE版本的更新文件,也就是两个副本。微软的很多关键性安全补丁就属于此类。还有一类叫做修复程序,仅包含了QFE版的更新文件。常见的就是一些需要正版验证的补丁。
那么为什么安全修补程序要包含两种版本的文件呢?如果你要在系统中安装修复程序,也就是说要安装QFE更新文件。然而当前系统中需要被替换的文件为GDR版,而且版本号要比补丁包中的QFE文件版本号高,那么就不能用补丁包中的QFE文件来替换,而需要用与当前GDR文件版本相同的QFE文件来修补。那么到哪里取得这个文件呢?其实这个QFE文件在你以前安装GDR版更新文件(就是当前系统中使用的文件)时就已经被同时复制到了你的硬盘中。这就是安全修补程序需要同时包含GDR和QFE更新文件,且两类文件版本号都相同的原因。
以名为WindowsXP-KB896688-x86-CHS.exe的安全修补程序为例来说明,该补丁包需要更新MSHTML.DLL这个文件。如果安装程序检测到系统中当前的MSHTML.DLL为GDR版时,则会用补丁包中GDR版的MSHTML.DLL(文件说明为xpsp_sp2_gdr.051004-1415)来进行更新,并且把QFE版的MSHTML.DLL复制到"%windir%\$hf_mig$"这个文件夹。反之,如果安装程序检测到系统中当前的MSHTML.DLL为QFE版时,则会用补丁包中QFE版的MSHTML.DLL(文件说明为xpsp.051004-1419)来进行更新。两个文件的版本号都是6.00.2900.2769。
同时在注册表中也可以发现这个特点。在我的系统中反映为两个注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3\KB896688\Filelist\8和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3\KB896688\Filelist\50。两个项下的FileName字串值都是"MSHTML.DLL",而Location字串值分别为"C:\WINDOWS\system32"和"c:\windows\$hf_mig$\KB896688\SP2QFE",也就是分别存放GDR和QFE文件的位置。
如果你在安装了GDR版的KB896688补丁之后,又要重新安装一个需要把MSHTML.DLL更新为QFE版的修复程序。但是该修复程序中的MSHTML.DLL版本号比6.00.2900.2769要低,那么这时候更新程序就不会选取补丁包中的MSHTML.DLL来更新,而是到"%windir%\$hf_mig$"去找之前预留的QFE版MSHTML.DLL来更新。所以说一般最好不要轻易删除Windows目录下的"$hf_mig$"文件夹。