电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 793 人浏览分享

《封装志》-3.磁盘控制器驱动

 关闭 [复制链接]
793 6
第三章、磁盘控制器驱动
. d4 ~$ W! S1 |' Q
6 x7 e3 m( e1 A! \; {" [- s- D/ J
  3.1 磁盘控制器相关知识7 F4 `" u! |0 t5 V6 u! v7 p2 g, Z

# b0 d. N6 W" ^5 L  (1)磁盘控制器$ E/ l! D+ h" F4 X
  磁盘控制器,顾名思义,是磁盘的控制设备。这里的磁盘是个广义的概念,泛指目前的机械硬盘、固态硬盘等各种存储体。“磁盘控制器”一词来源于微软官方文档中的“大容量磁盘控制器”,由于当今普通用户的磁盘容量都已达到TB级,故去掉“大容量”三个字以避免混淆。
7 o1 Y- J5 [5 T  大多数人过于关注磁盘的类型,往往忽略了最重要的磁盘控制器。随着磁盘技术的发展,各种类型的磁盘琳琅满目,如IDE、SATA、SCSI、SAS硬盘等等,加上新生代固态硬盘,可谓是种类繁多。但Windows操作系统真的关心磁盘类型吗?No,Windows操作系统只关心磁盘控制器的类型和磁盘控制器的工作模式!
+ |$ V1 b1 c9 D  j# `" }
) e  G0 q) k7 F7 n: q1 U% N2 f* I8 T  (2)磁盘控制器驱动
! F# ~% ?9 C! ^/ {- H( Y  驱动程序是硬件与系统之间的桥梁,系统通过驱动程序控制和管理硬件,并通过驱动程序发挥出硬件的最佳能力。而磁盘控制器驱动程序是系统与磁盘控制器之间的桥梁,系统通过磁盘控制器驱动管理磁盘控制器,又通过磁盘控制器管理磁盘。
0 r: W" Z5 G; V2 ]  这也就是为什么系统不关心磁盘类型的原因,系统只要能够通过驱动操作磁盘控制器,那么对硬盘的管理完全由磁盘控制器承担。举例子说,就像我去图书馆借书,我只要告诉图书管理员我需要什么书,图书管理员就会帮我找到这本书,而我无需了解这本书存放在哪个书架、归在哪个分类里。这里的“我”相当于系统,“图书馆管理员”相当于磁盘控制器,而“图书馆”就是磁盘。虽然这不是个特别恰当的例子,但是基本与系统、磁盘控制器、磁盘之间的关系吻合。* Q* a4 l- @  A3 p2 f% A' v% q8 ?8 t' E
  这里,我们必须还要明确,磁盘控制器驱动是针对磁盘控制器的,而不是针对磁盘的。尽管多年来我一直在努力纠正这个概念,但很多技术员仍将“SATA硬盘驱动”、“串口驱动”等名词挂在嘴上,误导了很多新手。那为什么有时系统会无法在SATA硬盘的计算机上部署呢?这是因为系统映像中没有包含此目标计算机的磁盘控制器驱动,没有匹配的驱动则系统就无法管理磁盘控制器,从而无法执行对磁盘的管理,所以造成的系统部署失败。
# N) M% r" Z  V+ _! Q2 Z  看到这里,请以后不要将“SATA硬盘驱动”挂在嘴边了,这会误导更多的新手。
9 v- l9 z& U- w  g: I* }
. E+ b  {6 N# a$ g5 w8 g8 q  (3)“两种”磁盘控制器驱动
8 n1 B) C+ Z& k5 g% W/ B1 H% g) W  磁盘控制器驱动分为“两种”,一种是使系统可以正确识别磁盘控制器以部署系统的驱动,一种是让系统可以更好的控制与管理磁盘控制器的驱动。其实这“两种”驱动是同一类驱动,只不过是不同的工作时机、不同的工作模式罢了。通常前者被俗称为“SRS驱动”,而后者被称为“PNP(即插即用)驱动”。
# f3 w( V: j* G8 v4 v" g3 H  前者属于系统关键设备驱动,让系统能够启动,以不至于宕机蓝屏;后者就像你的显卡与声卡驱动一样,为的是能够让硬件更好的发挥其性能。
3 J5 \' r- A: c6 I; h4 c
* b  @- O; q: ~% k! w, T# g% t  (4)磁盘控制器工作模式
! ~1 i7 `% i- s$ P: _$ X  N$ [3 i/ v- ]  磁盘控制器工作模式一般有:IDE(PATA)、SATA、AHCI、RAID等,而磁盘控制器工作模式与磁盘类型是基本无关的。这也就是说,即使你是SATA的硬盘,而如果磁盘控制器开启的是IDE工作模式,那么系统也仅仅把你的SATA硬盘当做一个IDE硬盘来对待。
( \# B0 c2 i* T: A  同一个磁盘控制器可能会存在多种工作模式,例如同时拥有PATA、AHCI和RAID工作模式,一般可以在CMOS中进行设置。而每种工作模式下磁盘控制器的硬件ID又是不同的,也就是说虽然磁盘控制器还是这个磁盘控制器,但由于它工作模式的变更,它的硬件ID也随之变更,那么就需要为它重新安装磁盘控制器驱动。( {, M  Z0 I& @& T% p$ k
  这样也从另外一个角度解释了为什么系统安装完毕后,如果更改磁盘控制器工作模式,会造成蓝屏的问题。例如安装系统时,磁盘控制器工作模式为SATA,系统为磁盘控制器安装的是SATA模式的驱动,而一旦磁盘控制器工作模式改为了AHCI,由于系统里针对磁盘控制器的驱动仍是SATA模式的,系统无法正常操作磁盘控制器,所以就出现蓝屏宕机的情况。
% r- Y( q) l. K# K0 |0 l# Y3 R  P
2 \4 K, O! l( r: v6 x" L  Q, n  (5)“SRS驱动”
( J1 n6 b& T& b/ A0 t* Z9 c; Q  SRS驱动是对“封装专用磁盘控制器驱动”的简称,SRS驱动最早是指磁盘控制器SATA、RAID和SCSI工作模式的驱动,时过境迁,新的AHCI模式已出,SCSI模式已被SAS模式取代,但由于SRS驱动是我们长期以来的简称,很多情况下仍旧在使用,所以我们保留这个名词并继续使用。
! X! F: }  a4 @( I+ ^/ R  SRS驱动泛指用于拓展系统部署范围的磁盘控制器驱动,而由于这个驱动经常是在系统封装时导入的,所以也称为“封装专用磁盘控制器驱动”。所以如果您在本书中看到关于“SRS驱动”的说法,只要知道它代表的是什么就可以了,它本身的含义已经被大大的扩充了。
( M  ~3 N" Z  ~" m8 i1 B; D
. _6 ~- p! Z0 a+ Z0 J  (6)IDE硬盘也需要磁盘控制器驱动?
8 g* H  z& o0 [1 w! C4 S  ~  这个问题本身就带有谬误,前文已述,磁盘控制器驱动针对的是磁盘控制器,而不是硬盘,所以无论硬盘如何,都是需要磁盘控制器驱动的。那为什么我们通常不太考虑磁盘控制器IDE工作模式时的驱动呢?这是因为Windows操作系统会自带大多数磁盘控制器IDE工作模式的驱动。" b* [. B5 O) ]' J; r
  另外一个层面上讲,如果把IDE硬盘接入到一个支持其他工作模式的磁盘控制器上,如RAID工作模式,由于IDE工作模式的磁盘控制器驱动无法驱动此RAID工作模式,从而系统无法识别此IDE硬盘。
, p' j+ n. A9 W+ N! f8 N$ }* V/ E" z+ m0 }& L' k/ u
  (7)系统自带磁盘控制器驱动
* |9 v6 K9 r2 w2 w  Windows XP和Windows 7都自带了一定量的磁盘控制器驱动,都包括了其发行时常见的磁盘控制器的驱动。这些驱动中包括了最常见磁盘控制器IDE模式、SATA模式、AHCI模式的驱动,还包括部分RAID模式、SCSI模式和SAS模式的驱动。这也就是为什么一个系统映像不额外添加SRS驱动也能具有一定的系统部署范围的原因。
8 H% v! y# I: Q/ t  g8 N0 H  但随着时间的推移,拿WinXP为例,2001年时其自带的磁盘驱动也几乎是无所不能的,但在2010年的今天,WinXP如果不额外集成SRS驱动几乎是寸步难行的。Win7也一样,虽然现在可以应付大多数磁盘控制器,但随着时间的推移也会和WinXP一样。( a- ~6 M5 U8 ]. t$ W& W1 l% y' y
  所以,为系统增补额外的SRS驱动是势在必行的。

评论 6

电脑疯子 电脑疯子  管理员  发表于 2010-4-17 06:10:32 | 显示全部楼层
 3.2 磁盘控制器驱动的工作流程
* R  D2 J# O, n' e% I. j; P
2 ^; a; L. P0 f- ?# H" `% |8 u8 v  这里的磁盘控制器驱动指的是SRS驱动,即用于拓展系统部署范围的磁盘控制器驱动。SRS驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统将无法控制磁盘控制器,从而无法操作磁盘,结果一般会造成系统宕机。
" \/ k3 q2 f8 _8 o. ]; w/ u) t4 O. e& k! J1 R" I% e) C
  那么SRS驱动的工作流程是怎么样的?一般而言分三步:& C; K$ R( N* ]% q
0 a2 F  N: o! h# K
  第一步,系统启动时检测系统关键设备列表。
" X, H* X& e% i; y7 A( ]  关键设备数据库位于注册表的:
. ?" w. R- I. x$ h  c  HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase# k- b7 n4 o' t
  打开这个键,其下是以系统关键设备的HWID命名的各子键。每个子键一般包括ClassGUID和Service两个项,ClassGUID的值为此设备所属类,Service的值为此设备所依赖的系统服务。系统启动时,根据当前计算机磁盘控制器对应工作模式的HWID,去CriticalDeviceDatabase键下寻找是否有以其HWID命名的子键,如果有,则加载其Service键值规定的服务;如果没有,则蓝屏宕机。
% a2 x5 V6 C! j- E. s4 j, K. A& f" Y9 v) Y) d& W3 M
  第二步,使用磁盘控制器驱动服务。
2 ]- m( R+ w7 F' R# D  系统服务列表位于注册表的:
( C# l6 B: N$ o) l  HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services: K+ z5 C& A- t' B0 N$ ~9 l
  打开这个键,其下包括了当前系统所有的系统服务。(1)中所要加载的服务也位于此键下。如果(1)中所需的服务存在于此,则使用此服务;而如果不存在,则蓝屏宕机。
8 G. ?$ l. Q0 O1 y9 z/ C% U  我们打开一个磁盘控制器驱动服务,这个服务包含了很多键值,其中需要着重关注的是ImagePath和Start两个键值,ImagePath规定了此服务所需的磁盘控制器驱动文件所在位置,而Start规定了此服务的启动方式。
) x) W5 P5 k7 Z4 X  Y" o6 Y& Y: N0 _" s
  第三步,加载磁盘控制器驱动文件。# f8 s, [* M# D9 s9 h/ n0 e- f
  磁盘控制器驱动文件一般位于C:\Windows\System32\drivers(假设C盘是系统盘),且一般以.sys为后缀名。7 x* a5 b" q. o
  在(2)中所使用的服务需要ImagePath所规定的磁盘控制器驱动文件才能运行,如果此驱动文件存在,则加载使用;而如果此驱动文件不存在,则蓝屏宕机。! G5 q; [! [# H1 ]1 {9 \
1 Y3 h8 \7 t5 j, u5 r1 c
  我们根据上面的描述,总结出如下一个流程:
+ c; q# @; ?; D4 O  系统关键设备-->设备驱动服务-->设备驱动文件
3 U- `' S2 M- p6 m' G, U" ~: I  (1)当前磁盘控制器对应工作模式的HWID如果属于系统关键设备,则启用其对应的服务;而如果不属于系统关键设备,则蓝屏宕机。
; y, z  b3 p+ R4 w0 ?  U* b  (2)被要求使用的驱动服务如果存在,则尝试加载驱动文件启动;如果不存在,则蓝屏宕机。
6 u& _% G1 K# ^/ V3 x' V1 }( ?( K  (3)被要求加载的驱动文件如果存在,则加载并使用;如果不存在则蓝屏宕机。8 X3 j7 u4 u7 E  f" L6 F
这是一条紧密的链条,任何一个环节出现问题,都会造成蓝屏宕机的后果。所以在处理SRS驱动时一定要小心谨慎。

电脑疯子 电脑疯子  管理员  发表于 2010-4-17 06:12:23 | 显示全部楼层
  3.3 阅读磁盘控制器驱动的INF  H$ F. h& O# I0 \, z! ?

. k. h0 Z0 |! L  驱动程序一般包括.sys和.inf文件,大部分包括数字签名.cat文件,有些还包括.dll、.exe等驱动应用程序。就磁盘控制器文件来说,一般需要.sys和.inf文件即可使驱动正常运作。这里的.sys文件就是驱动文件本身,也是我们在3.2节中提到的最终需要加载的驱动,而.inf文件的作用则是告之系统如何使用这个驱动程序。
! Z+ F4 W& n8 }: \5 k( _  本节我们将一起阅读一下磁盘控制器驱动的.inf文件,加深对磁盘控制器驱动的理解,同时为我们下一步的制作SRS驱动作准备。建议新手在练手时选用Intel的磁盘控制器驱动,Intel的驱动写的比较工整条理,适合我们做为分析和练习的对象。! b% I+ m0 X! o: d
  本节我们将选用Intel Rapid Storage Technology Driver 9.5.0.1037版中的AHCI部分(iaAHCI.inf)作为实例进行讲解。- o+ X4 m! ?7 V4 L7 z
  虽然驱动inf包含了很多的内容,但是本节只着重讲解与SRS驱动相关的驱动inf内容,学习知识讲究把握重点,尽可能减少不相关知识的干扰。至于其他部分的内容,建议您多问问百度和谷歌,并自己体会一下。% d# b+ W5 ?$ \8 O4 s9 _; g
  另外,由于inf的阅读方法未查阅到官方文档说明,除非是开发驱动的高级技术人员,一般人很难能完全讲清一个inf中每个段的作用。下文我要讲的内容是我个人根据长时间的实践与揣摩而总结出来的,其中难免会有个别错误,还请读者见谅。但我绝对能保证大方向的正确性,还请读者放心。

9 S  N8 L+ Y+ N- Z. t6 ?, f  ^9 F  (1)version段  ~* P, t$ i9 M5 ]% [- J2 J
  Intel Rapid Storage Technology Driver 9.5.0.1037的version段如下:

& F9 o3 l) h/ P7 A' a. ^5 G) Z7 Z' D+ B; f- B8 z, e

  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
复制代码
6 {7 H9 W' u$ d4 [! c# Q" L
  version段的作用一般是介绍本驱动的相关信息:/ _' T- Q$ C$ d# ]
  CatalogFile:驱动认证文件的文件名。
% _, _4 n1 G0 V, X" S1 M2 ~  Signature:签名。/ r" `/ ?$ M( U: k; j
  Class:此驱动(或使用本驱动的硬件)所属分类,一般磁盘控制器驱动都属于hdc类或SCSIAdapter类。
& a" }' |: |8 ?& o/ T  ClassGuid:所属类的Guid,可以理解为Class所对应的数字编号。
! w% q* H4 ^! Z6 v7 Z" ]  Provider:驱动提供者。在inf文件中,凡是以“%”开头或结尾的字符串,在inf文件末的string段中都有其对应的值。如%INTEL%的对应值是“Intel”。: O$ O4 H  J: E6 u. n! r6 c$ E
  DriverVer:驱动生成时间以及驱动版本。
5 U7 m# n( H) q$ D& w  特别注意Class、ClassGuid和DriverVer,搞清楚它们可以避免不必要的麻烦。4 g0 e. P1 l( K) ~
  另外,确定本驱动可以用于源计算机的系统环境,WinXP用WinXP的驱动,Win7用Win7的驱动,一般不可混用。
6 C0 _: w6 ~5 L" @; c7 Z
  (2)Manufacturer段
! k& k0 C; Y; O8 M. ^9 Y; G  Intel Rapid Storage Technology Driver 9.5.0.1037的Manufacturer段如下:

) Q8 R: |* {) I$ F$ o) w7 \3 t: C9 V* a' |9 c7 H
  1.   [Manufacturer]
  2.   %INTEL%=INTEL_HDC,ntx86
复制代码
! E; o; ]$ ~" U4 @1 b) u" K* `
  意思是:名为%INTEL%(在此是Intel)的制造商使用了本inf的“INTEL_HDC,ntx86”段。2 y0 M% J9 e2 W/ g" b
  “INTEL_HDC,ntx86”信息本身也包含多个意思:第一个字符串,即第一个“,”之前的那个字符串,为主段名,其他的为附段名。一个主段名后可以有多个附段名,附段名间用英文逗号隔开。主段名可以单独使用,也可以与任何一个附段名结合使用,如本例“INTEL_HDC,ntx86”中,“INTEL_HDC”可以独立成为段名,也可以与附段名结合组成“INTEL_HDC.ntx86”来使用。
7 M) [4 j- k2 c- ?3 a  再举个nVIDIA的例子,“%NVIDIA%=NVIDIA, ntx86, ntx86.6.0”,其中主段名为“NVIDIA”,附段名为“ntx86”和“ntx86.6.0”,可以使用的段名有“NVIDIA”、“NVIDIA. ntx86”、“NVIDIA.ntx86.6.0”。
# s9 @' `' R+ l: R4 _; M: q& A  回到Intel的inf。通过对上文的阅读和理解,Intel Rapid Storage Technology Driver [Manufacturer]段的意思为:“名为Intel的制造商使用本inf的“INTEL_HDC”段和“INTEL_HDC. ntx86”段”。
% Q; X) E* [6 j" i. o  而后我们去查找这个两个段,发现只能找到“INTEL_HDC. ntx86”段,有时制造商为了方便拓展等理由会刻意这样安排。那我们就来看看“INTEL_HDC. ntx86”段:

; M+ Z2 O  r  y. W# M! H6 A; P" T* m% x1 o: D1 i

  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
复制代码

8 z; A. |( v4 H4 l" a  对HWID熟悉的朋友一眼就能看出来这里肯定和HWID有关,没错,的确与HWID有很大关系。这个段就是用来规定具有哪些HWID的硬件可以使用本驱动,或者说本驱动支持哪些HWID的硬件。我们抽出其中部分来讲解,如:$ i# w9 L* P* J

0 v0 |2 ~* c: T) A, N% f& F  %PCI\VEN_8086&DEV_2681&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_2681&CC_0106; I- U! K" F( Z
  “=”前的部分:对使用本HWID硬件的描述,具体描述见String段PCI\VEN_8086&DEV_2681&CC_0106.DeviceDesc项的值。  w4 Q# w7 Z4 a; d8 ]/ x
  “=”后,“,”前的部分:使用本驱动的硬件,要安装哪个段来执行驱动安装操作,这里是“iaStor_Inst”段。' |' u+ G8 ~. j/ n- }$ L' ?$ l
  “=”后,“,”后的部分:可以使用本驱动的硬件的HWID,这里是“PCI\VEN_8086&DEV_2681&CC_0106”。

( P6 r, g) G/ ]: j' G2 a+ J
. a# W6 R' C" Y6 `3 h. q3 {  (3)服务段* G) }( p) T; \3 G. W3 D$ S
  在(2)中我们已经找到了,如果要安装HWID为PCI\VEN_8086&DEV_2681&CC_0106硬件的驱动程序,要根据“iaStor_Inst”段的信息。这里的“iaStor_Inst”段是广义的,不只包含“[iaStor_Inst]”,还包含其子段(或叫做“派生段”),我们找一下它的“[iaStor_Inst.Services]”子段:
* C) d  ^8 e; e: I% [
  1.   [iaStor_Inst.Services]
  2.   AddService = iaStor, %SPSVCINST_ASSOCSERVICE%, iaStor_Service_Inst, iaStor_EventLog_Inst
复制代码

1 [  ]" Q) V; A/ Z# m5 MAddService规定了要为此驱动安装哪个服务。1 z4 v: f+ h1 \  W3 z7 b0 k0 f
  第一个参数:iaStor,为需安装服务的服务名。1 \9 b, Q1 l* B  A9 J0 |
  第三个参数:iaStor_Service_Inst,为根据“iaStor_Service_Inst”段所规定的内容安装服务。+ |% a7 v3 V8 u8 n
  我们再找到“iaStor_Service_Inst”段,看看这个驱动的服务要怎么安装。

8 `$ R: I" j# W9 p+ T. j/ C
/ C% I2 l7 n: Y4 Q
  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
复制代码
4 q6 n" R, ^: P* w1 r7 D* k
  DisplayName:服务的显示名,这个与服务名不同,在服务名不变的前提下可以根据需要有多种显示名,显示名的具体内容查阅“string”段“*PNP0600.DeviceDesc”项的内容。& S! O% g1 d8 s+ b4 @( m
  ServiceType:服务的类型,此处是“内核级驱动”,具体值见“string”段“SERVICE_KERNEL_DRIVER” 项的内容。* n- `8 D* J1 n; Y& C& G2 v
  StartType:服务的启动类型,此处是“在系统启动时即启动”,具体值见“string”段“SERVICE_BOOT_START” 项的内容。
9 l; H& C, E- @$ Y. x; E  ErrorControl:错误类型,此处是“一般性报错”,具体值见“string”段“SERVICE_ERROR_NORMAL” 项的内容。* F- C  W0 l  Z
  ServiceBinary:驱动文件所在位置,“%12%”一般代表system32\drivers目录,驱动文件完整路径为“system32\drivers\iaStor.sys”。& v; p% Z5 x% Q8 L7 i
  LoadOrderGroup:服务所属的组,这里是“SCSI Miniport”。2 B, y. w/ S' ~  I2 `3 [
  AddReg:额外需要添加的注册表项目,见“iaStor_parameters_AddReg”段的具体内容。
3 B# [" Y+ F1 ?! r! p
到这里,这个inf就算基本读完了,我们来总结一下我们读到的:: J: _$ e$ ]% O) [5 d" b
  (1)通过version段了解驱动的基本信息;. C: c0 O( J$ D9 t4 c, c- H1 Q0 ^
  (2)通过Manufacturer段找到包含HWID的段,在根据HWID的段找到配合此HWID的驱动所需要安装的驱动服务;
9 w. R6 @+ Z0 ^+ S3 s  (3)找到需要安装的驱动服务,了解这个驱动的服务是怎么样的,特别是启动类型和驱动文件所在位置。$ Y" ~: X# t3 x
  这也就完成了由inf文件中读到“系统关键设备-->设备驱动服务-->设备驱动文件”流程中各部分关键信息的目的。便于我们下一步制作SRS驱动。

电脑疯子 电脑疯子  管理员  发表于 2010-4-17 06:13:17 | 显示全部楼层
 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
  1.   
  2.   [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\(硬件ID)]
  3.   "ClassGUID"="(类的GUID)"
  4.   "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
  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 "
复制代码
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
  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
复制代码
. [! 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
  1.   [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\(服务名)]
  2.   "ErrorControl"=
  3.   "Group"=""
  4.   "Start"=
  5.   "Type"=
  6.   "ImagePath"=
复制代码
2 u3 H# J6 C" u8 j1 A
  经过转化后,iaStor服务在注册表中的形式为:
) Q0 t" }- ~- ?, p
  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
复制代码
. 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
  1.   [iaStor_parameters_AddReg]
  2.   HKR,Parameters,queuePriorityEnable,%REG_DWORD%,0
  3.   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
  1.   [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\iaStor\Parameters]
  2.   "queuePriorityEnable"=dword:00000000
  3.   "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
  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
复制代码
& 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

电脑疯子 电脑疯子  管理员  发表于 2010-4-17 06:13:48 | 显示全部楼层
 3.5 本章总结/ Q" Q8 s# _5 Z$ {+ m# F+ C
; {( E2 T& o. [/ W2 X4 S0 e
  SRS驱动被誉为高手手中的“圣物”,原因有如下几点:: V9 ~* \6 c3 H% f
  (1)很多所谓的技术员就没搞清楚磁盘控制器与磁盘是什么关系,天天盯着磁盘看,出点问题就了了一句“不支持SATA硬盘”带过,从未涉及问题的深层,从未了解问题的根本。5 p* f0 S% Q- f$ `4 z4 K
  (2)很多高手对SRS驱动的制作保密。: C7 [( d8 i6 _
  (3)SRS驱动的制作比较复杂,且容易出错。
% o  S5 r; `- W5 j" m( f  (4)SRS驱动的制作需要一定经验和实践的堆积才能完成。" @2 {" M5 `4 v. Y* V
  (5)SRS驱动的测试需要大量的时间,并需要测试者的技术水平与问题处理能力。
( q: M; J( J) B8 J& }" G$ O  但SRS驱动的制作并非“平民”不能掌握的,今与大家共同探讨SRS驱动的收集方法,为的就是大家能一起交流SRS驱动,创建更好的技术研讨氛围。

电脑疯子 电脑疯子  管理员  发表于 2010-4-17 06:21:28 | 显示全部楼层

  第1章、初识封装与部署技术4 h. y; j. [6 V+ ~
      讲述此项技术的基本原理,展示WinXP和Win7的基本封装与部署过程。
7 ?& T0 {" I- g+ Q2 f2 e' Y  C
4 l; \1 P7 ~. M4 a, d- X- z      第2章、硬件设备驱动的处理( C6 N9 Y/ M4 t# ^. C" K
      封装前对硬件设备驱动的卸载以及对HAL的处理等。

' ^7 ]- V( _2 K5 t
5 [. L& C& a5 _+ ?      第3章、磁盘控制器驱动的制作与集成
# b2 n# G. {& \' a4 d      讲述SRS驱动的制作过程与集成方法,以及所要注意的问题。
# U1 O. N/ K" L& a1 D3 A$ V2 Q
2 c1 F/ K" D: r( H& ]
      第4章、基本部署自动化控制
1 `* ?' s( L5 ]- c" Q      使用微软提供的无人值守工具使部署过程自动化。

/ a$ R/ p- ?. O% w7 x6 b+ E$ U  X6 {3 Y# w
      第5章、进阶部署自动化控制% |% D0 e! d; t4 ]3 h) `, P
      发挥我们的才能,进一步控制系统部署过程,使更方便。
% D1 M+ T: U1 U+ r, C$ C
7 ^* I/ N$ T- `8 `9 t1 ]
      第6章、驱动综合包的制作与集成
8 P. H! m0 V+ u4 X' s7 d      驱动综合包的制作方法和集成方式。
4 k# z: K/ h4 Y/ J
* F( t* K( B" U  }
      第7章、手动封装与部署控制实例! X. ?& e& z3 l" e
      完全手动的封装系统,并用手动控制部署过程。
4 a3 n/ L: I6 M, n, |
6 }! s  r" [% Q; A
      第8章、自动封装与部署控制实例
7 a  y* ^  j& J# m3 G
      使用ES3封装系统,完全自动化的系统部署控制。

 

 

 

帖子将继续转帖更新中................


2413jlsptj 2413jlsptj  合格会员  发表于 2010-4-17 17:32:54 | 显示全部楼层
辛苦了,好好学习下{:3_240:}谢谢老大

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

本版积分规则

0

关注

28

粉丝

1133

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.