蓝色动力网络

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5903|回复: 4

《封装日志》-3.磁盘控制器驱动---自由天空

[复制链接]
发表于 2010-4-11 15:49:08 | 显示全部楼层 |阅读模式
第三章、磁盘控制器驱动

  3.1 磁盘控制器相关知识

  (1)磁盘控制器
  磁盘控制器,顾名思义,是磁盘的控制设备。这里的磁盘是个广义的概念,泛指目前的机械硬盘、固态硬盘等各种存储体。“磁盘控制器”一词来源于微软官方文档中的“大容量磁盘控制器”,由于当今普通用户的磁盘容量都已达到TB级,故去掉“大容量”三个字以避免混淆。
  大多数人过于关注磁盘的类型,往往忽略了最重要的磁盘控制器。随着磁盘技术的发展,各种类型的磁盘琳琅满目,如IDE、SATA、SCSI、SAS硬盘等等,加上新生代固态硬盘,可谓是种类繁多。但Windows操作系统真的关心磁盘类型吗?No,Windows操作系统只关心磁盘控制器的类型和磁盘控制器的工作模式!
  (2)磁盘控制器驱动
  驱动程序是硬件与系统之间的桥梁,系统通过驱动程序控制和管理硬件,并通过驱动程序发挥出硬件的最佳能力。而磁盘控制器驱动程序是系统与磁盘控制器之间的桥梁,系统通过磁盘控制器驱动管理磁盘控制器,又通过磁盘控制器管理磁盘。
  这也就是为什么系统不关心磁盘类型的原因,系统只要能够通过驱动操作磁盘控制器,那么对硬盘的管理完全由磁盘控制器承担。举例子说,就像我去图书馆借书,我只要告诉图书管理员我需要什么书,图书管理员就会帮我找到这本书,而我无需了解这本书存放在哪个书架、归在哪个分类里。这里的“我”相当于系统,“图书馆管理员”相当于磁盘控制器,而“图书馆”就是磁盘。虽然这不是个特别恰当的例子,但是基本与系统、磁盘控制器、磁盘之间的关系吻合。
  这里,我们必须还要明确,磁盘控制器驱动是针对磁盘控制器的,而不是针对磁盘的。尽管多年来我一直在努力纠正这个概念,但很多技术员仍将“SATA硬盘驱动”、“串口驱动”等名词挂在嘴上,误导了很多新手。那为什么有时系统会无法在SATA硬盘的计算机上部署呢?这是因为系统映像中没有包含此目标计算机的磁盘控制器驱动,没有匹配的驱动则系统就无法管理磁盘控制器,从而无法执行对磁盘的管理,所以造成的系统部署失败。
  看到这里,请以后不要将“SATA硬盘驱动”挂在嘴边了,这会误导更多的新手。
  (3)“两种”磁盘控制器驱动
  磁盘控制器驱动分为“两种”,一种是使系统可以正确识别磁盘控制器以部署系统的驱动,一种是让系统可以更好的控制与管理磁盘控制器的驱动。其实这“两种”驱动是同一类驱动,只不过是不同的工作时机、不同的工作模式罢了。通常前者被俗称为“SRS驱动”,而后者被称为“PNP(即插即用)驱动”。
  前者属于系统关键设备驱动,让系统能够启动,以不至于宕机蓝屏;后者就像你的显卡与声卡驱动一样,为的是能够让硬件更好的发挥其性能。
  (4)磁盘控制器工作模式
  磁盘控制器工作模式一般有:IDE(PATA)、SATA、AHCI、RAID等,而磁盘控制器工作模式与磁盘类型是基本无关的。这也就是说,即使你是SATA的硬盘,而如果磁盘控制器开启的是IDE工作模式,那么系统也仅仅把你的SATA硬盘当做一个IDE硬盘来对待。
  同一个磁盘控制器可能会存在多种工作模式,例如同时拥有PATA、AHCI和RAID工作模式,一般可以在CMOS中进行设置。而每种工作模式下磁盘控制器的硬件ID又是不同的,也就是说虽然磁盘控制器还是这个磁盘控制器,但由于它工作模式的变更,它的硬件ID也随之变更,那么就需要为它重新安装磁盘控制器驱动。
  这样也从另外一个角度解释了为什么系统安装完毕后,如果更改磁盘控制器工作模式,会造成蓝屏的问题。例如安装系统时,磁盘控制器工作模式为SATA,系统为磁盘控制器安装的是SATA模式的驱动,而一旦磁盘控制器工作模式改为了AHCI,由于系统里针对磁盘控制器的驱动仍是SATA模式的,系统无法正常操作磁盘控制器,所以就出现蓝屏宕机的情况。
  (5)“SRS驱动”
  SRS驱动是对“封装专用磁盘控制器驱动”的简称,SRS驱动最早是指磁盘控制器SATA、RAID和SCSI工作模式的驱动,时过境迁,新的AHCI模式已出,SCSI模式已被SAS模式取代,但由于SRS驱动是我们长期以来的简称,很多情况下仍旧在使用,所以我们保留这个名词并继续使用。
  SRS驱动泛指用于拓展系统部署范围的磁盘控制器驱动,而由于这个驱动经常是在系统封装时导入的,所以也称为“封装专用磁盘控制器驱动”。所以如果您在本书中看到关于“SRS驱动”的说法,只要知道它代表的是什么就可以了,它本身的含义已经被大大的扩充了。
  (6)IDE硬盘也需要磁盘控制器驱动?
  这个问题本身就带有谬误,前文已述,磁盘控制器驱动针对的是磁盘控制器,而不是硬盘,所以无论硬盘如何,都是需要磁盘控制器驱动的。那为什么我们通常不太考虑磁盘控制器IDE工作模式时的驱动呢?这是因为Windows操作系统会自带大多数磁盘控制器IDE工作模式的驱动。
  另外一个层面上讲,如果把IDE硬盘接入到一个支持其他工作模式的磁盘控制器上,如RAID工作模式,由于IDE工作模式的磁盘控制器驱动无法驱动此RAID工作模式,从而系统无法识别此IDE硬盘。
  (7)系统自带磁盘控制器驱动
  Windows XP和Windows 7都自带了一定量的磁盘控制器驱动,都包括了其发行时常见的磁盘控制器的驱动。这些驱动中包括了最常见磁盘控制器IDE模式、SATA模式、AHCI模式的驱动,还包括部分RAID模式、SCSI模式和SAS模式的驱动。这也就是为什么一个系统映像不额外添加SRS驱动也能具有一定的系统部署范围的原因。
  但随着时间的推移,拿WinXP为例,2001年时其自带的磁盘驱动也几乎是无所不能的,但在2010年的今天,WinXP如果不额外集成SRS驱动几乎是寸步难行的。Win7也一样,虽然现在可以应付大多数磁盘控制器,但随着时间的推移也会和WinXP一样。
  所以,为系统增补额外的SRS驱动是势在必行的。
 楼主| 发表于 2010-4-11 15:49:57 | 显示全部楼层
3.2 磁盘控制器驱动的工作流程
  这里的磁盘控制器驱动指的是SRS驱动,即用于拓展系统部署范围的磁盘控制器驱动。SRS驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统将无法控制磁盘控制器,从而无法操作磁盘,结果一般会造成系统宕机。
  那么SRS驱动的工作流程是怎么样的?一般而言分三步:
  第一步,系统启动时检测系统关键设备列表。
  关键设备数据库位于注册表的:
  HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase
  打开这个键,其下是以系统关键设备的HWID命名的各子键。每个子键一般包括ClassGUID和Service两个项,ClassGUID的值为此设备所属类,Service的值为此设备所依赖的系统服务。系统启动时,根据当前计算机磁盘控制器对应工作模式的HWID,去CriticalDeviceDatabase键下寻找是否有以其HWID命名的子键,如果有,则加载其Service键值规定的服务;如果没有,则蓝屏宕机。
  第二步,使用磁盘控制器驱动服务。
  系统服务列表位于注册表的:
  HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\services
  打开这个键,其下包括了当前系统所有的系统服务。(1)中所要加载的服务也位于此键下。如果(1)中所需的服务存在于此,则使用此服务;而如果不存在,则蓝屏宕机。
  我们打开一个磁盘控制器驱动服务,这个服务包含了很多键值,其中需要着重关注的是ImagePath和Start两个键值,ImagePath规定了此服务所需的磁盘控制器驱动文件所在位置,而Start规定了此服务的启动方式。
  第三步,加载磁盘控制器驱动文件。
  磁盘控制器驱动文件一般位于C:\\Windows\\System32\\drivers(假设C盘是系统盘),且一般以.sys为后缀名。
  在(2)中所使用的服务需要ImagePath所规定的磁盘控制器驱动文件才能运行,如果此驱动文件存在,则加载使用;而如果此驱动文件不存在,则蓝屏宕机。
  我们根据上面的描述,总结出如下一个流程:
  系统关键设备-->设备驱动服务-->设备驱动文件
  (1)当前磁盘控制器对应工作模式的HWID如果属于系统关键设备,则启用其对应的服务;而如果不属于系统关键设备,则蓝屏宕机。
  (2)被要求使用的驱动服务如果存在,则尝试加载驱动文件启动;如果不存在,则蓝屏宕机。
  (3)被要求加载的驱动文件如果存在,则加载并使用;如果不存在则蓝屏宕机。
这是一条紧密的链条,任何一个环节出现问题,都会造成蓝屏宕机的后果。所以在处理SRS驱动时一定要小心谨慎。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-11 15:50:19 | 显示全部楼层
3.3 阅读磁盘控制器驱动的INF

  驱动程序一般包括.sys和.inf文件,大部分包括数字签名.cat文件,有些还包括.dll、.exe等驱动应用程序。就磁盘控制器文件来说,一般需要.sys和.inf文件即可使驱动正常运作。这里的.sys文件就是驱动文件本身,也是我们在3.2节中提到的最终需要加载的驱动,而.inf文件的作用则是告之系统如何使用这个驱动程序。
  本节我们将一起阅读一下磁盘控制器驱动的.inf文件,加深对磁盘控制器驱动的理解,同时为我们下一步的制作SRS驱动作准备。建议新手在练手时选用Intel的磁盘控制器驱动,Intel的驱动写的比较工整条理,适合我们做为分析和练习的对象。
  本节我们将选用Intel Rapid Storage Technology Driver 9.5.0.1037版中的AHCI部分(iaAHCI.inf)作为实例进行讲解。
  虽然驱动inf包含了很多的内容,但是本节只着重讲解与SRS驱动相关的驱动inf内容,学习知识讲究把握重点,尽可能减少不相关知识的干扰。至于其他部分的内容,建议您多问问百度和谷歌,并自己体会一下。
  另外,由于inf的阅读方法未查阅到官方文档说明,除非是开发驱动的高级技术人员,一般人很难能完全讲清一个inf中每个段的作用。下文我要讲的内容是我个人根据长时间的实践与揣摩而总结出来的,其中难免会有个别错误,还请读者见谅。但我绝对能保证大方向的正确性,还请读者放心。
  (1)version段
  Intel Rapid Storage Technology Driver 9.5.0.1037的version段如下:
  1.   [version]
  2.   CatalogFile=iaAHCI.cat
  3.   Signature="$WINDOWS NT$"
  4.   Class=hdc
  5.   ClassGuid ={4D36E96A-E325-11CE-BFC1-08002BE10318}
  6.   Provider=%INTEL%
  7.   DriverVer=10/02/2009,9.5.0.1037
复制代码
version段的作用一般是介绍本驱动的相关信息:
  CatalogFile:驱动认证文件的文件名。
  Signature:签名。
  Class:此驱动(或使用本驱动的硬件)所属分类,一般磁盘控制器驱动都属于hdc类或SCSIAdapter类。
  ClassGuid:所属类的Guid,可以理解为Class所对应的数字编号。
  Provider:驱动提供者。在inf文件中,凡是以“%”开头或结尾的字符串,在inf文件末的string段中都有其对应的值。如%INTEL%的对应值是“Intel”。
  DriverVer:驱动生成时间以及驱动版本。
  特别注意Class、ClassGuid和DriverVer,搞清楚它们可以避免不必要的麻烦。
  另外,确定本驱动可以用于源计算机的系统环境,WinXP用WinXP的驱动,Win7用Win7的驱动,一般不可混用。
  (2)Manufacturer段
  Intel Rapid Storage Technology Driver 9.5.0.1037的Manufacturer段如下:
  1.   [Manufacturer]
  2.   %INTEL%=INTEL_HDC,ntx86
复制代码
意思是:名为%INTEL%(在此是Intel)的制造商使用了本inf的“INTEL_HDC,ntx86”段。
  “INTEL_HDC,ntx86”信息本身也包含多个意思:第一个字符串,即第一个“,”之前的那个字符串,为主段名,其他的为附段名。一个主段名后可以有多个附段名,附段名间用英文逗号隔开。主段名可以单独使用,也可以与任何一个附段名结合使用,如本例“INTEL_HDC,ntx86”中,“INTEL_HDC”可以独立成为段名,也可以与附段名结合组成“INTEL_HDC.ntx86”来使用。
  再举个nVIDIA的例子,“%NVIDIA%=NVIDIA, ntx86, ntx86.6.0”,其中主段名为“NVIDIA”,附段名为“ntx86”和“ntx86.6.0”,可以使用的段名有“NVIDIA”、“NVIDIA. ntx86”、“NVIDIA.ntx86.6.0”。
  回到Intel的inf。通过对上文的阅读和理解,Intel Rapid Storage Technology Driver [Manufacturer]段的意思为:“名为Intel的制造商使用本inf的“INTEL_HDC”段和“INTEL_HDC. ntx86”段”。
  而后我们去查找这个两个段,发现只能找到“INTEL_HDC. ntx86”段,有时制造商为了方便拓展等理由会刻意这样安排。那我们就来看看“INTEL_HDC. ntx86”段:
  1.   [INTEL_HDC.ntx86]
  2.   %PCI\\VEN_8086&DEV_2681&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_2681&CC_0106
  3.   %PCI\\VEN_8086&DEV_27C1&CC_0106.DeviceDesc% = iaStor_Inst,PCI\\VEN_8086&DEV_27C1&CC_0106
  4.   %PCI\\VEN_8086&DEV_27C5&CC_0106.DeviceDesc% = iaStor_mobl_Inst,PCI\\VEN_8086&DEV_27C5&CC_0106
  5.   %PCI\\VEN_8086&DEV_2821&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_2821&CC_0106
  6.   %PCI\\VEN_8086&DEV_2829&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\\VEN_8086&DEV_2829&CC_0106
  7.   %PCI\\VEN_8086&DEV_2922&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_2922&CC_0106
  8.   %PCI\\VEN_8086&DEV_2929&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\\VEN_8086&DEV_2929&CC_0106
  9.   %PCI\\VEN_8086&DEV_3A02&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_3A02&CC_0106
  10.   %PCI\\VEN_8086&DEV_3A22&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_3A22&CC_0106
  11.   %PCI\\VEN_8086&DEV_3B29&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\\VEN_8086&DEV_3B29&CC_0106
  12.   %PCI\\VEN_8086&DEV_3B2F&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\\VEN_8086&DEV_3B2F&CC_0106
  13.   %PCI\\VEN_8086&DEV_3B22&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_3B22&CC_0106
复制代码

对HWID熟悉的朋友一眼就能看出来这里肯定和HWID有关,没错,的确与HWID有很大关系。这个段就是用来规定具有哪些HWID的硬件可以使用本驱动,或者说本驱动支持哪些HWID的硬件。我们抽出其中部分来讲解,如:

  %PCI\\VEN_8086&DEV_2681&CC_0106.DeviceDesc% = iaStor_Inst, PCI\\VEN_8086&DEV_2681&CC_0106
  “=”前的部分:对使用本HWID硬件的描述,具体描述见String段PCI\\VEN_8086&DEV_2681&CC_0106.DeviceDesc项的值。
  “=”后,“,”前的部分:使用本驱动的硬件,要安装哪个段来执行驱动安装操作,这里是“iaStor_Inst”段。
  “=”后,“,”后的部分:可以使用本驱动的硬件的HWID,这里是“PCI\\VEN_8086&DEV_2681&CC_0106”。


  (3)服务段
  在(2)中我们已经找到了,如果要安装HWID为PCI\\VEN_8086&DEV_2681&CC_0106硬件的驱动程序,要根据“iaStor_Inst”段的信息。这里的“iaStor_Inst”段是广义的,不只包含“[iaStor_Inst]”,还包含其子段(或叫做“派生段”),我们找一下它的“[iaStor_Inst.Services]”子段:
  1.   [iaStor_Inst.Services]
  2.   AddService = iaStor, %SPSVCINST_ASSOCSERVICE%, iaStor_Service_Inst, iaStor_EventLog_Inst
复制代码
AddService规定了要为此驱动安装哪个服务。
  第一个参数:iaStor,为需安装服务的服务名。
  第三个参数:iaStor_Service_Inst,为根据“iaStor_Service_Inst”段所规定的内容安装服务。
  我们再找到“iaStor_Service_Inst”段,看看这个驱动的服务要怎么安装。
  1.   [iaStor_Service_Inst]
  2.   DisplayName    = %*PNP0600.DeviceDesc%
  3.   ServiceType    = %SERVICE_KERNEL_DRIVER%
  4.   StartType      = %SERVICE_BOOT_START%
  5.   ErrorControl   = %SERVICE_ERROR_NORMAL%
  6.   ServiceBinary  = %12%\\iaStor.sys
  7.   LoadOrderGroup = SCSI Miniport
  8.   AddReg         = iaStor_parameters_AddReg
复制代码
DisplayName:服务的显示名,这个与服务名不同,在服务名不变的前提下可以根据需要有多种显示名,显示名的具体内容查阅“string”段“*PNP0600.DeviceDesc”项的内容。
  ServiceType:服务的类型,此处是“内核级驱动”,具体值见“string”段“SERVICE_KERNEL_DRIVER” 项的内容。
  StartType:服务的启动类型,此处是“在系统启动时即启动”,具体值见“string”段“SERVICE_BOOT_START” 项的内容。
  ErrorControl:错误类型,此处是“一般性报错”,具体值见“string”段“SERVICE_ERROR_NORMAL” 项的内容。
  ServiceBinary:驱动文件所在位置,“%12%”一般代表system32\\drivers目录,驱动文件完整路径为“system32\\drivers\\iaStor.sys”。
  LoadOrderGroup:服务所属的组,这里是“SCSI Miniport”。
  AddReg:额外需要添加的注册表项目,见“iaStor_parameters_AddReg”段的具体内容。
到这里,这个inf就算基本读完了,我们来总结一下我们读到的:
  (1)通过version段了解驱动的基本信息;
  (2)通过Manufacturer段找到包含HWID的段,在根据HWID的段找到配合此HWID的驱动所需要安装的驱动服务;
  (3)找到需要安装的驱动服务,了解这个驱动的服务是怎么样的,特别是启动类型和驱动文件所在位置。
  这也就完成了由inf文件中读到“系统关键设备-->设备驱动服务-->设备驱动文件”流程中各部分关键信息的目的。便于我们下一步制作SRS驱动。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-11 15:54:07 | 显示全部楼层
3.4 制作SRS驱动

  (1)系统关键设备部分
  关键设备数据库(CriticalDeviceDatabase,简称CDDB)存储在:
  HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase
  其下包含了所有系统关键设备的HWID,磁盘控制器的HWID也属于此,所以需要将inf中的HWID及其相关信息写入此注册表项目下。
  CDDB下的注册表项目的一般形式为:
  1.   
  2.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\(硬件ID)]
  3.   "ClassGUID"="(类的GUID)"
  4.   "Service"="(服务名)"
复制代码
硬件ID,读取自inf中Manufacturer段规定的段,如本例中是为INTEL_HDC.ntx86段。
  类的GUID,读取自inf中version段的ClassGuid项。
  服务名,读取自inf中硬件ID对应项目的参数,如本例中读取自iaStor_Inst段的子段iaStor_Inst.Services中AddService项决定的服务名:iaStor。
  那么PCI\\VEN_8086&DEV_2681&CC_0106对应的CDDB段应该为:
  1.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\ PCI#VEN_8086&DEV_2681&CC_0106]
  2.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  3.   "Service"=" iaStor "
复制代码
注意,HWID在写入注册表时“PCI”后的“\\”改为“#”,以避免混淆)

  (2)驱动服务部分
  在3.3中已述,驱动服务是由驱动安装段的Services子段中AddService的第三个参数决定的,本例中由“iaStor_Service_Inst”段来完成。
我们把“iaStor_Service_Inst”段中由“%”包含的字符串根据“String”段的信息来替换一下,得到:
  1.   [iaStor_Service_Inst]
  2.   DisplayName    = "Intel AHCI Controller"
  3.   ServiceType    = 1
  4.   StartType      = 0
  5.   ErrorControl   = 1
  6.   ServiceBinary  =system32\\drivers\\iaStor.sys
  7.   LoadOrderGroup = SCSI Miniport
  8.   AddReg         = iaStor_parameters_AddReg
复制代码
将驱动inf的服务段转化为注册表时,有如下对应关系:
  inf中的ServiceType项对应注册表中的Type项;
  inf中的StartType项对应注册表中的Start项;
  inf中的ErrorControl项对应注册表中的ErrorControl项;
  inf中的ServiceBinary项对应注册表中的ImagePath项;
  inf中的LoadOrderGroup项对应注册表中的Group项。

  说明:
  DisplayName,由于我们是在制作SRS驱动,一般而言此值没有具体作用,所以无需转化;
  ServiceType、StartType、ErrorControl在注册表中为“REG_DWORD”类型,写入注册表时,如果其值为非二进制,则需要将其值转为二进制;
  ServiceBinary的注册表项目类型为“REG_EXPAND_SZ”,需要将它的字符串内容完全转化为二进制内容;
  AddReg段是个需要商榷的段,在有些磁盘控制器中这个不是必须的(如Intel),而有些磁盘控制器则是必须的(如nVIDIA),所以我们一般还需将AddReg所规定段的内容进行转化。

  SRS驱动服务部分一般形式为:
  1.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\(服务名)]
  2.   "ErrorControl"=
  3.   "Group"=""
  4.   "Start"=
  5.   "Type"=
  6.   "ImagePath"=
复制代码

经过转化后,iaStor服务在注册表中的形式为:
  1.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor]
  2.   "ErrorControl"=dword:00000001
  3.   "Group"="SCSI Miniport"
  4.   "Start"=dword:00000000
  5.   "Type"=dword:00000001
  6.   "ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6D,00,33,00,32,00,5C,00,64,00,72,00,69,00,76,00,65,00,72,00,73,00,5C,00,69,00,61,00,53,00,74,00,6F,00,72,00,2E,00,73,00,79,00,73,00,00,00
复制代码

(3)驱动服务的附加注册表项

  在(2)中已经说到了服务创建段中的AddReg项,例如AddReg =iaStor_parameters_AddReg。我们在inf中寻找AddReg所规定的段,即“iaStor_parameters_AddReg”。
  一般来说,只有注册表附加项中的“Parameters”才是必要的添加项目。如:

  1.   [iaStor_parameters_AddReg]
  2.   HKR,Parameters,queuePriorityEnable,%REG_DWORD%,0
  3.   HKR,Parameters,BusType,0x00010001,0x0000003
复制代码

第一个参数HKR:服务所在键。
  第二个参数Parameters:服务所在键下的Parameters子键。
  第三个参数,一般规定要建立名为什么的项,如这里的queuePriorityEnable项和BusType项。
  第四个参数,所创建项的类型,如果使用“%”包含则取string段寻找对应值。一般而言,0x00020000是REG_EXPAND_SZ类型,0x00010001是REG_DWORD类型。
  第五格参数,所创建项的值,请根据项的类型进行转化,如将十进制转化为二进制。

  将上述inf内容按照刚才所讲的规则进行转化后为:
  1.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor\\Parameters]
  2.   "queuePriorityEnable"=dword:00000000
  3.   "BusType"=dword:00000003
复制代码
(4)驱动文件
  折腾了这么多,别忘记了我们的主角——驱动文件。将对应的驱动文件放置到ImagePath(inf中ServiceBinary)所规定的位置。在此例中,需要将iaStor.sys放置到System32\\drivers中(假设C盘是系统盘),完整路径为:C:\\Windows\\System32\\drivers\\iaStor.sys。

  经过一番努力,我们完成了Intel Rapid Storage Technology 驱动的AHCI部分从一般驱动向SRS驱动的转化,转化为注册表文件后如下:
  1.   Windows Registry Editor Version 5.00
  2.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2681&CC_0106]
  3.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  4.   "Service"="iaStor"
  5. [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_27C1&CC_0106]
  6.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  7.   "Service"="iaStor"
  8.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_27C5&CC_0106]
  9.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  10.   "Service"="iaStor"
  11.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2821&CC_0106]
  12.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  13.   "Service"="iaStor"
  14.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2829&CC_0106]
  15.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  16.   "Service"="iaStor"
  17.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2922&CC_0106]
  18.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  19.   "Service"="iaStor"
  20.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2929&CC_0106]
  21.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  22.   "Service"="iaStor"
  23.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3A02&CC_0106]
  24.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  25.   "Service"="iaStor"
  26.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3A22&CC_0106]
  27.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  28.   "Service"="iaStor"
  29.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B29&CC_0106]
  30.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  31.   "Service"="iaStor"
  32.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B2F&CC_0106]
  33.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  34.   "Service"="iaStor"
  35.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B22&CC_0106]
  36.   "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
  37.   "Service"="iaStor"
  38.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor]
  39.   "ErrorControl"=dword:00000001
  40.   "Group"="SCSI Miniport"
  41.   "Start"=dword:00000000
  42.   "Type"=dword:00000001
  43.   "ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6D,00,33,00,32,00,5C,00,64,00,72,00,69,00,76,00,65,00,72,00,73,00,5C,00,69,00,61,00,53,00,74,00,6F,00,72,00,2E,00,73,00,79,00,73,00,00,00
  44.   [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor\\Parameters]
  45.   "queuePriorityEnable"=dword:00000000
  46.   "BusType"=dword:00000003
复制代码
将此注册表文件保存,例如Intel_Srs.reg

  最后,如果要使用Intel的SRS驱动,则需要:
  第一,将Intel的SRS驱动文件,即iaStor.sys,复制到C:\\Windows\\System32\\drivers下;
  第二,导入上述注册表。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-11 15:58:32 | 显示全部楼层
3.5 本章总结

  SRS驱动被誉为高手手中的“圣物”,原因有如下几点:
  (1)很多所谓的技术员就没搞清楚磁盘控制器与磁盘是什么关系,天天盯着磁盘看,出点问题就了了一句“不支持SATA硬盘”带过,从未涉及问题的深层,从未了解问题的根本。
  (2)很多高手对SRS驱动的制作保密。
  (3)SRS驱动的制作比较复杂,且容易出错。
  (4)SRS驱动的制作需要一定经验和实践的堆积才能完成。
  (5)SRS驱动的测试需要大量的时间,并需要测试者的技术水平与问题处理能力。
  但SRS驱动的制作并非“平民”不能掌握的,今与大家共同探讨SRS驱动的收集方法,为的就是大家能一起交流SRS驱动,创建更好的技术研讨氛围。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

蓝色动力网络微信平台
网站管理,业务合作联系邮箱: admin#lansedongli.com    QQ:13412492 限网站业务问题.
网站帐号、密码、密保找回请使用注册邮箱,发送邮件至 password#lansedongli.com ,否则不予受理.
免责声明:本论坛所有文字和图片仅代表其个人观点.
本站某些资料或文章来自于互联网,不代表本站观点,如果侵犯了您的权益,请来信告知,我们会在三天内删除.
为了给大家一个更好的交流场所,请勿在本论坛发表与中华人民共和国法律相抵触的言论,请合作,谢谢!
Copyright © 2007-2019 Corporation Powered by网吧系统 版权所有    转载请注明!
浙ICP备11043737号 程序:Discuz! x3.4

湘公网安备 43018102000145号

手机版|Archiver|蓝色动力网络   

快速回复 返回顶部 返回列表