1、(一)概念关于磁盘控制器驱动,这似乎是个老生常谈的问题了。从大概两年前我就一直在努力的纠正“SATA 驱动、串口驱动”这些概念错误,但效果不佳,直至今日仍有部分技术人员将这些具有很大偏颇性的词语挂在嘴边,乃至误导更多的新手。所以今天我会再次重复强调一下“磁盘控制器” 和“ 磁盘控制器驱动 ”的概念,新手请务必读懂,老手也有必要进行重温。什么是磁盘控制器?从字面上也大概可以看出,磁盘控制器的作用是管理和控制磁盘。这里的“磁盘”是一个广义的概念,泛指现在常用的机械硬盘和固态硬盘。磁盘控制器有集成于主板上的,也有独立的(如各类 SCSI 卡) ,而且磁盘控制器是由来已久的,不是到“SATA 时代”才
2、开始出现的。我们这里一定要搞清楚三个问题:1、磁盘控制器与磁盘无关。系统是通过磁盘控制器来识别磁盘的,所以磁盘控制器上的磁盘无论是什么样子(无论是 PATA、SATA、RAID、SCSI 以及等等)系统是绝对不会操心的,系统唯一关心的是它能否识别磁盘控制器,如果能识别磁盘控制器那么磁盘控制器就会告诉系统怎么去管理磁盘。这就好像以为领导要找一份档案材料,他只要找的到档案室的管理员就可以,至于这个档案室管理员去什么样的档案柜上怎么去找档案材料,领导是无需担心的。就像系统无需操心磁盘类型是一样的。原版系统中(无论是 WINXP 还是 WIN7)都会包含一定量的磁盘控制器驱动,这些驱动可以应付部分磁盘
3、控制器,而且一般而言,应付并口磁盘控制器是没有什么问题的。但随着时间的推移,随着新硬件和新磁盘控制器的推出,系统自带的磁盘控制器驱动会越来越显得单薄,这就是为什么我们在系统封装与部署时必须增补额外磁盘控制器驱动的原因。2、磁盘控制器驱动是针对磁盘控制器的。上文已述,系统并不关心磁盘是什么样的,而系统只需要能够控制磁盘控制器就可以了。那么系统要怎么才能拥有对磁盘控制器的控制能力?答案就是通过驱动程序。系统通过磁盘控制器驱动获得对磁盘控制器的控制能力,从而控制磁盘。3、磁盘控制器工作模式与磁盘类型无关。现在硬盘的各种标识让人眼花缭乱,而各种关于磁盘控制器工作模式的描述又让人产生各种混淆,SATA
4、、SATAII 、AHCI、RAID 以及等等,但我这里要说的是,你的硬盘是 SATA 那么系统就真的把你的硬盘当做 SATA 了吗?答案为否。刚才已经说了,系统通过磁盘控制器了解磁盘,而磁盘控制器又有着多种工作和控制模式。在 CMOS 里我们可以看到对磁盘控制器的设置,大多磁盘控制器拥有多种工作模式,例如 IDE 模式、 AHCI 模式、RAID 模式等等。如果你是一个 SATA 硬盘,而磁盘控制器开启的是 IDE 模式,那么很遗憾,系统仅仅把你的硬盘当做普通 IDE 硬盘来对待。建议,如果您的硬盘支持更高级的工作模式,请把 CMOS 里的设置也相应调整以提高磁盘性能。说完这些概念,我请大家
5、在今后不要再谈论所谓“SATA 硬盘驱动”了,这句话带有很大的错误性,并容易误导更多的新手!(二)磁盘控制器驱动封装用磁盘控制器驱动(俗称 SRS 驱动)和即插即用磁盘控制器驱动还是有区别的。封装用磁盘控制器驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统就无法控制磁盘控制器,从而无法操作磁盘,结果就是造成系统的宕机。即插即用磁盘控制器驱动则不同,它就像显卡和声卡的驱动一样,不安装仅仅是无法发挥硬件的最大效能而已,例如显卡驱动不装各种效果无法开启、声卡驱动不装会无声音等。但封装用磁盘控制器驱动和即插即用磁盘控制器驱动本身是无区别的,所以这只是同一种驱动的两种
6、工作模式罢了。那么封装用磁盘控制器驱动是怎么工作的呢?1、系统启动时检测系统关键设备列表,并准备将这个列表中的设备启动起来,这个列表在注册表中的:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabase打开 CriticalDeviceDatabase 键,其下是所有系统关键设备的硬件 ID。而我们看一个一硬件 ID 名命名的键,一般包括 ClassGUID 和 Service 子键,键值为拥有此硬件 ID 的设备的设备所属类和所调用的系统服务。如果当前磁盘控制器存在于系统关键设备中,那么就根据磁盘控制器硬件 ID 的
7、 Service键去寻找它所需要使用的服务。而如果当前磁盘控制器不存在于系统关键设备中,则直接蓝屏宕机。2、使用磁盘控制驱动服务,系统的所有服务都位于:HKEY_LOCAL_MACHINESYSTEMControlSet001Services当然也包括磁盘控制器驱动的服务。而如果当前磁盘控制器所需要的驱动服务并不存在,则直接蓝屏宕机。我们打开一个磁盘控制器驱动的服务,这个服务包括很多子键,但其中较为重要的是ImagePath 和 Start,它们分别规定了本服务要加载哪个驱动文件和本服务的启动方式。3、加载磁盘控制器驱动文件,启用磁盘控制器。由启动的磁盘控制器驱动服务决定加载哪个驱动文件,这些
8、驱动文件一般都位于 C:WindowsSystem32drivers 中,而如果这个驱动文件在被加载的时候不存在,则直接蓝屏宕机。通过如上描述,我们发现了如下一个过程:系统关键设备设备驱动服务设备驱动文件。(1)当前磁盘控制器是否属于系统关键设备,不属于则宕机,属于则根据系统关键设备列表中的相应描述,去寻找这个磁盘控制器所对应的驱动服务;(2)如果找不到这个磁盘控制器所对应的驱动服务,则宕机,找得到则根据驱动服务中规定的驱动文件,去寻找这个磁盘控制器所对应的驱动文件;(3)如果找不到驱动文件,则宕机,找得到则使用此驱动控制磁盘控制器。这是个连贯的过程,哪一个环节出现问题,最终的结果都是宕机。(
9、三)INF 阅读术阅读驱动的 INF 文件需要一定的经验积累,同样也需要一定的尝试和失败,所以我这里只能以制作封装用磁盘控制器驱动为目的的 INF 阅读方法。以下我以 INTEL AHCI 磁盘控制器驱动为例介绍,INTEL 的驱动写的标准且简介,而且 INTEL 驱动本身是最为稳定的,建议新手练手时选取 INTEL 的驱动。1、读出驱动所属类versionCatalogFile=iaAHCI.catSignature=“$WINDOWS NT$“Class=hdcClassGuid=4D36E96A-E325-11CE-BFC1-08002BE10318Provider=%INTEL%Dri
10、verVer=06/04/2009,8.9.0.1023version 段一般在驱动 INF 的开头处,Class 即为本驱动所属类,而ClassGuid 是这个类的 GUID。驱动所属类是个重要的信息,在我们制作封装用磁盘控制器驱动的系统关键设备部分有着很重要的地位。2、读出哪些硬件 ID 对应本驱动,而每个硬件 ID 又使用了哪个驱动服务这一般需要去读两个段,一个是:Manufacturer%INTEL%=INTEL_HDC,ntx86Manufacturer 段规定了如下哪个段是用来记录驱动描述、所用服务、驱动 ID的。“INTEL_HDC”是主段名,“,”后面的是附加段名。例如在这个描
11、述中,如下可能有两个段包括驱动描述、所用服务和驱动 ID 信息:INTEL_HDC 段,或INTEL_HDC. ntx86 段。INTEL 的磁盘控制器是一体化的驱动,从 XP 到 WIN7 用的驱动是相同的,所以它的 Manufacturer 段的内容比较简单。有些驱动针对不同系统是分开的,可能会有针对 XP 和 WIN7 的不同设置,请根据实际情况进行应变。另一个需要我们阅读的段十分重要,这个段也是由 Manufacturer 段规定出来的:INTEL_HDC.ntx86%PCIVEN_8086&DEV_2681&CC_0106.DeviceDesc% = iaStor_Inst, PCI
12、VEN_8086&DEV_2681&CC_0106%PCIVEN_8086&DEV_27C1&CC_0106.DeviceDesc% = iaStor_Inst,PCIVEN_8086&DEV_27C1&CC_0106%PCIVEN_8086&DEV_27C5&CC_0106.DeviceDesc% = iaStor_mobl_Inst,PCIVEN_8086&DEV_27C5&CC_0106%PCIVEN_8086&DEV_2821&CC_0106.DeviceDesc% = iaStor_Inst, PCIVEN_8086&DEV_2821&CC_0106%PCIVEN_8086&DEV_
13、2829&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCIVEN_8086&DEV_2829&CC_0106%PCIVEN_8086&DEV_2922&CC_0106.DeviceDesc% = iaStor_Inst, PCIVEN_8086&DEV_2922&CC_0106%PCIVEN_8086&DEV_2929&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCIVEN_8086&DEV_2929&CC_0106%PCIVEN_8086&DEV_3A02&CC_0106.DeviceDesc% = iaStor_I
14、nst, PCIVEN_8086&DEV_3A02&CC_0106%PCIVEN_8086&DEV_3A22&CC_0106.DeviceDesc% = iaStor_Inst, PCIVEN_8086&DEV_3A22&CC_0106%PCIVEN_8086&DEV_3B29&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCIVEN_8086&DEV_3B29&CC_0106%PCIVEN_8086&DEV_3B2F&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCIVEN_8086&DEV_3B2F&CC_0106%P
15、CIVEN_8086&DEV_3B22&CC_0106.DeviceDesc% = iaStor_Inst, PCIVEN_8086&DEV_3B22&CC_0106“=”前的部分是关于这个驱动的文字描述,我们可以在 INF 的 String 段里看到,不过这个对我们制作封装用磁盘控制器驱动基本没什么作用。“=”后的部分,“,”前是针对本硬件 ID 哪些段对它进行了处理,例如“iaStor_Inst”,如下各段中凡以此开头的,都是针对本硬件 ID 的处理,包括为本硬件 ID 添加哪个服务。“=”后的部分,“,”后是磁盘控制器的硬件 ID,如“PCIVEN_8086&DEV_3B29&CC_01
16、06”。这些磁盘控制器的硬件 ID 将在随后被我们添加到封装用磁盘控制器驱动的系统关键设备中,而它们所对应的服务将是我们下一步阅读的目标。3、读出硬件所对应的服务。在刚才的 INTEL_HDC.ntx86 段中,我们获得了本驱动可支持的硬件 ID 列表,现在我们要把这些 ID 对应的服务找出来。例如:%PCIVEN_8086&DEV_3A22&CC_0106.DeviceDesc% = iaStor_Inst, PCIVEN_8086&DEV_3A22&CC_0106规定了 PCIVEN_8086&DEV_3A22&CC_0106 的各类操作由 iaStor_Inst 相关段决定,那我们就去寻
17、找 iaStor_Inst 的相关段,直到找到:iaStor_Inst.ServicesAddService = iaStor, %SPSVCINST_ASSOCSERVICE%, iaStor_Service_Inst, iaStor_EventLog_Inst本段中决定要添加一个服务(AddService),名为“iaStor”,添加方法由“iaStor_Service_Inst”段决定,添加的事件日志由“iaStor_EventLog_Inst”段决定。随后我们找到“iaStor_Service_Inst”段。iaStor_Service_InstDisplayName = %*PNP0
18、600.DeviceDesc%ServiceType = %SERVICE_KERNEL_DRIVER%StartType = %SERVICE_BOOT_START%ErrorControl = %SERVICE_ERROR_NORMAL%ServiceBinary = %12%iaStor.sysLoadOrderGroup = SCSI MiniportAddReg = iaStor_parameters_AddRegDisplayName,服务的显示名,这对我们制作封装用磁盘控制器驱动没太大关系。ServiceType,服务的类型,这里是“内核级驱动”。StartType,服务启动类型
19、,这里是“随系统启动”。ErrorControl,报错类型,这里是“一般性报错”。ServiceBinary,这个其实是驱动文件的位置,%12%代表 System32drivers,则完整驱动文件路径为“System32driversiaStor.sys”。LoadOrderGroup,驱动所属的组。AddReg,这一般是为本服务额外添加的注册表键和键值。通过阅读这些,我们知道了硬件 ID 为“PCIVEN_8086&DEV_3A22&CC_0106”的设备所需服务的基本概况,特别是我们得知了这个驱动服务所加载的驱动文件名称及位置。以此类推,解决其他的硬件 ID。从 INF 里读到了这些信息,
20、我们就可以着手制作 WIN7 的封装专用磁盘控制器驱动了(四)制作封装专用磁盘控制器驱动制作封装专用磁盘控制器驱动其实就是一个将 INF 转成 REG 的过程,曾经有过这种工具,但我个人并不建议大家使用。如果使用者并不明白 INF 转REG 的真正原理,就很难了解这项技术的真正内在本质,更难于在出现问题时能够独立解决,这个技术的公共交流带来了很多不便。本节内容我会和大家一起亲手将 INTEL AHCI 磁盘控制器驱动的 INF 转成封装用的 REG 文件,以让大家更加了解这项技术的本质。上文中,我们已经介绍了 INF 阅读的基本方法,下面我们来对 INF 进行一下转化。1、系统关键设备部分这部
21、分的注册表键和键值遵守如下样式:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabase(硬件 ID)“ClassGUID“=“(类的 GUID)“Service“=“(对应的服务名)“硬件 ID,读取自 INTEL_HDC.ntx86 段,例如“PCIVEN_8086&DEV_2922&CC_0106”类的 GUID,读取自 version 段,“ClassGuid=4D36E96A-E325-11CE-BFC1-08002BE10318”对应的服务名,读取自 INTEL_HDC.ntx86 段,由“PCIVEN_8
22、086&DEV_2922&CC_0106”对应的 iaStor_Inst 段所派生的iaStor_Inst.Services 决定服务名,为“iastor”。那么“PCIVEN_8086&DEV_2922&CC_0106”的系统关键设备部分注册表应该写为:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabase PCI#VEN_8086&DEV_2922&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“ iastor “(注意硬件 I
23、D 中的“”变为“#”)以此类推,将其他硬件 ID 的系统关键设备的注册表键和键值写完。2、驱动服务部分上文说过,驱动服务部分由 iaStor_Service_Inst 来定,服务部分的注册表写起来比较容易,但要注意对应关系,即 INF 中的名字和 REG 中的名字不同。回顾一下 iaStor_Service_Inst 段,依据此段写封装用磁盘控制器驱动的驱动服务时,不是所有的部分都需要,我将它简化一下:iaStor_Service_InstServiceType = %SERVICE_KERNEL_DRIVER%StartType = %SERVICE_BOOT_START%ErrorCon
24、trol = %SERVICE_ERROR_NORMAL%ServiceBinary = %12%iaStor.sysLoadOrderGroup = SCSI MiniportINF 中带有“%”的部分,在 INF 的 String 段有期对应的值,最简单的方法可以全文搜索一下两个“%”之间的内容,即会找到他们对应的值。如本例中,替换为值后为:iaStor_Service_InstServiceType = 1StartType = 0ErrorControl = 1ServiceBinary = system32driversiaStor.sysLoadOrderGroup = SCSI
25、Miniport这些部分在注册表中分别对应:INF 中的 ServiceType 对应注册表中的 Type;INF 中的 StartType 对应注册表中的 Start;INF 中的 ErrorControl 对应注册表中的 ErrorControl;INF 中的 ServiceBinary 对应注册表中的 ImagePath;INF 中的 LoadOrderGroup 对应注册表中的 Group。而服务部分的一般样式为:HKEY_LOCAL_MACHINESYSTEMControlSet001Services(服务名)“ErrorControl“=“Group“=“ImagePath“=“S
26、tart“=“Type“=则我们转化后为:HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesiaStor“ErrorControl“=dword:00000001“Group“=“SCSI Miniport“ImagePath“=“system32driversIaStor.sys“Start“=dword:00000000“Type“=dword:00000001这样,服务部分我们也搞定了。3、驱动文件差点忘记了,不要忘记把驱动程序文件“IaStor.sys”也提取出来,在执行系统封装时复制到“ImagePath”所规定的位置即可。经过全部过程后,我们
27、可以制作出来一份 INTEL AHCI 磁盘控制器的封装用磁盘控制器驱动了!这份驱动的注册表文件为:HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_2681&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_27C1&
28、CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_27C5&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDataba
29、sepci#VEN_8086&DEV_2821&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_2829&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001Con
30、trolCriticalDeviceDatabasepci#VEN_8086&DEV_2922&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_2929&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHI
31、NESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_3A02&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_3A22&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=
32、“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_3B29&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_3B2F&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC
33、1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#VEN_8086&DEV_3B22&CC_0106“ClassGUID“=“4D36E96A-E325-11CE-BFC1-08002BE10318“Service“=“iaStor“HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesiaStor“ErrorControl“=dword:00000001“Group“=“SCSI Miniport“ImagePath“=“system32driversIaStor.sys“Start“=dword:00000000“Type“=dword:00000001至此,我们学会了制作封装用磁盘控制器驱动的方法。制作封装用磁盘控制器驱动需要长期的实践和总结,也需要经历无数的失败才能成就最后的成功!INTEL WIN7 磁盘控制器驱动: DRVINTEL.7z (334.39 KB, 下载次数: 629) INTEL WIN7 封装用磁盘控制器驱动: SRSIntel.7z (155.49 KB, 下载次数: 485, 售价: 10 个金币) 支持天空联盟,请单击 http:/
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。