3.4 制作SRS驱动 . F$ I( W& r2 M+ }5 w % ~6 r4 K' ^$ f* j (1)系统关键设备部分 6 ^" K( J) _1 O0 B 关键设备数据库(CriticalDeviceDatabase,简称CDDB)存储在:( ^7 s; m! c4 ?) A/ l HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase7 e% I- ?' p: [0 o( I( x 其下包含了所有系统关键设备的HWID,磁盘控制器的HWID也属于此,所以需要将inf中的HWID及其相关信息写入此注册表项目下。' i R- h+ J; n, ? CDDB下的注册表项目的一般形式为:( |! j4 k% p8 O
, G$ R0 p% z7 y! V5 c. M
-
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\(硬件ID)]
- "ClassGUID"="(类的GUID)"
- "Service"="(服务名)"
复制代码 ( o4 e8 ~6 {5 _/ I- x" t 硬件ID,读取自inf中Manufacturer段规定的段,如本例中是为INTEL_HDC.ntx86段。 ?( u2 L, v Z; u 类的GUID,读取自inf中version段的ClassGuid项。: E- x9 s. N+ l* O: X 服务名,读取自inf中硬件ID对应项目的参数,如本例中读取自iaStor_Inst段的子段iaStor_Inst.Services中AddService项决定的服务名:iaStor。 / T: x: o3 E- d$ I7 X 那么PCI\VEN_8086&DEV_2681&CC_0106对应的CDDB段应该为:% E5 w3 K' m; K- w8 k1 A 7 V; ~ d) m$ D: ^2 c
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\ PCI#VEN_8086&DEV_2681&CC_0106]
- "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
- "Service"=" iaStor "
复制代码 2 w: k4 n ]& } (注意,HWID在写入注册表时“PCI”后的“\”改为“#”,以避免混淆)9 d I" d, }4 Q7 ^) A# T
6 P8 U6 H- Z7 b* I5 ]4 r (2)驱动服务部分& Y. r' p) I& \ 在3.3中已述,驱动服务是由驱动安装段的Services子段中AddService的第三个参数决定的,本例中由“iaStor_Service_Inst”段来完成。1 ^3 `3 x3 ^" @/ X1 ~ 我们把“iaStor_Service_Inst”段中由“%”包含的字符串根据“String”段的信息来替换一下,得到:' K) c2 g, _% S! d0 ]! z
$ Y' R9 L2 S# b' `( X) p* e
- [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
复制代码 . [! r" @$ B4 D) I% J& a( r. Z 将驱动inf的服务段转化为注册表时,有如下对应关系: 7 g( r! }: X8 y0 n2 u N( ?4 n$ x- \ inf中的ServiceType项对应注册表中的Type项; . S& H7 z/ y$ N' J0 P# r5 }8 N inf中的StartType项对应注册表中的Start项;+ D/ Y# B K3 K inf中的ErrorControl项对应注册表中的ErrorControl项; 6 b; G9 b$ u9 W4 l% I! J inf中的ServiceBinary项对应注册表中的ImagePath项; 8 v: e3 V7 v; F& t2 O4 O inf中的LoadOrderGroup项对应注册表中的Group项。1 x( {' f1 S' a# I5 B7 E F / ^: A$ q2 J7 |. d4 ] 说明:& b. g0 h3 I; [/ g" t7 x DisplayName,由于我们是在制作SRS驱动,一般而言此值没有具体作用,所以无需转化;6 v" |' b% R. h1 v& z9 ?, R ServiceType、StartType、ErrorControl在注册表中为“REG_DWORD”类型,写入注册表时,如果其值为非二进制,则需要将其值转为二进制;- b* g8 {# M3 x C ServiceBinary的注册表项目类型为“REG_EXPAND_SZ”,需要将它的字符串内容完全转化为二进制内容;& p- i! K: f7 U+ a/ s AddReg段是个需要商榷的段,在有些磁盘控制器中这个不是必须的(如Intel),而有些磁盘控制器则是必须的(如nVIDIA),所以我们一般还需将AddReg所规定段的内容进行转化。2 \# o, {5 e9 D- v+ ]5 a& O
- r) S3 U7 v1 s1 C SRS驱动服务部分一般形式为:0 J8 A- Q# M/ s2 u, m& w
7 S8 m- I. s3 Q \/ y
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\(服务名)]
- "ErrorControl"=
- "Group"=""
- "Start"=
- "Type"=
- "ImagePath"=
复制代码 2 u3 H# J6 C" u8 j1 A 经过转化后,iaStor服务在注册表中的形式为: ) Q0 t" }- ~- ?, p
- [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
复制代码 . Z- B. @1 e9 g0 [8 q$ e2 y& g (3)驱动服务的附加注册表项 ( T1 R* \1 [7 G6 X 9 v& l5 N" Q) h( E: } 在(2)中已经说到了服务创建段中的AddReg项,例如AddReg =iaStor_parameters_AddReg。我们在inf中寻找AddReg所规定的段,即“iaStor_parameters_AddReg”。 : q, q( F9 d0 J 一般来说,只有注册表附加项中的“Parameters”才是必要的添加项目。如:( {3 u* ]4 x$ s+ ~
' Q& {, R' T3 W8 l& J
- [iaStor_parameters_AddReg]
- HKR,Parameters,queuePriorityEnable,%REG_DWORD%,0
- HKR,Parameters,BusType,0x00010001,0x0000003
复制代码 & R, ?- {9 F! S$ l1 i+ k$ E 第一个参数HKR:服务所在键。 - y d( @) n# u+ \- f( u4 A 第二个参数Parameters:服务所在键下的Parameters子键。% g' z( W' B6 r, s5 ]2 | 第三个参数,一般规定要建立名为什么的项,如这里的queuePriorityEnable项和BusType项。( @. `% I& r- z" c, z+ P 第四个参数,所创建项的类型,如果使用“%”包含则取string段寻找对应值。一般而言,0x00020000是REG_EXPAND_SZ类型,0x00010001是REG_DWORD类型。7 B9 E- d( m& j7 d, n) J 第五格参数,所创建项的值,请根据项的类型进行转化,如将十进制转化为二进制。. L8 O2 a6 {! r* G x! ?$ u7 A" n , A/ A0 X- V8 p V, w" i 将上述inf内容按照刚才所讲的规则进行转化后为:5 c5 a& R$ N! D. |+ P
4 s$ Y" ]' v) b I. M( Y( A
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\iaStor\Parameters]
- "queuePriorityEnable"=dword:00000000
- "BusType"=dword:00000003
复制代码 + X" c! n) V; J (4)驱动文件 ) k8 [& H/ J4 P: `4 D 折腾了这么多,别忘记了我们的主角——驱动文件。将对应的驱动文件放置到ImagePath(inf中ServiceBinary)所规定的位置。在此例中,需要将iaStor.sys放置到System32\drivers中(假设C盘是系统盘),完整路径为:C:\Windows\System32\drivers\iaStor.sys。" {9 k5 q3 I. P8 B0 i" W 2 M7 U/ @1 ?4 S, ^3 } 经过一番努力,我们完成了Intel Rapid Storage Technology 驱动的AHCI部分从一般驱动向SRS驱动的转化,转化为注册表文件后如下:: ~6 \9 Q# w$ B9 {
/ l2 A ^( z9 j
- 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
复制代码 & i# @9 a- A0 N8 } 将此注册表文件保存,例如Intel_Srs.reg + {) M5 v6 i! E. V8 S$ Q+ o 0 l6 r5 n' Z' u' E1 T1 `; V" o3 Y7 P 最后,如果要使用Intel的SRS驱动,则需要:+ T( C+ H y$ M0 T" l9 D 第一,将Intel的SRS驱动文件,即iaStor.sys,复制到C:\Windows\System32\drivers下;8 o& h1 ^; ^6 a! T# L0 U 第二,导入上述注册表。 , H) N- N w1 K0 z/ F |