第三章、磁盘控制器驱动5N(a/l#Q3C-Kz!\)N6},i$d-^-i&k5t.z*u&O3.1磁盘控制器相关知识(1)磁盘控制器9E4~7b9z)O6P&r5W磁盘控制器,顾名思义,是磁盘的控制设备。这里的磁盘是个广义的概念,泛指目前的机械硬盘、固态硬盘等各种存储体。“磁盘控制器”一词来源于微软官方文档中的“大容量磁盘控制器”,由于当今普通用户的磁盘容量都已达到TB级,故去掉“大容量”三个字以避免混淆。大多数人过于关注磁盘的类型,往往忽略了最重要的磁盘控制器。随着磁盘技术的发展,各种类型的磁盘琳琅满目,如IDE、SATA、SCSI、SAS硬盘等等,加上新生代固态硬盘,可谓是种类繁多。但Windows操作系统真的关心磁盘类型吗?No,Windows操作系统只关心磁盘控制器的类型和磁盘控制器的工作模式!%]1x!h9l2N.i8\,W0sM0D#J/wT(2)磁盘控制器驱动驱动程序是硬件与系统之间的桥梁,系统通过驱动程序控制和管理硬件,并通过驱动程序发挥出硬件的最佳能力。而磁盘控制器驱动程序是系统与磁盘控制器之间的桥梁,系统通过磁盘控制器驱动管理磁盘控制器,又通过磁盘控制器管理磁盘。;h:{)H*o7E;S0\这也就是为什么系统不关心磁盘类型的原因,系统只要能够通过驱动操作磁盘控制器,那么对硬盘的管理完全由磁盘控制器承担。举例子说,就像我去图书馆借书,我只要告诉图书管理员我需要什么书,图书管理员就会帮我找到这本书,而我无需了解这本书存放在哪个书架、归在哪个分类里。这里的“我”相当于系统,“图书馆管理员”相当于磁盘控制器,而“图书馆”就是磁盘。虽然这不是个特别恰当的例子,但是基本与系统、磁盘控制器、磁盘之间的关系吻合。这里,我们必须还要明确,磁盘控制器驱动是针对磁盘控制器的,而不是针对磁盘的。尽管多年来我一直在努力纠正这个概念,但很多技术员仍将“SATA硬盘驱动”、“串口驱动”等名词挂在嘴上,误导了很多新手。那为什么有时系统会无法在SATA硬盘的计算机上部署呢?这是因为系统映像中没有包含此目标计算机的磁盘控制器驱动,没有匹配的驱动则系统就无法管理磁盘控制器,从而无法执行对磁盘的管理,所以造成的系统部署失败。看到这里,请以后不要将“SATA硬盘驱动”挂在嘴边了,这会误导更多的新手。(_&p.~!F-kH.C(3)“两种”磁盘控制器驱动8i-F/W3e,O4E1w,g$p,n磁盘控制器驱动分为“两种”,一种是使系统可以正确识别磁盘控制器以部署系统的驱动,一种是让系统可以更好的控制与管理磁盘控制器的驱动。其实这“两种”驱动是同一类驱动,只不过是不同的工作时机、不同的工作模式罢了。通常前者被俗称为“SRS驱动”,而后者被称为“PNP(即插即用)驱动”。前者属于系统关键设备驱动,让系统能够启动,以不至于宕机蓝屏;后者就像你的显卡与声卡驱动一样,为的是能够让硬件更好的发挥其性能。%TR2h7A4Y'q(4)磁盘控制器工作模式磁盘控制器工作模式一般有:IDE(PATA)、SATA、AHCI、RAID等,而磁盘控制器工作模式与磁盘类型是基本无关的。这也就是说,即使你是SATA的硬盘,而如果磁盘控制器开启的是IDE工作模式,那么系统也仅仅把你的SATA硬盘当做一个IDE硬盘来对待。+g9i6P:{%q$r同一个磁盘控制器可能会存在多种工作模式,例如同时拥有PATA、AHCI和RAID工作模式,一般可以在CMOS中进行设置。而每种工作模式下磁盘控制器的硬件ID又是不同的,也就是说虽然磁盘控制器还是这个磁盘控制器,但由于它工作模式的变更,它的硬件ID也随之变更,那么就需要为它重新安装磁盘控制器驱动。这样也从另外一个角度解释了为什么系统安装完毕后,如果更改磁盘控制器工作模式,会造成蓝屏的问题。例如安装系统时,磁盘控制器工作模式为SATA,系统为磁盘控制器安装的是SATA模式的驱动,而一旦磁盘控制器工作模式改为了AHCI,由于系统里针对磁盘控制器的驱动仍是SATA模式的,系统无法正常操作磁盘控制器,所以就出现蓝屏宕机的情况。#h,B7S#m,o^7~!e+h;H.S3M.F/x6v7K'U)P.\(5)“SRS驱动”SRS驱动是对“封装专用磁盘控制器驱动”的简称,SRS驱动最早是指磁盘控制器SATA、RAID和SCSI工作模式的驱动,时过境迁,新的AHCI模式已出,SCSI模式已被SAS模式取代,但由于SRS驱动是我们长期以来的简称,很多情况下仍旧在使用,所以我们保留这个名词并继续使用。SRS驱动泛指用于拓展系统部署范围的磁盘控制器驱动,而由于这个驱动经常是在系统封装时导入的,所以也称为“封装专用磁盘控制器驱动”。所以如果您在本书中看到关于“SRS驱动”的说法,只要知道它代表的是什么就可以了,它本身的含义已经被大大的扩充了。(6)IDE硬盘也需要磁盘控制器驱动?9W&W#p-x(\这个问题本身就带有谬误,前文已述,磁盘控制器驱动针对的是磁盘控制器,而不是硬盘,所以无论硬盘如何,都是需要磁盘控制器驱动的。那为什么我们通常不太考虑磁盘控制器IDE工作模式时的驱动呢?这是因为Windows操作系统会自带大多数磁盘控制器IDE工作模式的驱动。'r9fP$e.Y另外一个层面上讲,如果把IDE硬盘接入到一个支持其他工作模式的磁盘控制器上,如RAID工作模式,由于IDE工作模式的磁盘控制器驱动无法驱动此RAID工作模式,从而系统无法识别此IDE硬盘。2|3s,f0T0H8l*|*O(7)系统自带磁盘控制器驱动0L6f)b0p$CWindowsXP和Windows7都自带了一定量的磁盘控制器驱动,都包括了其发行时常见的磁盘控制器的驱动。这些驱动中包括了最常见磁盘控制器IDE模式、SATA模式、AHCI模式的驱动,还包括部分RAID模式、SCSI模式和SAS模式的驱动。这也就是为什么一个系统映像不额外添加SRS驱动也能具有一定的系统部署范围的原因。9\!V/w)^k5X/k但随着时间的推移,拿WinXP为例,2001年时其自带的磁盘驱动也几乎是无所不能的,但在2010年的今天,WinXP如果不额外集成SRS驱动几乎是寸步难行的。Win7也一样,虽然现在可以应付大多数磁盘控制器,但随着时间的推移也会和WinXP一样。所以,为系统增补额外的SRS驱动是势在必行的。3.2磁盘控制器驱动的工作流程!j$p'?7sq1|2{)a2_这里的磁盘控制器驱动指的是SRS驱动,即用于拓展系统部署范围的磁盘控制器驱动。SRS驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统将无法控制磁盘控制器,从而无法操作磁盘,结果一般会造成系统宕机。那么SRS驱动的工作流程是怎么样的?一般而言分三步:第一步,系统启动时检测系统关键设备列表。#c!_*w9^1g&A3x关键设备数据库位于注册表的:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase'YD*^6@$`4f打开这个键,其下是以系统关键设备的HWID命名的各子键。每个子键一般包括ClassGUID和Service两个项,ClassGUID的值为此设备所属类,Service的值为此设备所依赖的系统服务。系统启动时,根据当前计算机磁盘控制器对应工作模式的HWID,去CriticalDeviceDatabase键下寻找是否有以其HWID命名的子键,如果有,则加载其Service键值规定的服务;如果没有,则蓝屏宕机。#t4VM)u0\O;z-f第二步,使用磁盘控制器驱动服务。T+M@!e$iI系统服务列表位于注册表的:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services)O5}1~!{%h'I2\/Z%q$e+@打开这个键,其下包括了当前系统所有的系统服务。(1)中所要加载的服务也位于此键下。如果(1)中所需的服务存在于此,则使用此服务;而如果不存在,则蓝屏宕机。我们打开一个磁盘控制器驱动服务,这个服务包含了很多键值,其中需要着重关注的是ImagePath和Start两个键值,ImagePath规定了此服务所需的磁盘控制器驱动文件所在位置,而Start规定了此服务的启动方式。#{4R'K7xM)};d2T:u;k9K8aN:@$T;V第三步,加载磁盘控制器驱动文件。/|({)X!b*?/T1zC7[磁盘控制器驱动文件一般位于C:\Windows\System32\drivers(假设C盘是系统盘),且一般以.sys为后缀名。在(2)中所使用的服务需要ImagePath所规定的磁盘控制器驱动文件才能运行,如果此驱动文件存在,则加载使用;而如果此驱动文件不存在,则蓝屏宕机。!\'P2u+M5A#Z6q7UA(K我们根据上面的描述,总结出如下一个流程:系统关键设备--设备驱动服务--设备驱动文件8H5w2n+Zm1|1WB9p5P0S%y;w(1)当前磁盘控制器对应工作模式的HWID如果属于系统关键设备,则启用其对应的服务;而如果不属于系统关键设备,则蓝屏宕机。(2)被要求使用的驱动服务如果存在,则尝试加载驱动文件启动;如果不存在,则蓝屏宕机。(3)被要求加载的驱动文件如果存在,则加载并使用;如果不存在则蓝屏宕机。.B/f'K-@3_0S0G0J这是一条紧密的链条,任何一个环节出现问题,都会造成蓝屏宕机的后果。所以在处理SRS驱动时一定要小心谨慎。3.3阅读磁盘控制器驱动的INFu5r'P7N#e%i-i3W7L.U0o.T驱动程序一般包括.sys和.inf文件,大部分包括数字签名.cat文件,有些还包括.dll、.exe等驱动应用程序。就磁盘控制器文件来说,一般需要.sys和.inf文件即可使驱动正常运作。这里的.sys文件就是驱动文件本身,也是我们在3.2节中提到的最终需要加载的驱动,而.inf文件的作用则是告之系统如何使用这个驱动程序。1S;A9{6Y1L'H本节我们将一起阅读一下磁盘控制器驱动的.inf文件,加深对磁盘控制器驱动的理解,同时为我们下一步的制作SRS驱动作准备。建议新手在练手时选用Intel的磁盘控制器驱动,Intel的驱动写的比较工整条理,适合我们做为分析和练习的对象。,FC;q,k)O:G8d(G)K本节我们将选用IntelRapidStorageTechnologyDriver9.5.0.1037版中的AHCI部分(iaAHCI.inf)作为实例进行讲解。虽然驱动inf包含了很多的内容,但是本节只着重讲解与SRS驱动相关的驱动inf内容,学习知识讲究把握重点,尽可能减少不相关知识的干扰。至于其他部分的内容,建议您多问问百度和谷歌,并自己体会一下。另外,由于inf的阅读方法未查阅到官方文档说明,除非是开发驱动的高级技术人员,一般人很难能完全讲清一个inf中每个段的作用。下文我要讲的内容是我个人根据长时间的实践与揣摩而总结出来的,其中难免会有个别错误,还请读者见谅。但我绝对能保证大方向的正确性,还请读者放心。-h:J+B-^0M;n(1)version段IntelRapidStorageTechnologyDriver9.5.0.1037的version段如下:[version]CatalogFile=iaAHCI.catSignature=$WINDOWSNT$Class=hdcClassGuid={4D36E96A-E325-11CE-BFC1-08002BE10318}Provider=%INTEL%DriverVer=10/02/2009,9.5.0.1037复制代码3T5_(n2?9`:`%X/Yversion段的作用一般是介绍本驱动的相关信息::H!JZ1}/}/H1WCatalogFile:驱动认证文件的文件名。;K'a:b(~'w4oSignature:签名。Class:此驱动(或使用本驱动的硬件)所属分类,一般磁盘控制器驱动都属于hdc类或SCSIAdapter类。ClassGuid:所属类的Guid,可以理解为C