| [UploadFile=34_2187.doc][这个贴子最后由benjaminwan在 2004/05/08 09:46pm 第 1 次编辑] 
 如果你是Ghost XP制作爱好者,又对此内容感兴趣,想更清楚的了解其制作原理和过程
 可以下载我做的范例:http://bbs.wuyou.net/cgi-bin/topic.cgi?forum=34&topic=2169&show=25
 G.A.A.S XP制作原理简述
 既然只是简述原理,就无法做到面面俱到,可能也无法让新手们满意,但是希望看完这篇文章的朋友能对XP系统安装盘的结构有个大概的了解。
 本文内的一些名词定义:
 1.Ghost XP Disk = Ghost XP 系统恢复盘
 2.New Setup XP Disk = 用于全新安装的XP系统安装盘
 3.XP without SP1 = 未集成SP1的原版XP
 4.XP with SP1 =集成了SP1的XP
 
 New Setup XP 安装过程分解 我把安装过程分成两个阶段,第一个阶段叫Text Mode Setup ,文本模式安装,最醒目的地方就是进行文件的复制,复制完后重新启动。
 第二个阶段叫 GUI Mode Setup ,完成Text Mode Setup 后进行硬件检测,安装网络,安装开始菜单项,安装系统组件,注册组件,保存设置和删除临时文件。
 其中,Text Mode Setup阶段又可分成两个步骤:第一步是装载虚拟启动软盘组,然后进入黑屏状态
 第二步是黑屏之后,进行的磁盘检测,选择分区和复制文件。
 
 什么才是问题的关键?[ 计算机类型大家都把它叫做电源管理模式,因为它和软关机有关,而在Microsoft Windows 企业部署工具指南中把它称为硬件抽象层 (HAL)
 这里引用指南中的原话:主安装和目标计算机必须有兼容的硬件抽象层 (HAL)。例如,HAL APIC 和 HAL MP(多处理器系统)是兼容的,但 HAL PIC(可编程中断控制器)与 HAL APIC 或 HAL MP 不兼容。
 硬件抽象层 (HAL)的定义中提到的一个重要问题:HAL 还提供了允许单个设备驱动器在所有的平台上支持同样设备的例程。
 硬件抽象层 (HAL)是以一种驱动的方式在windows上存在,它是windows运行的基础,甚至是windows安装过程中所比不可少的。
 说到这里你大概就已经明白了问题的关键:想让Windows在安装过程中自动选择计算机类型,必须先了解硬件抽象层 (HAL)是如何安装的。
 
 Windows是如何处理硬件抽象层 (HAL)的?[ 从硬盘安装XP的过程着手:
 引导程序读取Boot.ini->找到c:\$WIN_NT$.~BT\bootsect.dat->C:\$LDR$->查找C:\txtsetup.sif中所列出的硬件驱动,载入Text Mode Setup安装程序
 txtsetup.sif中所列出的驱动在Text Mode Setup中的第二个步骤时复制到磁盘。
 硬件抽象层 (HAL)也是在Text Mode Setup过程中检测并复制到%systemroot%\system32\hal.dll,但并不在注册表中留下相应的键值。
 重新启动后,GUI Mode Setup阶段就用Text Mode Setup阶段复制的驱动启动,但在其检测硬件阶段再次进行检测并真正安装。
 可是,有人会问:为什么要Text Mode Setup就复制,HAL不是在GUI Mode Setup阶段时才安装吗?因为没有HAL的支持,GUI Mode Setup阶段安装就无法启动。
 
 接下来才是本文的主题 那么现在要做的只是把Text Mode Setup分离出来,先于Ghost XP安装前运行,然后在Ghost XP安装时检测Text Mode Setup阶段安装了哪种硬件抽象层 (HAL),并做出相映的处理就可以了。
 i386\txtsetup.sif负责在Text Mode Setup阶段时文件复制和文件来源路径
 i386\driver.cab是XP Without SP1版的驱动文件库
 i386\sp1.cab是XP With SP1版新加入的驱动文件库
 i386\drvindex.inf所有驱动文件的索引
 i386\layout.inf部署文件,其内容和Txtsetup.sif基本一样
 首先必须先看懂Txtsetup.sif
 打开txtsetup.sif并查找hal.dll,可以找到
 hal.dll      = 100,,,,,,3_,2,3,,,1,2
 100代表什么呢,看txtsetup.sif头部的[SourceDisksNames.x86]段
 100 = %spcdname%,%spcdtagfilei%,,\i386,1   <---100代表的是i386目录,%spcdname%在txtsetup.sif下部有定义,有时找不到安装盘时会提示请插入XXXX盘,就是这个了。而%spcdtagfilei%指的是SP1版XP识别文件,即是光盘根目录下的win51ip.sp1
 3_代表什么呢,再看txtsetup.sif头部[SourceDisksNames.x86]段
 3_    = %bootname3%,"%boottagfile3%",,""  <---指的是虚拟启动软盘组第三块盘
 3_之后的2表示复制到system32目录,再看txtsetup.sif的头部的[WinntDirectories]段:2  = system32
 细心的话,你可以发现有的文件来源为1,有的却为100,其实1等同于100,但为什么要有分别呢?
 打开layout.inf,你可以发现它比txtsetup.sif中每项多了一大串数字,那串数字就是未压缩前的文件大小
 再打开XP Without SP1版的layout.inf,你可以发现,所有文件来源都为1,对比刚才的layout.inf,凡是来源为100的文件大小都不一样
 这即是表示来源为100文件是SP1版XP相对于原版改动过的文件
 回到正题:在txtsetup.sif中查找[hal],可以找到
 [hal]
 486c_up        = hal.dll     ,2,hal.dll    |
 acpipic_up     = halacpi.dll ,2,hal.dll      |  <--如果HAL的Hardware ID为acpipic_up,
 e_isa_up       = hal.dll     ,2,hal.dll    |  那么复制halacpi.dll到system32,
 mps_up         = halapic.dll ,2,hal.dll    |  并在复制后改名为hal.dll
 mps_mp         = halmps.dll  ,2,hal.dll  |  复制来源和目的地在各个
 syspro_mp      = halsp.dll   ,2,hal.dll    |  [SourceDisksFiles]中有指定
 acpiapic_up    = halaacpi.dll,2,hal.dll      |  以下同
 acpiapic_mp    = halmacpi.dll,2,hal.dll     |
 [Hal.Load]
 486c_up= hal.dll               HAL的HardwareID与相应的dll对应表
 acpipic_up= halacpi.dll          如果你想知道你的计算机的HAL HardWareID
 e_isa_up= hal.dll               你可以打开注册表编辑器
 mps_up=halapic.dll             并展开HKEY_LOCAL_MACHINE\SYSTEM
 mps_mp= halapic.dll            \CurrentControlSet\Enum\Root\ACPI_HAL\0000|
 syspro_mp      = hal.dll      如果不存在则应该是HKEY_LOCAL_MACHINE\SYSTEM\
 acpiapic_mp    = halaacpi.dll    CurrentControlSet\Enum\Root\PCI_HAL\0000
 acpiapic_up    = halaacpi.dll  但在系统运行是这个键值是不允许用注册表编辑器进行更改的
 [ntdetect]
 486c_up     = NTDETECT.COM,"\"           |
 acpipic_up  = NTDETECT.COM,"\"           |
 e_isa_up    = NTDETECT.COM,"\"           |
 mps_up      = NTDETECT.COM,"\"           |不管计算机是哪种类型
 mps_mp      = NTDETECT.COM,"\"           |都得将NTDETECT.COM复制到C:\
 standard    = NTDETECT.COM,"\"           |
 syspro_mp   = NTDETECT.COM,"\"           |
 acpiapic_mp = NTDETECT.COM,"\"           |
 acpiapic_up = NTDETECT.COM,"\"           |
 但是,Text Mode Setup 安装太漫长了,如何让它只复制HAL和其他一些必要文件并减少安装时间呢?
 再来研究研究txtsetup.sif吧
 auditW.chm    = 1,,,,,,,21,0,0,audit.chm  <--这表示在复制后改名为audit.chm
 channels.scf = 1,,,,,,,2,0,0,%ViewChannelsSCF% <-表示超过命名规范的文件,会在c:\留下$$Rename.txt指示文件在GUI Mode Setup阶段改名
 还有一类文件象ct120d.gpd   = 1,,,,,,,,3,3<---来源1后第7个逗号之后的复制目的地为空,则表示不一定复制,在需要时再复制
 但是有4千多个驱动文件存在driver.cab中,不在i386下,如何指示其来源呢?
 这就要靠drvindex.inf这个文件,复制时安装程序会先在drvindex.inf中查找,如果找到则从driver.cab或SP1.cab中复制
 所以如果i386下和XXXX.cab中同时存在同名的文件,安装程序将会优先从XXXX.cab中复制
 drvindex.inf的格式:
 [Version]
 signature="$Windows NT$"
 CabFiles=SP1,driver
 [driver]
 ........  <-包含在driver.cab中的文件
 [SP1]
 .....  <-包含在SP1.cab中的文件
 [Cabs]
 driver=driver.cab
 SP1=SP1.cab
 如果你想在Text Mode Setup复制文件时不复制SP1.cab则只要修改以下几处:
 删除:sp1.cab      = 100,,,,,,_x,39,0,0
 DriverCabName=driver.cab,sp1.cab 改为DriverCabName=driver.cab
 删除:sp1.cab = 16
 并将drvindex.inf改为:
 [Version]
 signature="$Windows NT$"
 CabFiles=driver
 [driver]
 ........  <-包含在driver.cab中的文件
 [Cabs]
 driver=driver.cab
 如果你想修改SP1.cab中的驱动文件,那是不可能的,因为它受到SP1.cat这个数字签名文件的保护,最多只能删除或将其所有文件合并到driver.cab中,微软破解中心做的98_2000_XP中的XP就是这样优化驱动库的,因为driver.cab有许多驱动文件在SP1.cab中已经升级了,Microsoft只在drvindex.inf的[driver]段中删除相应的文件名,并没有删除driver.cab中多余的文件
 如果你想连driver.cab都不复制,那是不可能的,但是有替代的办法:
 随便找个小文件压缩成driver.cab,记下[driver]中所有文件并在txtsetup.sif中删除,并改写drvindex.inf为
 [Version]
 signature="$Windows NT$"
 CabFiles=driver
 [driver]
 空白
 [Cabs]
 driver=driver.cab
 如果你想把driver.cab中的文件转移到i386下,则不用删除txtsetup.sif中的相应文件名,只要将drvindex.inf修改为如上内容,再把driver.cab中文件解压并一个个压缩放到i386下,我即是采用这种做法
 halacpi.dll
 halapic.dll
 halmacpi.dll
 halmps.dll
 hal.dll
 halaacpi.dll
 以上文件存在SP1.cab中,当然driver.cab中也有,但那并不是SP1版XP安装时用的
 halsp.dll存在driver.cab中
 我将SP1.cab照上述的方法删除了,将driver.cab照上述的方法修改了
 并将以上所有文件压缩放到i386下,但不能删除txtsetup.sif中相应的行,一删除就会出错.
 还有其他文件的精简就依次类推,不再细讲。
 精简Text Mode Setup是一个痛苦的过程,最后我终于将i386精简到40M以内,安装时间也缩短到2-3分钟
 所以最后Text Mode Setup就变成了一个单纯用于检测计算机类型的过程
 这个过程完成之后,通过判断system32\hal.dll就可以知道计算机类型了。
 说到这里你可能会有个疑问,是复制到windows\system32下吗?
 hal.dll大小99KB= Standard PC
 halacpi.dll大小76KB= Advanced Configuration and Power Interface (ACPI) PC
 如果你的计算机类型是Advanced Configuration and Power Interface (ACPI) PC
 但是你将它改成了Standard PC并重新启动,你会发现所有硬件都再要检测一遍,这就是上面所提到的重要的一点,更改了基础,其他驱动必然要重新再检测
 然后你可以用另一个系统或维护盘把halacpi.dll改名为hal.dll复制到windows\system32下
 如果我的判断没错的话,系统仍然可以启动,但是这种方法有个缺点。
 至于什么缺点我在这里不好讲明白,如果你试过了应该就会明白了。
 我采用的是另一种方法:
 Text Mode Setup时文件复制到另一个文件夹(Benjamin),和在同一个盘下装双系统原理一样,然后在Ghost XP安装时再通过Benjamin\system32\hal.dll来判断计算机类型。
 至于如何来判断,说到这里可能已经有人差不多知道,其实方法多了去了。
 暂时讲到这里,如何判断留到下一篇吧。
 考虑到有些东西新手不知道,我已经尽量将该讲的讲清楚,至于有些东西连菜鸟都应该懂的东西我就不提了。
 如果有什么问题和建议,可以向我提出来,但最近比较忙,可能没有时间回答。
 Benjaminwan
 2004.5.8
 |