|

楼主 |
发表于 2010-4-11 15:54:07
|
显示全部楼层
3.4 制作SRS驱动
(1)系统关键设备部分
关键设备数据库(CriticalDeviceDatabase,简称CDDB)存储在:
HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase
其下包含了所有系统关键设备的HWID,磁盘控制器的HWID也属于此,所以需要将inf中的HWID及其相关信息写入此注册表项目下。
CDDB下的注册表项目的一般形式为: -
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\(硬件ID)]
- "ClassGUID"="(类的GUID)"
- "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段应该为:-
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\ PCI#VEN_8086&DEV_2681&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"=" iaStor "
复制代码 注意,HWID在写入注册表时“PCI”后的“\\”改为“#”,以避免混淆)
(2)驱动服务部分
在3.3中已述,驱动服务是由驱动安装段的Services子段中AddService的第三个参数决定的,本例中由“iaStor_Service_Inst”段来完成。
我们把“iaStor_Service_Inst”段中由“%”包含的字符串根据“String”段的信息来替换一下,得到:- [iaStor_Service_Inst]
- DisplayName = "Intel AHCI Controller"
- ServiceType = 1
- StartType = 0
- ErrorControl = 1
- ServiceBinary =system32\\drivers\\iaStor.sys
- LoadOrderGroup = SCSI Miniport
- 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驱动服务部分一般形式为:- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\(服务名)]
- "ErrorControl"=
- "Group"=""
- "Start"=
- "Type"=
- "ImagePath"=
复制代码
经过转化后,iaStor服务在注册表中的形式为:- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor]
- "ErrorControl"=dword:00000001
- "Group"="SCSI Miniport"
- "Start"=dword:00000000
- "Type"=dword:00000001
- "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”才是必要的添加项目。如:
- [iaStor_parameters_AddReg]
- HKR,Parameters,queuePriorityEnable,%REG_DWORD%,0
- HKR,Parameters,BusType,0x00010001,0x0000003
复制代码
第一个参数HKR:服务所在键。
第二个参数Parameters:服务所在键下的Parameters子键。
第三个参数,一般规定要建立名为什么的项,如这里的queuePriorityEnable项和BusType项。
第四个参数,所创建项的类型,如果使用“%”包含则取string段寻找对应值。一般而言,0x00020000是REG_EXPAND_SZ类型,0x00010001是REG_DWORD类型。
第五格参数,所创建项的值,请根据项的类型进行转化,如将十进制转化为二进制。
将上述inf内容按照刚才所讲的规则进行转化后为:
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor\\Parameters]
- "queuePriorityEnable"=dword:00000000
- "BusType"=dword:00000003
复制代码 (4)驱动文件
折腾了这么多,别忘记了我们的主角——驱动文件。将对应的驱动文件放置到ImagePath(inf中ServiceBinary)所规定的位置。在此例中,需要将iaStor.sys放置到System32\\drivers中(假设C盘是系统盘),完整路径为:C:\\Windows\\System32\\drivers\\iaStor.sys。
经过一番努力,我们完成了Intel Rapid Storage Technology 驱动的AHCI部分从一般驱动向SRS驱动的转化,转化为注册表文件后如下:- Windows Registry Editor Version 5.00
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2681&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_27C1&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_27C5&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2821&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2829&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2922&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_2929&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3A02&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3A22&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B29&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B2F&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CriticalDeviceDatabase\\PCI#VEN_8086&DEV_3B22&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"="iaStor"
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor]
- "ErrorControl"=dword:00000001
- "Group"="SCSI Miniport"
- "Start"=dword:00000000
- "Type"=dword:00000001
- "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
- [HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\iaStor\\Parameters]
- "queuePriorityEnable"=dword:00000000
- "BusType"=dword:00000003
复制代码 将此注册表文件保存,例如Intel_Srs.reg
最后,如果要使用Intel的SRS驱动,则需要:
第一,将Intel的SRS驱动文件,即iaStor.sys,复制到C:\\Windows\\System32\\drivers下;
第二,导入上述注册表。
|
|