关于添加SATA驱动的回复(XP安装时分两个阶段

这篇旧文是当初无忧启动论坛还在全盛时期,为回答一位网友的疑问而写的回复。

因为只是回复所以当初也就没定标题,没想到后来被许多人转载,可能是第一个转载的人,取了文章的名字叫做“XP安装时分两个阶段”……

这怪异的标题就是这样来的。至于当初那位网友的问题,现在已经找不到了……

现在以这个标题搜索,百度google中还找得到……

现在已经是准Vista时代了,手工集成驱动的方法也渐渐的由傻瓜化的软件所取代,这篇文章就作为留念吧。原文如下:

 

关于集成SATA驱动的回复

事实说明,你的方法是对的。

添加驱动需要的是细心,稍有疏忽,所有心血都白费。

你已经明白了XP安装时分两个阶段:Text Mode Setup和GUI Mode Setup

Text Mode Setup前,由引导程序$ldr$(或Setupldr.bin)根据txtsetup.sif中驱动列表检测并载入最基本的驱动,

这些驱动只保证Text Mode Setup时能够驱动设备,而不能发挥设备的全部性能。

然后Text Mode Setup时会把所需要的最基本的驱动复制到硬盘上,以便GUI Mode Setup可以进行。

即使是GUI Mode Setup已经顺利载入的驱动,也没有实际安装,完整的驱动安装,都是在GUI Mode Setup启动后的第一阶段进行。

GUI Mode Setup启动后的第一阶段驱动的安装,保证了XP可以成功启动和完全发挥设备性能。

XP自带驱动文件将近5000个,用于Text Mode Setup只是少数。

关键问题

在txtsetup.sif中添加SATA驱动,只保证Text Mode Setup和GUI Mode Setup能够顺利进行,而不是实际安装驱动。

还必须想办法在GUI Mode Setup时安装驱动。(也就是在Winnt.sif和$OEM$中添加相应的东西)

只做第一步,不做第二步将导致:安装可以顺利完成,但进入系统时却出现问题。

至于Dosnet.inf,从光盘启动安装时不会用到,只有当你从Windows启动安装时才会用到。

但是当你从Windows启动安装时,如果不用参数安装,所集成的驱动都将失效。

在Txtsetup.sif中集成驱动的基础

这些东西在我的另一篇文章中有提到,但能把它灵活运用的似乎不多。

    i386\txtsetup.sif负责在Text Mode Setup阶段时文件复制和文件来源路径

    i386\driver.cab是XP原版的驱动文件库

    i386\sp1.cab是XP 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相对于原版改动过的文件

 

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中复制

 

在Txtsetup.sif中还有一个特殊的段[SystemPartitionFiles]

用于将某个文件复制到C:盘根目录,当然这个文件必须在[SourceDisksFiles]中指定了来源。

 

以你的例子说明在PE中集成驱动与在XP安装盘中集成驱动的差别

 

[SourceDisksFiles]

si3112r.sys  = 1,,,,,,4_,4,1,,,1,4

这句在XP安装时的意思:si3112r.sys来源为i386,属于虚拟启动软盘组的第4块盘(4_),目的地为system32\drivers(4 = system32\drivers)

这句在PE中的意思:要想载入si3112r.sys,必须从system32\drivers中寻找。

为什么是4_ ?  因为按照惯例microsoft把驱动都放在了第4块盘上了,其实放在哪个盘上都无所谓。

 

[HardwareIdsDatabase]

PCI\VEN_1095&DEV_3112&SUBSYS_61121095 = "si3112r"

这些是硬件ID列表

 

[SCSI.Load]

si3112r  = si3112r.sys,4      (4 = system32\drivers)

PE中意思是如果找到符合上面列出的硬件ID,则从system32\drivers载入si3112r.sys

 

[SCSI]

si3112r  = "Silicon Image SiI 3112 SATARaid Controller"

这只是驱动说明,在PE中打开注册表,在相应的驱动键值下,你可以找到这些。

 

稍微总结一下:

对于XP:检测硬件->引导到Text Mode Setup->载入驱动->复制驱动文件->重启->利用复制的驱动文件启动GUI Mode Setup

在txtsetup.sif中有控制引导到Text Mode Setup的语句:OsLoadOptions = "/fastdetect /noguiboot /nodebug"

"载入驱动"是载入光盘上已经存在的驱动

"复制驱动文件"是把光盘上的驱动按需要复制到硬盘上。这一步是为GUI Mode Setup而准备的。

 

对于PE:检测硬件->引导到PE->载入驱动

在txtsetup.sif中有控制引导到PE的语句:OsLoadOptions ="/fastdetect /minint"

要想在PE中集成驱动必须先将驱动复制到system32\drivers

 

所以基本上没有什么差别。

 

有趣的是,在关闭一些服务后使用/minint参数来引导XP,可以让启动后的XP禁用页面文件。

打开Boot.ini

在multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect下面添加

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /minint

另类集成驱动方法

microsoft知识库和帮助文件里只会告诉你如何去做,而不会告诉你为什么要这么做。

microsoft不会给你过多的说明,因为这会威胁到它的产品的安全。

 

下面我将以SI3112举个例子告诉你如何运用上面的东西。(我只找到SI3112的驱动)

====================================================

注意:在txtsetup.sif中添加的文件,文件名不要超过8.3格式。

第一步

txtsetup.sif中添加如下内容(和你所做的一样)

[SourceDisksFiles]

si3112.sys  = 1,,,,,,4_,4,1,,,1,4

 

[HardwareIdsDatabase]

PCI\VEN_1095&DEV_3112&SUBSYS_31121095 = "si3112"

……

 

[SCSI.load]

si3112 = si3112.sys,4

 

[SCSI]

si3112 = "Silicon Image SiI 3112 SATALink Controller"

 

当然dosnet.inf也要添加相应的内容

====================================================

第二步

把驱动6个驱动文件

SiiSupp.vxd

SiWinAcc.sys

SI3112.inf

SilSupp.cpl

Si3112x.sys(把原来的Si3112.sys改名)

Si3112.mpd

压缩成mydriver.cab(可以用Canbinet Manager 2003并把压缩率调到最高)

 

把mydriver.cab复制到i386下

—————————————–

打开txtsetup.sif

在[SourceDisksFiles]中添加

SiiSupp.vxd = 100,,,,,,,45,0,0     <-意思是复制到windows\temp中

SiWinAcc.sys = 100,,,,,,,45,0,0

SI3112.inf = 100,,,,,,,45,0,0

SilSupp.cpl = 100,,,,,,,45,0,0

Si3112x.sys = 100,,,,,,,45,0,0,Si3112.sys   <-和第一步中的文件重名,用改名复制

Si3112.mpd = 100,,,,,,,45,0,0

 

在driver.cab   = 1,,,,,,_x,39,0,0下面添加

mydriver.cab   = 1,,,,,,_x,39,0,0

 

修改DriverCabName=driver.cab,sp1.cab,mydriver.cab

 

在driver.cab = 16下面添加

mydriver.cab = 16

———————————————

打开drvindex.inf

修改CabFiles=SP1,driver,mydriver

 

添加

[mydriver]

SiiSupp.vxd

SiWinAcc.sys

SI3112.inf

SilSupp.cpl

Si3112x.sys

Si3112.mpd

 

在[Cabs]

driver=driver.cab

SP1=SP1.cab下面添加

mydriver=mydriver.cab

—————————————–

打开dosnet.inf,添加

d1,mydriver.cab

d1,SiiSupp.vxd

d1,SiWinAcc.sys

d1,SI3112.inf

d1,SilSupp.cpl

d1,Si3112x.sys

d1,Si3112.mpd

—————————————–

最后在winnt.sif中的[Unattended]中添加

DriverSigningPolicy=Ignore

OemPnPDriversPath="WINDOWS\TEMP"   <-这是为了配合上面复制到windows\temp中的驱动

 

如何让集成的驱动从Windows下启动安装也有效

如果是用上面的方法集成驱动,可以用如下命令

WINNT32.EXE /unattend:I386\winnt.sif

如果是把驱动放在$OEM$,可以用如下命令

I386\WINNT32.EXE /copydir:$OEM$ /unattend:I386\winnt.sif

最后

一些类似的问题不断地被提出来,但实际解决的方法相似却不相同。

只有当你真正掌握了原理,才能够随机应变。

 

我没有SATA设备,所以我也无法帮你实现它。

 

没有实践,也就没有发言权。

上面的方法,我也仅仅是在集成显卡声卡驱动中使用。

如果上面的方法在集成SATA设备时有什么错误,恕我无知。

 

 

                                                          Benjaminwan

                                                          2004.6.20

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注