自动选择计算机类型原理简述

本文简述了创建自动选择计算机类型的Ghost XP系统安装盘的原理,包括如何精简XP安装盘,理解硬件抽象层(HAL)在安装过程中的作用,以及Text Mode Setup和GUI Mode Setup的阶段。作者通过分析txtsetup.sif和相关文件,实现了在安装前检测计算机类型,从而实现自动选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这也属于我的旧文之一,而且是最早写的第一篇文章。值得纪念的一篇文章……

早在Ghost XP 系统安装还未怎么流行时,那时只有手动选择计算机电源管理类型的Ghost系统安装盘。

当初就突发奇想,为什么不自己做一个可以自动选择计算机类型的Ghost系统安装盘呢!

当初的想法很单纯,XP的安装盘既然可以做到自动识别,那就把它精简一下,合并到Ghost系统安装盘里。

没想到这艰巨的任务,竟然被我完成了……

回想起来,还真觉得不可思议。

记得当初花了7天,把XP SP1安装盘里600MB的文件,精简到20MB,而且只用批处理文件,将两者完美地结合在了一起,还做了一个名为G.A.A.S XP的Ghost系统安装盘……

这是最早的自动选择计算机类型的Ghost系统安装盘了。

我相信这开了个好头,之后可谓百家争鸣,各种自动选择计算机类型的方法争相出现……

这之后经过几年的发展,许多人的努力,才有了现在的更加方便快捷的Ghost系统安装盘。

当初的随系统盘的说明文章,原文如下:

自动选择计算机类型原理简述

既然只是简述原理,就无法做到面面俱到,可能也无法让新手们满意,但是希望看完这篇文章的朋友能对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值