第二章、手动生成磁盘控制器驱动列表
一、要有驱动
简单不过的道理,如果我们要向当前系统里集成磁盘控制器驱动,那么我们就必须先得有磁盘控制器驱动。而这些驱动,从哪来,怎么收集?
由于认识和习惯问题,很多情况下,磁盘控制器驱动并不是单列出来的。例如VIA K8T890主板,假设它是K8T890北桥+8237A南桥,关于K8T890的驱动包肯定不会单独告诉你哪一部分是8237A南桥磁盘控制器的驱动,而是告诉你整个驱动包就是关于K8T890主板的,甚至会告诉你这个驱动包是关于VIA主板全系列的。怎么办?
其实也不用过于担心,很多主板驱动包中绝大多数部分都是关于磁盘控制器的,其他的部分基本都是关于系统总线等等系统设备的,所以就算是误集成了部分系统驱动,也不会有什么影响。这个我可以用一年的实践经验来保证。
好,那现在要做的,就是去驱动之家(
www.mydrivers.com)或者硬件厂商的官方网站去下载您需要的设备的驱动了。要注意的是,很多时候磁盘控制器与主板驱动是在同一个驱动包里的,所以下载时如果没有磁盘控制器驱动则可以只下载主板驱动。
下载好之后,我们还有很多事情要做。
很多驱动包提供给我们的是一个单个的安装包,用7z或类似软件将其强行解压缩,如果这个安装包有自解压的功能那么就让它自己释放,这样我们将获得一个包含着N个文件和N个文件夹的驱动文件夹。
下面要做的事要很需要经验了,我们到这个驱动文件夹中,删除无用的文件(例如安装向导、图片文件等等),以及不适用于您系统的部分(例如您系统是XP,而驱动包里有关于2K3的部分)。我已经说了,这个很需要经验,所以不要指望自己可以一次就做的完美,这需要大量的驱动搜集实践经验,可能不是一时半会能掌握的,但是却无意中可以让您掌握另一门技术——驱动收集技术。
如果您实在是对自己的驱动收集技术没信心,那么您可以用现成的收集好的驱动。向您推荐自由天空-自由的风驱动综合包系列和DPS驱动包系列。您可以从这两个驱动包中提取出已经收集好的主板驱动和磁盘控制器驱动,以备使用。
二、要有耐心
怎么忽然说耐心了?不说技术了么?不,耐心也是一种技术。随后我们要做一件可以测试我们的耐心程度的步骤——生成Device-InfPath列表。
(以下内容均已XP为例)
1、生成微软自带磁盘控制器驱动的Device-InfPath列表
(1)在C盘创建Sysprep文件夹,不要怀疑,必须C盘,不要再为什么“软件都要放D盘” 的概念迷惑了;
(2)将XP的“sysprep.exe”、“setupcl.exe”复制到C:\Sysprep中,“sysprep.exe”、“setupcl.exe”可以在XP原版光盘的Deploy.cab中获取;
(3)在C:\Sysprep中创建Sysprep.inf文件,并写入“SysprepMassStorage”段的段名:[SysprepMassStorage];
(4)在命令提示符下运行:
C:\Sysprep\Sysprep.exe –bmsd
这时,回看你的Sysprep.inf,你会惊奇的发现其中的[SysprepMassStorage]段下有:
*pnp0a00=c:\windows\inf\machine.inf
*pnp0a01=c:\windows\inf\machine.inf
*pnp0a04=c:\windows\inf\machine.inf
*pnp0a03=c:\windows\inf\machine.inf
pci\cc_0604=c:\windows\inf\machine.inf
pci\cc_0601=c:\windows\inf\machine.inf
pci\cc_0602=c:\windows\inf\machine.inf
pci\cc_0600=c:\windows\inf\machine.inf
pci\cc_0500=c:\windows\inf\machine.inf
root\ftdisk=c:\windows\inf\machine.inf
root\swenum=c:\windows\inf\machine.inf
root\update=c:\windows\inf\machine.inf
root\mssmbios=c:\windows\inf\machine.inf
root\dmio=c:\windows\inf\machine.inf
……
pcmcia\sony-memorystick(__8m)-9eb3=c:\windows\inf\mshdc.inf
pcmcia\sony-memorystick(_16m)-d04d=c:\windows\inf\mshdc.inf
pcmcia\sony-memorystick(_32m)-1766=c:\windows\inf\mshdc.inf
pcmcia\sony-memorystick(_64m)-8c2c=c:\windows\inf\mshdc.inf
pci\ven_1055&dev_9130=c:\windows\inf\mshdc.inf
pcmcia\micron-mtcf____-392d=c:\windows\inf\mshdc.inf
pci\ven_1179&dev_0105=c:\windows\inf\mshdc.inf
这是一个相当长的(至少你现在认为是相当长的)Device-InfPath列表,这个列表中包含了系统自带的所有磁盘控制器驱动的硬件ID以及其驱动INF所在位置。
这些硬件ID来源于系统的Machine.inf、Scsi.inf、Pnpscsi.inf 以及 Mshdc.inf,是正宗的系统自带驱动。这些驱动虽然不怎么新,但却是没法再稳定的驱动了。好了,现在随便找个其他地方把这个列表保存下来。
不过这似乎不太需要什么耐心,而且好像没什么技术含量,哼哼,地狱还没到。
2、生成第三方磁盘控制器驱动列表
微软比较偏袒自家孩子,一个“C:\Sysprep\Sysprep.exe –bmsd”命令,所有系统自带的磁盘控制器驱动的Device-InfPath列表就自动生成了。而大量的第三方磁盘控制器驱动这些没人管的孩子,就得我们亲手来管一管了。
下面我以集成我自己主板(NF550,芯片MCP55)的磁盘控制器驱动为例,讲述一下第三方磁盘控制器驱动Device-InfPath列表的生成方法。
当然,首先我们还得按照刚才的方法创建Sysprep文件夹并将需要的文件复制进去,这些我就不再赘述。
我们先到驱动之家下载一份MCP55的驱动,然后将里面我们需要的部分提取出来。我将这份MCP55的驱动放在了D:\Skyfree_MassStorage\M\MCP55,注意,驱动放在D盘是没问题的,因为所有的这些磁盘控制器驱动都会在封装阶段自动复制到C盘System32中。(本文的最后提供这个我提取的MCP55驱动包的下载,供大家参考和学习)
整理好驱动之后,我们去哪找这个驱动里包含的硬件ID呢?没有好的方法,我们只能一个一个INF的看了。例如,我先打开了“nvata.inf”,阅读INF的全文,找到[NVIDIA]段,内容如下:
[NVIDIA]
%CK804SSS%=Crush11_Inst,PCI\VEN_10DE&DEV_0055&CC_0101
%CK804SSS%=Crush11_Inst,PCI\VEN_10DE&DEV_0054&CC_0101
%MCP51S%=Crush11_Inst,PCI\VEN_10DE&DEV_0267&CC_0101
%MCP51S%=Crush11_Inst,PCI\VEN_10DE&DEV_0266&CC_0101
%MCP55S%=Crush11_Inst,PCI\VEN_10DE&DEV_037F&CC_0101
好的,这样我们就得到了5个硬件ID,那么我们在Sysprep.inf中的Device-InfPath列表就要这样写:
[SysprepMassStorage]
pci\ven_10de&dev_0055&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0054&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0267&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0266&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_037f&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
不过要注意的是,在Inf文件中搜索硬件ID也是个经验至上的工作,不是所有的Inf都写的很规范,所以我们要多多尝试。不要因为我上面的nVIDIA驱动ID是在[NVIDIA]段中找到的,那么在做Intel的时候也去找[Intel]段,这基本是不可取的,因为各个厂商写驱动Inf的习惯是不同的,而且哪怕是同一厂商,在不同时期写Inf的风格也会不同。
好了,我们按照这个方法类推,一次搜索完毕了所有的MCP55下的Inf文件,得到了如下一个完整的MCP55芯片组第三方磁盘控制器驱动列表:
[SysprepMassStorage]
pci\ven_10de&dev_0055&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0054&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0267&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0266&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_037f&cc_0101=D:\Skyfree_MassStorage\M\MCP55\nvata.inf
pci\ven_10de&dev_0055&cc_0104=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
pci\ven_10de&dev_0054&cc_0104=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
pci\ven_10de&dev_0267&cc_0104=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
pci\ven_10de&dev_0266&cc_0104=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
pci\ven_10de&dev_037f&cc_0104=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
gennvraiddisk=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
*_nvraidbus=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
*nvraidbus=D:\Skyfree_MassStorage\M\MCP55\nvraid.inf
pci\ven_10de&dev_01b4=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0064=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_00d4=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0084=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_00e4=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0052=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0034=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0264=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
pci\ven_10de&dev_0368=D:\Skyfree_MassStorage\M\MCP55\nvsmbus.inf
这仅仅是一个nVIDIA芯片组中的MCP55芯片组,所以如果要收集大量的磁盘控制器驱动,工作量会十分十分的大,而且全部列表很可能有微软自带列表的5倍长。
这是一个绝对的耐心活儿,所以,别不把耐心当技术。
三、要有运气
假定您现在已经收集好了一个2万行Device-InfPath列表,好吧,辛苦了。但是所有的事情到现在才刚刚开始,别晕,现在我们唯一要祈祷的是运气。
由于诸多方面的原因,硬件ID有些时候也会有问题,同一厂商内部由于驱动更新、疏忽、兼容性问题,或不同厂商之间的误差,可能会造成如下的一些问题:
(1)硬件ID冲突
这个通常是由于统一厂商内驱动更新造成的,例如之前用了这个ID标示这类设备,后来改变了做法,新旧驱动之间部分ID不兼容。
(2)硬件与当前系统不兼容
这个基本是由于驱动更新较慢,或者厂商测试不够造成的。
(3)硬件ID书写有误
这个最无语,ATI就曾经把“0”写成“o”。
这些问题不是我们能左右的,所以,还是最好强化一下近期的人品,避免遇到不可解释的非自然问题。
出现上述问题时,表现为以下情况:
(1)Sysprep在运行时忽然提示“某某注册表更新失败”或诸如此类的信息;
(2)Sysprep的运行忽然停止响应(最好开个任务管理器在旁边监视)。
出现问题后的解决方法:
说实在的,这个比较困难,我也没有太好的方法。只能用最原始的排除法。将驱动列表拆分成两部分,分别测试,然后再拆分测试、再拆分测试、再拆分测试……直到找出问题所在。
四、要有时间
微软方法集成磁盘控制器驱动是个十分消耗时间的事情,每一次封装过程都要持续40~60分钟,所以,除非您有足够的时间和足够的兴趣以及足够的勇气,否则就不要尝试了。