压缩与反压缩之 COMPRESS 与 EXPAND
(注:本文被 Microsoft TechNet 中文速递邮件 2008 年 10 月收录为 MVP 推荐 Blog)
笔者前几天被一个看似简单的问题给问住了:我们知道,扩展名最后一位是下划线 _ 的文件是一种经过压缩的文件,必须通过 EXPAND 或 EXTRACT 命令将其还原。例如执行:EXPAND \i386\SHELL32.DL_ SHELL32.DLL 可以从 Windows 安装程序中将 SHELL32.DL_ 还原为 SHELL32.DLL。那么 EXPAND 命令的相反命令是什么呢?即如何将一个正常的文件压缩为扩展名的最后一位是下划线的这种格式呢?
这个问题最早是新闻组中的一位仁兄问起如何更换 Windows XP 的默认墙纸。众所周知,刚安装好的 Windows XP 默认使用的是那副曾经被人传说包含有“WHG KILL ME”惊天大秘密的蓝天白云墙纸 BLISS.JPG,BLISS.JPG 的源文件就是位于 i386 中的 BLISS.JP_。如果我们希望刚安装好的 Windows XP 使用另一副默认墙纸,应该如何将这张墙纸压缩为 BLISS.JP_ 并替换 i386 中的源文件呢?
除了这个问题,笔者前不久又看到了一家 OEM 厂商制作的 OEM 版 Windows 安装启动镜像,由于镜像中的安装源文件夹名称没有采用默认的文件夹名,必须要修改 TXTSETUP.SIF 中的字符串 SetupSourcePath 以重新指定安装源文件夹名,否则安装镜像将无法正常引导。笔者起初也不太清楚 OEM 厂商是如何将修改好的 TXTSETUP.SIF 重新压缩为 TXTSETUP.SI_ 并复制到 i386 文件夹中的。
经在线合作伙伴工程师马宁指点,EXPAND 的相反命令原来是 COMPRESS,这个命令包含在 Windows 2000/Server 2003 的 Resource Kit 中,需要从 Resource Kit 单独获取。COMPRESS 命令的用法与 EXPAND 基本相似,基本格式为:
COMPRESS 源文件名 目标文件名(例如 COMPRESS C:\Windows\system32\SHELL32.DLL D:\i386\SHELL32.DL_)
或者:
COMPRESS -R 源文件名
-R 是 COMPRESS 的基本参数,意为将源文件压缩并重命名为扩展名最后一位下划线的这种格式,使用它就可以不用再指定目标文件名了。
此外,COMPRESS 命令还有几个常用的参数:
-D:用于目标发生改变的文件;
-ZX:使用 Lempel-Ziv(LZX)压缩方式,可以将压缩包最多减小至 18% 的体积并将自解压速度提升至将近 50%;
-Z:使用 MS-ZIP 压缩方式,实际就是 .CAB 采用的压缩格式;
-ZQ [ N ]:N 是取值从 1 至 7 的数字,表示压缩比,例如 -ZQ5,其中 1 表示速度最快、7 表示压缩比最大,如果不指定这个参数,将使用默认的 LEVEL 4 中等级别。
为了证实上述问题,笔者对照那张 OEM 厂商制作的 OEM 启动镜像自制了一个 Windows XP SP3 的启动安装镜像,同样不采用默认源文件夹名称,而是将 TXTSETUP.SIF 中的 SetupSourcePath 修改后,使用 COMPRESS 将其压缩为 TXTSETUP.SI_ 并替换 i386 中的源文件;接着,笔者又将 Windows Vista 的 AURORA.JPG 极光墙纸重命名为 BLISS.JPG、使用 COMPRESS 压缩为 BLISS.JP_ 并替换 i386 中的源文件;最后,笔者还将 Windows XP SP3 的并发连接破解补丁与视觉样式破解补丁文件 TCPIP.SYS 与 UXTHEME.DLL 也使用 COMPRESS 压缩并替换 i386 中的源文件(关于并发连接破解补丁与视觉样式破解补丁可以参考笔者较早前的一篇博客《Windows XP SP3 版并发连接破解补丁与视觉样式破解补丁》)。
接下来笔者启动虚拟机,使用这份经过三处改动的启动安装镜像安装 Windows XP,整个安装过程没有任何错误,证明 Windows 安装程序可以正确识别并解压缩笔者用 COMPRESS 压缩的三个文件,预期的三个目的也全部实现了:1.根据 TXTSETUP.SIF 提供的信息在自定义的文件夹中找到安装程序源文件;2.安装好的 Windows XP 默认墙纸变成了 Windows Vista 的 Aurora 极光墙纸,尽管文件名依然还是 BLISS.JPG;3.安装好的 Windows XP 使用了经过破解的 TCPIP.SYS 与 UXTHEME.DLL,可以直接突破并发连接限制并使用第三方的视觉样式了。
总之,COMPRESS 与 EXPAND 就是一对压缩与解压缩孪生兄弟,一个可以方便修改 Windows 安装程序源、一个可以方便从 Windows 安装程序源提取文件。在没有安装其它第三方压缩软件的时候,COMPRESS 与 EXPAND 也可以实现一些简单的压缩与解压缩工作。