关于安装配置文件 txtsetup.sif,这里先做一个简明说明。该文件在 Windows PE 构建过程中扮演着关键角色,它决定了系统内核如何加载驱动程序、如何映射文件,是 PE 系统正常启动的基础。
其中 [WinntDirectories] 字段使用代码表示文件拷贝的目标文件夹,根目录就是 %WinDir%,即安装时指定的 Windows 目录。[SourceDiskFiles] 则根据前面设定的代码,明确文件拷贝的具体细节。而下面三段是集成 SATA/SCSI 等驱动时的核心配置:
[HardwareIdsDatebase]—— 硬件标识[SCSI.load]—— SCSI 驱动加载[SCSI]—— SCSI 设备说明
添加 SRS 驱动实例:在 WinPE 系统中添加 SATA/RAID 驱动的方法
这里以 Intel Matrix Storage Manager driver 为例进行说明。需要提醒的是,以下描述的驱动文件名仅基于本实例,实际操作中的具体文件名应以需要添加的具体驱动为准。
1. 准备材料
- 原版 SATA 驱动文件
- 从 WinPE 中提取的
txtsetup.sif文件
2. 从 WinPE 中提取 txtsetup.sif 文件
先将 WinPE 中的 winpe.is_ 重命名为 winpe.cab,然后用 WinRAR 解压出 winpe.iso。使用 UltraISO 打开它,将 txtsetup.sif 提取出来,并用记事本打开备用。
3. 修改 txtsetup.sif 文件
- 打开 SATA 驱动包,里面有一个扩展名为
.inf或.oem的小文件,比如oemsetup.inf或txtsetup.oem(本例中为txtsetup.oem),用记事本打开备用。 - 在
txtsetup.sif中查找[SourceDisksFiles]字段,在其下添加:iaStor.sys=1,,,,,,4_,4,1,,,1,4 - 查找
[SCSI.Load]字段,在其下添加:iaStor=iaStor.sys,4 - 切换到刚才打开的
txtsetup.oem,查找HardwareIds关键字,将该字段下的代码全部拷贝到txtsetup.sif文件的[HardwareIdsDatabase]字段末尾。但需要注意更改代码的格式,例如将id = "PCI\VEN_8086 DEV_27C3 CC_0104","iaStor"改为PCI\VEN_8086 DEV_27C3 CC_0104=iaStor - 查找
[SCSI]字段,在其下添加:iaStor="Intel(R) 82801FBM SATA AHCI Controller (Mobile ICH6M)"
至此,修改 txtsetup.sif 文件部分完成,将修改后的 sif 文件替换原来的文件。
4. 复制 SATA 驱动文件
将 SATA 驱动文件 iaStor.sys 用 makecab.exe 压缩成 iaStor.sy_,并添加到 WinPE 的 system32\DRIVERS 目录下。然后将修改后的 winpe.iso 用 makecab.exe 重新压缩成 winpe.is_,替换原来的文件。至此,整个添加 SATA 驱动工作完成,重启测试即可验证。
整个过程中,最麻烦的就是更新或添加 SATA 驱动时,新驱动中删除了对老硬件的支持,或者硬件代码有所改变。这时就需要对照 txtsetup.sif 文件手动修改:新驱动删除的硬件 ID,就不能让 txtsetup.sif 中还有相关配置;或者保留老驱动文件,为了对老爷机更好的支持,就必须让 txtsetup.sif 硬件 ID 指向老驱动文件。而新 SATA 驱动带来的新硬件 ID,则需要自己手动添加进去。这里存在老驱动文件和新驱动文件的硬件 ID 重复问题,这也是工作量最大的地方。通常的做法是把老驱动文件重新命名保存,然后找到硬件 ID 重复的记录,优先让它指向新驱动;而对于新驱动中删除的硬件 ID,就改成指向老驱动文件。一定要细心,否则出错的概率相当大。
回顾以往,在制作“开始懂了”WinPE 奥运纪念正式版时,曾经从 MSDN 原版的 I386 文件和深度 WINXP_SP3 9.0 的 I386 文件中提取相关内核驱动,但遇到了容量问题——如果照这样做出来,内核文件会非常大,直接影响 WinPE 的加载速度,于是放弃了这个方案。随后研究了老毛桃 911 版本的内核驱动及各网友提供的 WinPE 版本,结果却有些失望:各网友的 WinPE 版本都是用 911 的内核,甚至根本没有变化,还是 2007 年的驱动。后来找到深度 R 大的 ZPE 系列驱动,发现此人做的驱动精简了 911,而且在一些位置上做了修正,并添加了一些新的,他的思路给了很好的启发。于是把 911 内核提取出来,先修正了内核中错误的地方,然后手动添加了 INTEL 最新的南桥驱动,支持 ICH10R、P45 板子。随后在“开始懂了”奥运纪念正式版中发布,网友们的反馈非常积极——在 P45 主板上都能正常使用,而且在一些“问题”笔记本上也能跑起来。接着又加入了 AMD 最新的支持 SB750 南桥驱动,并做了追加发布版本,拿到电脑城测试黑5+780G+SATAII 硬盘,启动一切正常。为了解决 WinPE 启动速度慢的问题,使用了 GRUB 开始菜单加入 USB2.0 驱动启动,这样 WinPE 启动只要 10 秒左右。这一步耗费了不少精力,为了确保稳定性,用 U 盘量产了不下 20 次——虚拟机是测不出来的。
外置驱动
建议使用 911 原版本结构,使用一个 WIM 外置包,效率和速度是最快的。很多网友把外置中的程序每个都打包成 WIM。WIM 的好处是不怕病毒,但如果每一个程序或驱动包都打包成 WIM,运行的时候系统就要进行反复的虚拟解压和挂载,效率可想而知,对小内存的用户影响更为明显。WIM 不能跟 WINRAR 和 CAB 技术相提并论。SATA 驱动最好使用官方版本,从中提取后,一定要检查驱动配置文件。很多网友自己制作的驱动,包虽然是从官方版本中提取出来的,但在 WinPE 中就是无法正常使用,问题的关键就是配置文件和压缩成 CAB 时没有处理好 INF 中的相关配置。
关于修改 PE 的注册表
要 DIY 核心,修改注册表是必须掌握的基本功。先找到 SYSTEM32 目录下的 setupreg.hi_,用 WinRAR 打开,把里面的 setupreg.hiv 解压出来。打开开始菜单 → 运行 → 输入 regedit,用鼠标选中 HKEY_LOCAL_MACHINE 项,然后单击文件 → 加载外部配置文件。然后找到刚刚的那个 setupreg.hiv 加载,系统会提示输入项名称,这里随便填(比如填 ! 方便区分)。之后,就可以修改 ! 项里的注册表了——! 项里的就是 PE 的注册表。修改完后,记得卸载配置单元:选中 ! 项,文件 → 卸载配置单元。最后用 CAB 把修改好的 setupreg.hiv 文件压缩,再替换原文件即可。
这一步主要是指修改 WinPE 注册表,可以直接修改 WinPE 注册表,也可以修改配置文件。
1. 修改内部注册表的方法
用前面修改 PECMD.INI 的方法将内部注册表的文件提取出来:
\WXPE\SYSTEM32\CONFIG\*.*\WXPE\SYSTEM32\SETUPREG.HI_(这是 CAB 压缩包,将它解开成SETUPREG.HIV)
运行注册表编辑器 REGEDIT.EXE,鼠标点击 HKEY_LOCAL_MACHINE,然后点“文件” → “加载配置单元”,打开提取出来的注册表文件(需要改哪个就加载哪个),提示挂载名时随便输入一个名字(如 WinPE)。展开 HKEY_LOCAL_MACHINE 后,里面就有一项 WinPE。然后就跟普通的注册表操作一样了,改好后用鼠标点一下 WinPE 项目,然后“文件” → “卸载配置单元”,这个文件就改好了。用改过的注册表文件替换原来的即可。
2. 修改配置文件的方法
对于普通的不依赖于外置程序目录结构的注册表项目,可以用常规方法将修改项写成 REG 文件(可以直接从 XP 系统中导出,然后在其基础上修改)。在外置程序目录下有个 RegDoc.cmd,这个文件是毛桃用来注册外置程序文档关联的(就是改注册表)。用记事本打开它,加入一行:
REGEDIT /s REG文件名
这样 WinPE 加载外部配置时它会自动导入。这是最简单的改注册表的方法。
但是,如果要改的项依赖于外置程序的目录结构(比如要在右键菜单中添加“用 UltraEdit32 打开”),就不能用上面的方法了,因为外置程序的绝对路径是不确定的(不同机器的盘符不能确定)。这种情况就需要用原始的 REG 命令来做了(就跟老毛桃在 REGDOC.CMD 中的做法一样)。这个命令的语法比较艰深,且注册表键值的表示方法跟 REG 文件不同。在命令提示符下通过 /? 参数可以获得它的用法(中文的哦)。提醒一下,/? 参数是个可以多层使用的,如 REG /? 得到的是基本参数的说明,而 REG ADD /? 则可得到 ADD 这个参数的用法……有了这个命令的基础后,来看看是怎么解决不定路径问题的。在 REGDOC.CMD 中有一个环境变量 %TP%,代表的是 REGDOC.CMD 这个文件所在的路径。我们可以通过 %TP%\..\ 表示它的上层目录,%TP%\..\..\ 表示它的上两层目录。用此方法可以索引到外置程序目录内的所有路径,而不用考虑外置程序目录本身的绝对路径。另一个方法是在 WinPE.INI 中用 PECMD 的 REGI 命令一行行添加,这个比系统的 REG 命令好理解些,同样可以用 %CurDir% 环境变量来索引外置程序目录内的所有路径。
直接修改内部注册表的好处是启动 WinPE 时就已经完成设置,不依赖外部配置文件,WinPE 的加载速度也比较快,但过程麻烦。修改配置文件则比较简单,但要依赖配置文件加载过程(直到加载到那些语句时才会生效),启动时需要额外的时间加载,相当于给系统打补丁去修改默认设置。
一般情况下不推荐直接修改 WinPE 注册表——麻烦,重新打包也比较花时间。但有些跟系统紧密的键必须直接修改才有效,比如屏幕分辨率。虽然在外面也可以修改,但在登录时加载到它之前是无效的,那么在登录的过程中屏幕就会因切换分辨率而闪烁。
自己修改注册表的前提是,自己要知道所希望的改变需要修改注册表中的哪些键值。可以上网搜索,现在网上的这些资源多得是。实在找不到的话,还可以用 RegMon 之类的注册表监视软件来定位。比如要修改记事本的自动换行,又不知道相应的键值在哪。可以先开启 RegMon,然后在记事本中改变换行的选项,看 RegMon 的监视结果,来定位是哪个键值。因为系统本身也在不断更改注册表,RegMon 中的显示会很多,但是通过不断改变记事本中的设置,最终是可以找到的。这个过程需要的是耐心和细心。
