添加驅(qū)動(dòng)需要的是細(xì)心,稍有疏忽,所有心血都白費(fèi)。
你已經(jīng)明白了XP安裝時(shí)分兩個(gè)階段:Text Mode Setup和GUI Mode Setup
Text Mode Setup前,由引導(dǎo)程序$ldr$(或Setupldr.bin)根據(jù)txtsetup.sif中驅(qū)動(dòng)列表檢測(cè)并載入最基本的驅(qū)動(dòng),
這些驅(qū)動(dòng)只保證Text Mode Setup時(shí)能夠驅(qū)動(dòng)設(shè)備,而不能發(fā)揮設(shè)備的全部性能。
然后Text Mode Setup時(shí)會(huì)把所需要的最基本的驅(qū)動(dòng)復(fù)制到硬盤上,以便GUI Mode Setup可以進(jìn)行。
即使是GUI Mode Setup已經(jīng)順利載入的驅(qū)動(dòng),也沒有實(shí)際安裝,完整的驅(qū)動(dòng)安裝,都是在GUI Mode Setup啟動(dòng)后的第一階段進(jìn)行。
GUI Mode Setup啟動(dòng)后的第一階段驅(qū)動(dòng)的安裝,保證了XP可以成功啟動(dòng)和完全發(fā)揮設(shè)備性能。
XP自帶驅(qū)動(dòng)文件將近5000個(gè),用于Text Mode Setup只是少數(shù)。
關(guān)鍵問題
在txtsetup.sif中添加SATA驅(qū)動(dòng),只保證Text Mode Setup和GUI Mode Setup能夠順利進(jìn)行,而不是實(shí)際安裝驅(qū)動(dòng)。
還必須想辦法在GUI Mode Setup時(shí)安裝驅(qū)動(dòng)。(也就是在Winnt.sif和$OEM$中添加相應(yīng)的東西)
只做第一步,不做第二步將導(dǎo)致:安裝可以順利完成,但進(jìn)入系統(tǒng)時(shí)卻出現(xiàn)問題。
至于Dosnet.inf,從光盤啟動(dòng)安裝時(shí)不會(huì)用到,只有當(dāng)你從Windows啟動(dòng)安裝時(shí)才會(huì)用到。
但是當(dāng)你從Windows啟動(dòng)安裝時(shí),如果不用參數(shù)安裝,所集成的驅(qū)動(dòng)都將失效。
在Txtsetup.sif中集成驅(qū)動(dòng)的基礎(chǔ)
這些東西在我的另一篇文章中有提到,但能把它靈活運(yùn)用的似乎不多。
i386/txtsetup.sif負(fù)責(zé)在Text Mode Setup階段時(shí)文件復(fù)制和文件來源路徑 i386/driver.cab是XP原版的驅(qū)動(dòng)文件庫 i386/sp1.cab是XP SP1版新加入的驅(qū)動(dòng)文件庫 i386/drvindex.inf所有驅(qū)動(dòng)文件的索引 i386/layout.inf部署文件,其內(nèi)容和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下部有定義,有時(shí)找不到安裝盤時(shí)會(huì)提示請(qǐng)插入XXXX盤,就是這個(gè)了。而%spcdtagfilei%指的是SP1版XP識(shí)別文件,即是光盤根目錄下的win51ip.sp1 3_代表什么呢,再看txtsetup.sif頭部[SourceDisksNames.x86]段 3_ = %bootname3%,"%boottagfile3%",,"" <---指的是虛擬啟動(dòng)軟盤組第三塊盤 3_之后的2表示復(fù)制到system32目錄,再看txtsetup.sif的頭部的[WinntDirectories]段:2 = system32
細(xì)心的話,你可以發(fā)現(xiàn)有的文件來源為1,有的卻為100,其實(shí)1等同于100,但為什么要有分別呢? 打開layout.inf,你可以發(fā)現(xiàn)它比txtsetup.sif中每項(xiàng)多了一大串?dāng)?shù)字,那串?dāng)?shù)字就是未壓縮前的文件大小 再打開XP Without SP1版的layout.inf,你可以發(fā)現(xiàn),所有文件來源都為1,對(duì)比剛才的layout.inf,凡是來源為100的文件大小都不一樣 這即是表示來源為100文件是SP1版XP相對(duì)于原版改動(dòng)過的文件
auditW.chm = 1,,,,,,,21,0,0,audit.chm <--這表示在復(fù)制后改名為audit.chm channels.scf = 1,,,,,,,2,0,0,%ViewChannelsSCF% <-表示超過命名規(guī)范的文件,會(huì)在c:/留下$$Rename.txt指示文件在GUI Mode Setup階段改名 還有一類文件象ct120d.gpd = 1,,,,,,,,3,3<---來源1后第7個(gè)逗號(hào)之后的復(fù)制目的地為空,則表示不一定復(fù)制,在需要時(shí)再復(fù)制 這類文件多半是驅(qū)動(dòng)和系統(tǒng)非必須組件。 但是有4千多個(gè)驅(qū)動(dòng)文件存在driver.cab中,不在i386下,如何指示其來源呢? 這就要靠drvindex.inf這個(gè)文件,復(fù)制時(shí)安裝程序會(huì)先在drvindex.inf中查找,如果找到則從driver.cab或SP1.cab中復(fù)制 所以如果i386下和XXXX.cab中同時(shí)存在同名的文件,安裝程序?qū)?huì)優(yōu)先從XXXX.cab中復(fù)制
在Txtsetup.sif中還有一個(gè)特殊的段[SystemPartitionFiles] 用于將某個(gè)文件復(fù)制到C:盤根目錄,當(dāng)然這個(gè)文件必須在[SourceDisksFiles]中指定了來源。
以你的例子說明在PE中集成驅(qū)動(dòng)與在XP安裝盤中集成驅(qū)動(dòng)的差別
[SourceDisksFiles] si3112r.sys = 1,,,,,,4_,4,1,,,1,4 這句在XP安裝時(shí)的意思:si3112r.sys來源為i386,屬于虛擬啟動(dòng)軟盤組的第4塊盤(4_),目的地為system32/drivers(4 = system32/drivers) 這句在PE中的意思:要想找到si3112r.sys,必須從system32/drivers中尋找。 為什么是4_ ? 因?yàn)榘凑諔T例microsoft把驅(qū)動(dòng)都放在了第4塊盤上了,其實(shí)放在哪個(gè)盤上都無所謂。
[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" 這只是驅(qū)動(dòng)說明,在PE中打開注冊(cè)表,在相應(yīng)的驅(qū)動(dòng)鍵值下,你可以找到這些。
稍微總結(jié)一下: 對(duì)于XP:檢測(cè)硬件->引導(dǎo)到Text Mode Setup->載入驅(qū)動(dòng)->復(fù)制驅(qū)動(dòng)文件->重啟->利用復(fù)制的驅(qū)動(dòng)文件啟動(dòng)GUI Mode Setup 在txtsetup.sif中有控制引導(dǎo)到Text Mode Setup的語句:OsLoadOptions = "/fastdetect /noguiboot /nodebug" "載入驅(qū)動(dòng)"是載入光盤上已經(jīng)存在的驅(qū)動(dòng) "復(fù)制驅(qū)動(dòng)文件"是把光盤上的驅(qū)動(dòng)按需要復(fù)制到硬盤上。這一步是為GUI Mode Setup而準(zhǔn)備的。
對(duì)于PE:檢測(cè)硬件->引導(dǎo)到PE->載入驅(qū)動(dòng) 在txtsetup.sif中有控制引導(dǎo)到PE的語句:OsLoadOptions ="/fastdetect /minint" 要想在PE中集成驅(qū)動(dòng)必須先將驅(qū)動(dòng)復(fù)制到system32/drivers
所以基本上沒有什么差別。
有趣的是,在關(guān)閉一些服務(wù)后使用/minint參數(shù)來引導(dǎo)XP,可以讓啟動(dòng)后的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
另類集成驅(qū)動(dòng)方法
microsoft知識(shí)庫和幫助文件里只會(huì)告訴你如何去做,而不會(huì)告訴你為什么要這么做。 microsoft不會(huì)給你過多的說明,因?yàn)檫@會(huì)威脅到它的產(chǎn)品的安全。
下面我將以SI3112舉個(gè)例子告訴你如何運(yùn)用上面的東西。(我只找到SI3112的驅(qū)動(dòng)) ==================================================== 注意:在txtsetup.sif中添加的文件,文件名不要超過8.3格式。 第一步 txtsetup.sif中添加如下內(nèi)容并復(fù)制相應(yīng)的文件(和你所做的一樣) [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"
當(dāng)然dosnet.inf也要添加相應(yīng)的內(nèi)容 ==================================================== 第二步 把驅(qū)動(dòng)6個(gè)驅(qū)動(dòng)文件 SiiSupp.vxd SiWinAcc.sys SI3112.inf SilSupp.cpl Si3112x.sys(把原來的Si3112.sys改名) Si3112.mpd 壓縮成mydriver.cab(可以用Canbinet Manager 2003并把壓縮率調(diào)到最高)
把mydriver.cab復(fù)制到i386下 ----------------------------------------- 打開txtsetup.sif 在[SourceDisksFiles]中添加 SiiSupp.vxd = 100,,,,,,,45,0,0 <-意思是復(fù)制到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 <-和第一步中的文件重名,用改名復(fù)制 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" <-這是為了配合上面復(fù)制到windows/temp中的驅(qū)動(dòng)
如何讓集成的驅(qū)動(dòng)從Windows下啟動(dòng)安裝也有效
如果是用上面的方法集成驅(qū)動(dòng),可以用如下命令 WINNT32.EXE /unattend:I386/winnt.sif 如果是把驅(qū)動(dòng)放在$OEM$,可以用如下命令 I386/WINNT32.EXE /copydir:$OEM$ /unattend:I386/winnt.sif
最后
一些類似的問題不斷地被提出來,但實(shí)際解決的方法相似卻不相同。 只有當(dāng)你真正掌握了原理,才能夠隨機(jī)應(yīng)變。
我沒有SATA設(shè)備,所以我也無法幫你實(shí)現(xiàn)它。
沒有實(shí)踐,也就沒有發(fā)言權(quán)。 上面的方法,我也僅僅是在集成顯卡聲卡驅(qū)動(dòng)中使用。 如果上面的方法在集成SATA設(shè)備時(shí)有什么錯(cuò)誤,恕我無知。
Benjaminwan 2004.6.20
|