删除Win7镜像中ei.cfg以达到选择操作系统的目的(偏执的完美主义版)

这篇文章讲的并不是有关删除ei.cfg这个文件就能选择安装的操作系统这一知识——delete键在哪里这种事情按说是不用教的。

通常情况下,我使用U盘安装系统,也就是把sources目录拷贝到U盘中,至于ei.cfg文件,直接按delete键就ok了。

但是在某些情况下必须用光盘——给Mac装系统的时候。去年某飞临走时需要把他Mac上的win7换成家庭高级版(出国装个盗版的旗舰版win7太高调)。那么需要在光盘镜像里删掉这个文件,这就稍微有点麻烦——我们需要用ultraiso之类的镜像编辑软件把这个文件删除,然后保存一个新镜像刻盘。嗯,广大群众都是这么做的。

但是作为一个处女座程序员。。。。。。。。我表示不能忍受为了删一个文件就要重新往硬盘里写3个G的文件!!!!!!!!!!并且这样出来的文件已经“不再是msdn原始档”,说不定ultraiso往里面留下点什么呢。(事实上,某飞也不能忍受,他最后宁愿从msdn上重新下个原版的家庭高级版镜像。)

能不能直接对ISO文件做个小patch来达到这一目的?当年我们修改试用版的VS2008和VS2010就是直接把新的序列号替换进去的。嗯,可以试一试。。

于是用虚拟光驱加载ISO,用WinHex打开光盘,找到sources目录表,往下翻到ei.cfg,记下在整个磁盘上的偏移。卸载虚拟光驱,winhex打开iso文件,找到这里,把ei.cfg这个文件名改掉一个字符。满怀信心地重新加载,结果发现sources目录只剩下200M,最后一个文件名叫du.dll,看来加载到这里的时候哪里坏掉了。

果然不能投机取巧,下面是技术探讨的正文。

win7-1

以中文x86带sp1版win7镜像为例。如图选中的一段为一条文件记录。为什么这样断句呢,因为目录表的起始扇区也是以00 01 02 00开始的,经常做结构探索的应该有这种直觉的断句方法。

查阅UDF与ECMA 167白皮书,可以找到这个数据的前16字节为Descriptor Tag结构,如下(ECMA 167 3/7.2)。

RBP Length Name Contents
0 2 Tag Identifier Uint16 (1/7.1.3)
2 2 Descriptor Version Uint16 (1/7.1.3)
4 1 Tag Checksum Uint8 (1/7.1.1)
5 1 Reserved #00 byte
6 2 Tag Serial Number Uint16 (1/7.1.3)
8 2 Descriptor CRC Uint16 (1/7.1.3)
10 2 Descriptor CRC Length Uint16 (1/7.1.3)
12 4 Tag Location Uint32 (1/7.1.5)

在这里Tag Identifier等于0x0101即257,查阅ECMA 167 4/7.2.1可知对应的是File Identifier Descriptor结构,翻到ECMA 167 4/14.4章节可找到该结构,如下。

RBP Length Name Contents
0 16 Descriptor Tag tag (4/7.2)(Tag=257)
16 2 File Version Number Uint16 (1/7.1.3)
18 1 File Characteristics Uint8 (1/7.1.1)
19 1 Length of File Identifier (=L_FI) Uint8 (1/7.1.1)
20 16 ICB long_ad (4/14.14.2)
36 2 Length of Implementation Use (=L_IU) Uint16 (1/7.1.3)
38 L_IU Implementation Use bytes
[L_IU+38] L_FI File Identifier d-characters (1/7.2)
[L_FI+L_IU+38] * Padding bytes

该章节中对File Characteristics描述有当该字段设置第2个bit位时代表该文件被删除。太好了,将这个位置的数据改为4,而不需要动下面的文件名了。

刚刚我们改文件名失败的原因相信在上面的结构描述中已经能找到答案:Descriptor Tag结构中有对数据的CRC校验,所以我们刚才直接改文件名就相当于破坏了光盘的结构。经测验,这里的CRC16采用的是XModem算法。http://www.lammertbies.nl/comm/info/crc-calculation.html这个地址可以在线计算各种算法的CRC。我们将修改后的上图0x9d418到0x9d43b共0x24个字节重新计算CRC,结果为0x942e,将这个结果填入0x9d410处。

最后需要计算Tag中除了偏移4以外的15个字节的checksum填入偏移4处,这个用Windows计算器就能算好,改为F4。

这样就改好了。如下图,一共修改了4个字节。

win7-2

保存加载虚拟光驱,成功。

 

参考文献:

Universal Disk Format Specification Revision 2.60  http://www.osta.org/specs/

Standard ECMA-167  http://www.ecma-international.org/publications/standards/Ecma-167.htm

3 Replies to “删除Win7镜像中ei.cfg以达到选择操作系统的目的(偏执的完美主义版)”

    1. 哈?搞定啥?我只是偶尔想到这个历史遗留问题就把它处理了而已,某小孩的macbook我有点不敢搞。。。

Leave a Reply

Your email address will not be published. Required fields are marked *