DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件

2023-11-19

 转自: http://www.itstudy.net/html/200911/30/20091130234443.htm

第十五章.驱动程序的安装   

方便的,自动的和容易的安装一个设备驱动程序对于用户来说是一个重要的步骤。对于提供给用户容易的设备管理的即插即用驱动程序, 安装程序是最基本的。
安装一个驱动程序
一个后缀是INF的文本文件控制设备驱动程序自动的安装。INF格式类似于WIN 3.x下的老式的.INI文件,但是复杂些。一个INF文件允许自动的或者在对话框的帮助下安装驱动程序文件。
驱动程序安装结束后对系统产生两个持久的影响:
1.  描述驱动程序的系统注册表入口,它的加载顺序和任何适当的配置数据。
2.  驱动程序文件被拷贝到适当的系统路径。
INF文件是影响这些改变的标准的机制,它可以提供定制安装。
使用INF文件自动安装
INF文件随着硬件和驱动程序一起提供,INF文件的结构和内容是驱动程序作者的责任。
INF文件结构
INF文件是被分(section)成几个部分的文本文件,每个部分被指定一个标识符号﹐它被中括号([])括起来﹒一些部分的命名是必须的﹐而其它部分是驱动程序特定的﹒每个部分是一些安装动作﹐或者连接或者列举其它部分﹒
文件中各个部分的顺序是不重要的﹐因为每个部分都是被命名和连接的﹒一个部分继续直到另一个部分或者遇到文件结束﹒每个部分的标识符号是独一无二的名字﹐为了保持与WIN98的兼容﹐它的长度被限制在28个字符之内﹐可以包含下划线和圆点字符﹐在引用整个名字的前提下﹐可以包含空格字符﹒
文件内容的一般格式如下:
entry = value [, value...]
entry是指令﹐关键词或者文件名﹐value是entry被应用的属性﹒
 
 
图15.1. INF文件各部分的连接
entry或者value名字可以指定为一个使用百分号(%)的代替一些具体数据的字符串﹐分割INF文件的[Strings]提供一个特殊语言ID的值﹒
Version 部分
一个有效的INF文件从一个命名为[Version]的部分开始﹐它像一个INF文件的头和标识﹒

Entry
Value
Signature
“$Windows NT$" "$Windows 95$"  "$Chicago$"的其中一个
Class
驱动程序的整个家族的类名﹒一些名字是预先确定的﹐例如﹐Net或者Display
ClassGuid
一个类的独一无二的GUID
Provider
INF文件提供者的名字
LayoutFile
只有在系统支持的INF文件中使用﹐OEM支持的INF文件用SourceDisksNames
和 SourceDisksFiles代替
DriverVer
mm/dd/yyyy[,x,y,v,z],必须的条目﹐包含可选的版本信息

表15.1. [Version]部分的条目
Manufacturers部分
另一个必须的部分是[Manufacturers]﹐这个部分的条目列出了可以使用这个INF文件安装的设备和驱动程序﹐条目的形式是:
       manufacturer=model
manufacturer列出被安装的硬件的制造商的INF文件的唯一名字﹒model提供指向INF文件中另一个进一步安装这个模型的部分的指针﹐
Models 部分
罗列在[Manufacturers]部分的每一个模型﹐在文件中必须有相应的部分﹐model部分的每个条目的形式是:
device-description=install-section-name,hw-id[,compatible-id...]
device-description描述了设备模型的列表和一个短描述﹒这个字符串在安装的时候在对话框中提供给用户﹐因此它需要提供多种语言的文本﹒
install-section-name的值参考[DDInstall]部分﹐也描述了INF文件的另一个进一步安装的部分﹒hw-id是硬件设备在PnP兼容的总线上声明的时候返回的PnP标识符号﹒例如﹐USB\VID_045E&PID_00B标识微软HID(Human Input Device)的USB键盘设备﹒compatible-id可以是任何表示用于任何的包含在列表中的相同安装脚本的数值﹒
DDInstall 部分
它的名字独一无二的指定从[Models]部分列出的每个制造商的每个模型﹐
AddReg条目在语法上是必须的﹐CopyFiles条目对于[DDInstall]部分是重要的﹐它的形式是:
CopyFiles=file-list-section[,file-list-section...] 或者
CopyFiles=@filename
前者是更普通的版本﹐它允许一个指向另一个包含一个安装文件列表的部分的指针﹒然而对于简单的驱动程序的安装﹐可以直接的使用文件名﹒  

Entry
Value
DriverVer
mm/dd/yyyy[,x,y,v,z]﹐必须的条目﹐包含可选择的版本号码
CopyFiles
另一个指定需要复制的文件列表的部分或者一个单独的有”@”为前缀的文件名
AddReg
必须的﹐另一个包含需要的注册表信息的部分
Include
指向其它的INF文件名指针列表
Needs
Include条目的子集﹐列出了它的INF文件中需要的部分
DelFiles
指定另一个需要删除的文件列表的部分(一般是升级的目的)
RenFiles
指定另一个需要重命名的文件列表的部分(一般是存储安装之前的状态)
DelReg
指定另一个需要删除的系统注册表信息的部分
ProfileItems
指定另一个需要更改系统开始菜单的部分

表15.2. [DDInstall]部分条目
CopyFiles部分
INF文件的[CopyFiles]部分是唯一的名字并且CopyFiles的指示器在[DDInstall]部分﹐它的条目的形式是:
destination-filename[,source-filename,temp-filename,flag]

二进制值
符号名
描述
0x0400
COPYFLG_REPLACEONLY
如果已经有目标文件﹐则复制
0x0800
COPYFLG_NODECOMP
不解压﹐直接复制
0x0008
COPYFLG_FORCE_FILE_IN_USE
复制源文件为临时的名字﹐强制重新激活﹐
重命名临时文件
0x0010
COPYFLG_NO_OVERWRITE
不替换已存在的文件
0x1000
COPYFLG_REPLACE_BOOT_FILE
文件是系统加载的一部分﹐强制重新激活
0x2000
COPYFLG_NOPRUNE
强制复制﹐甚至安装者认为不需要
0x0020
COPYFLG_NO_VERSION_DIALOG
不重写更新的文件
0x0004
COPYFLG_NOVERSIONCHECK
总是重写目标文件
0x0040
COPYFLG_OVERWRITE_
OLDER_ONLY
重写老的目标文件
0x0001
COPYFLG_WARN_IF_SKIP
如果用户跳过文件﹐则警告
0x0002
COPYFLG_NOSKIP
不允许用户跳过文件

表15.3. CopyFiles flag的定义
destination-filename是需要复制的文件名﹐如果与源文件名不同﹐source-filename必须被指定﹐temp-filename在WIN98中是为新文件指定一个中间的文件名直到系统重新激活﹐对于WIN2000来说﹐它是无用的﹒
flag值指定新的目标文件的部署﹒这些值可以OR起来使它有多个性质﹒应该确认没有互斥的项目﹒
因为[CopyFiles]条目的语法不包含指定源文件的磁盘或者路径选项﹐所以﹐必须使用其它的INF文件的部分[SourceDisksNames]和[SourceDisksFiles]﹒[CopyFiles]是复制的源文件名﹐复制的目标则在[DestinationDirs]部分﹒
AddReg部分
INF文件的[AddReg]部分是唯一的名字﹐并且引用AddReg的指示器在[DDInstall]部分﹒这个部分的目的是提供在系统注册表中添加或者修改条目﹐形式是﹕
reg-root[,subkey,value-name,flags,value]
reg-root是注册表根的缩写﹐子键描述根键下的键名﹐使用反斜线字符(\)分开子键﹒例如﹐Software\W2KDriverBook\ Driver\Setting是有效的HKCU或者HKLM根键的子键﹒

缩写
意义
HKCR
HKEY_CLASSES_ROOT
HKCU
HKEY_CURRENT_USER
HKLM
HKEY_LOCAL_MACHINE
HKU
HKEY_USERS
HKR
设备安装的硬件子键

表15.4. AddReg reg-root缩写的意义
value-name指定被添加或者修改注册表值﹒每个系统注册表键包含零个或者多个不同数据类型的值﹒注册表编辑器在右边的窗格列出了子键的值﹒值的名字和值的数据也一起显示出来﹒左边的窗格仅仅显示子键﹒flags指定数据的类型﹒

二进制值
符号
意义
0x00000
FLG_ADDREG_TYPE_SZ
以零为结束的字符串
0x00001
FLG_ADDREG_BINVALUETYPE
二进制数据
0x00002
FLG_ADDREG_NOCLOBBER
不替换现有的值
0x00004
FLG_ADDREG_DELVALUE
删除子键或者值的名字
0x00010
FLG_ADDREG_KEYONLY
创建子键﹐不顾值
0x00020
FLG_ADDREG_OVERWRITEONLY
如果值存在﹐替换它﹐否则什幺也不作
0x10000
FLG_ADDREG_TYPE_MULTI_SZ
REG_MULTI_SZ值(数组)
0x00008
FLG_ADDREG_APPEND
附加到存在的REG_MULTI_SZ数组
0x20000
FLG_ADDREG_TYPE_EXPAND_SZ
REG_EXPAND_SZ数据
0x10001
FLG_ADDREG_TYPE_DWORD
DWORD值
0x20001
FLG_ADDREG_TYPE_NONE
REG_NONE值

表15.5. AddReg flags定义
系统注册表对于驱动程序安装的重要性将在后面讨论﹒
SourceDisksNames 部分
如果INF文件包含的驱动程序文件分布在多个磁盘上﹐INF文件就必须包含[Source-DisksNames]部分﹐这个部分包含文件分布的每个磁盘的人口﹒
diskid=disk-description[,tagfile,unused,path]
diskid是唯一的分配设置中的名字﹒通常﹐磁盘号从1开始﹐disk-description是一个提示用户合适的磁盘的字符串﹒
tagfile值有双重的作用﹒确定在安装过程中用户提供正确的磁盘﹐tagfile值在安装过程继续进行之前被检验﹐如果tagfile文件不存在﹐用户被重新提示插入正确的磁盘﹒如果agfile值包含.CAB的扩展名﹐表示磁盘上的驱动程序文件是压缩文件﹒
path值是一个以root-relative为磁盘根目录的驱动程序文件的路径﹒像tagfile值一样是可选择的﹒
SourceDisksFiles 部分
INF文件必须包含一个[SourceDisksFiles]部分﹒这个部分列出了在安装驱动程序过程中使用的文件名﹒每个文件都有相应的条目﹒
filename=diskid[,subdir,size]
diskid值是一个[SourceDisksNames]部分指定的可以找到文件名的磁盘﹐可选的subdir值指定文件的路径﹒可选的size值指定解压缩文件的字节大小﹐安装过程使用这个数据在尝试复制文件之前决定目标系统是否适合安装﹒
DestinationDirs部分
这是个必须的提供目标路径的部分﹒
file-list-section=dirid[,subdir] 或者
DefaultDestDir=dirid[,subdir]
file-list-section是一个被[CopyFiles]的指示器唤起的部分﹒它指定所有的被指示器复制的文件安装到指定的路径﹒对于DefaultDestDir﹐用于[CopyFiles]中所有的指示器﹐通常与file-list-section联合使用﹒

意义
12
%windir%\system32\drivers 对于 Windows 2000
%windir%\system\IoSubsys 对于 Windows 98
10
%windir%
11
%windir%\system32 对于 Windows 2000﹐
%windir%\system对于 Windows 98
30
根驱动器的根路径
54
Windows 2000的根路径
01
这个INF文件的路径
17
INF文件的路径
20
Fonts的路径
51
假脱机的路径
52
假脱机的驱动程序路径
55
打印机处理机路径
23
Color (ICM)
-1
绝对路径
21
Viewers路径
53
User Profile路径
24
应用软件路径
25
共享路径
18
帮助路径
16406
All Users\Start Menu
16407
All Users\Start Menu\Programs
16408
All Users\Start Menu\Programs\Startup
16409
All Users\Desktop
16415
All Users\Favorites
16419
All Users\Application Data
16422
Program Files
16427
Program Files\Common
16429
All Users\Templates
16430
All Users\Documents

表15.6. DestinationDirsdirid定义
DDInstall.Services 部分
为了让复制的文件在目标系统中起驱动程序的作用﹐必须通知服务控制管理器(SCM)﹐在WIN2000中安装的每个驱动程序在注册表的HKLM\System\CurrentControlSet\Services下面﹐ServiceType值是1表示内核模式的驱动程序﹒StartType指出在系统引导过程中在何时加载驱动程序﹒ErrorControl值决定在驱动程序加载的过程中如果遇到错误后如何是好﹒ServiceBinary值指出驱动程序的位置(.SYS文件)﹒但是可能会被遗漏﹐如果二进制文件在%windir%\system32\drivers路径并且与HKLM\...\Services下面的子键名的名字相同的时候就发生这种情况﹒
DDInstall.Services部分条目的形式是﹕
AddService=ServiceName,[flags],service-install-
section[,eventlog-install-section]
ServiceName描述服务的名字﹐典型的是驱动程序的名字(没有.SYS扩展名)﹐

二进制值
符号名
意义
0x0002
ASSOCSERVICE
驱动程序是一个FDO﹐不是滤波驱动程序
0x0008
NOCLOBBER_DISPLAYNAME
不重写friendly名字
0x0100
NOCLOBBER_DESCRIPTION
不重写Description
0x0010
NOCLOBBER_STARTTYPE
不重写starttype
0x0020
NOCLOBBER_ERRORCONTROL
不重写错误控制

表15.7. AddService flags定义
service-install部分和可选的eventlog-install部分唤起附加的控制服务值条目的INF部分(例如﹐ServiceType和StartType)﹒
ServiceInstall 部分
[ServiceInstall]部分﹐它的名字在DDInstall.Services部分的AddService条目中唯一指定﹐控制和安装驱动程序到服务控制管理器﹒

条目
DisplayName
驱动程序的Friendly名字﹐显示在设备管理器中
Description
简短的描述驱动程序或者服务的目的﹐显示在设备管理器中
ServiceType
驱动程序类型: 0x01 -内核驱动程序﹐0x02 -文件系统驱动程序
StartType
何时驱动程序加载: 0 -引导时﹐1 -系统开始时
    2 -系统开始后自动加载﹐3 -需要时手动﹐4 -禁止使用
ErrorControl
驱动程序加载时错误部署: 0 -忽视所有错误﹐1 -显示错误给用户﹐
2 -使用最后的良好状态重新激活﹐忽视错误﹐
3 -使用最后的良好状态重新激活﹐调试错误
ServiceBinary
驱动程序的全路径名﹐可能包含dirid值

表15.8. ServiceInstall 部分条目
INF 例子
前面介绍的INF文件好象非常复杂﹐这里使用一个例子说明它﹒在下面的例子中﹐INF控制一个由两个文件组成的驱动程序﹒Launcher.SYS被复制到系统的驱动程序路径﹐Launcher.HLP被复制到系统的帮助路径(例如﹐ WINNT\System32\Drivers和WINNT\Help)﹒
[Version]
Signature="$Windows NT$"                                  
Class=Missiles
ClassGUID={C9B3D080-6889-11d4-93FC-444553540000}       Provider=W2KDriverBook
DriverVer=07/04/2000,1.00.2468.1
                                                ; 注释在分号(;)后面
[DestinationDirs]                           ; 指定文件复制的目的地
DefaultDestDir=12                           ; %windir%\system32\drivers
CopyLaunchHelp=18                           ; standard help directory
 
                              
;[DefaultInstall]                   ;默认的安装。( 即右击后点安装后的执行,有些人讲点安装了,可文件还是没有复制过去,就是这个没加的原因。)
;Copyfiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf
;AddReg=BULKUSB.AddReg 
 
 
[Manufacturer]                                                ; 通的安装软件的.INF文件中,不包括[Manufacturer] 与[Manufacturer Name] 节
                                                                          ;即使包含,也不会执行它们,这2 个节仅仅 用于硬件的设备驱动中起作用。W2KDriverBook=MyMfgName                  
                                                         ; 唤起model部
[MyMfgName]                                   ; 开始一个Models部分
"ISA Missile Launcher"=InstallLauncher,ISA\Launcher  ; 我们的设备列表
                                                         ; "ISA Missile Launcher"表对要安装的设备的描述,如果此设备被安装,那么此名字是出现在设备管理器中的名字
                                                         ; InstallLauncher是此设备的安装节点
                                                         ;,ISA\Launcher 是指设备ID
 [InstallLauncher]                          ; 开始DDInstall 部分
CopyFiles=CopyLaunchFiles                 ; 唤起CopyFiles 部分.
CopyFiles=CopyLaunchHelp                  ; 另一个是help的
AddReg=LaunchRegSection                     ; 唤起AddReg 部分
[CopyLaunchFiles]                            ; 开始CopyFiles部分
Launcher.sys
[CopyLaunchHelp]                              ; Help文件的CopyFiles部分
Launcher.hlp
[LaunchRegSection]                           ; 开始AddReg 部分
HKR,"Parameters","Coordinates",FLG_ADDREG_TYPE_DWORD,0
; 给设备提供一个是0的DWORD值
[SourceDisksNames]                            ; 这个部分不是真的需要﹐
1="Missile Launcher Driver Files"          ; 因为只有两个文件并且在同一个磁盘上
[SourceDisksFiles]
Launcher.sys=1                              ; 类似的﹐因为它们在同一个磁盘上﹐
Launcher.hlp=1                              ;所以不是真正的需要这个部分
[InstallLauncher.Services]                   ; DDInstall.Services部分
AddService=Launcher,2,LaunchService
 [LaunchService]                             ; 设置SCM﹐这样驱动程序就可以运行了
ServiceType=1                                ; 驱动程序
StartType=3                                   ; 需要时手动加载
ErrorControl=1                               ; 汇报错误
ServiceBinary=%12%\Launcher.sys           ; 驱动程序路径
使用INF文件
一旦驱动程序的INF创建完成﹐必须处理它﹐使它有用﹒
手动安装
手动的处理INF文件﹐必须使用Windows的文件管理器选择INF文件﹐右击这个文件﹐选择安装﹒
在真正的即插即用环境中﹐插入或者移除设备触发相应的驱动程序的安装﹐加载和卸载﹒因此﹐保留手动的安装是为了最初的测试和调试驱动程序﹒
自动安装
当一个即插即用的设备被插入到一个系统﹐数个子系统相互作用来加载新的驱动程序﹒
        1.  当设备被插入﹐硬件使用自动侦测和自动配置﹐告诉总线驱动程序设备出现﹒依赖于总线硬件﹐这可能涉及通知总线驱动程序一个新的总线设备列举发生﹒在这一步的最后﹐驱动程序发现新的设备出现并且有一个指定的设备ID﹒
2.  内核模式PnP管理器通知用户模式PnP管理器一个新的有一个指定ID的设备出现在系统中﹒
        3.  用户模式PnP管理器使用WIN2000的Setup API库为新的设备提供一个类似的驱动程序列表﹒为了合适的驱动程序﹐系统使用新设备的class和model查找系统的INF目录(例如﹐WINNT\INF)﹒
        4.  如果不能找到合适的INF文件﹐系统不进行进一步的动作直到一个有特权的用户进入系统﹒用户被提供一个新的硬件向导﹒用户提供驱动程序的位置和合适的INF文件位置﹒
        5.  一旦找到INF文件﹐它被使用CfgMgr API库处理﹒驱动程序文件和注册表条目被安装和修改﹒内核模式的PnP管理器主要执行这个步骤﹒
         6.  基于INF文件的指导﹐内核模式PnP管理器加载任何低层的滤波驱动程序﹐然后是functional驱动程序﹐最后是高层的驱动程序﹒在堆栈中的高层的驱动程序然后发送适当的PnP信息﹐包括IRP_MN_START_DEVICE.
添加/移除硬件向导
在安装过程中﹐主要的与用户的交互是添加新硬件向导﹒注意有一个制造商的列表(来自于INF文件的[Manufacturers]部分)﹐和Models列表(来自于INF文件的[Models]部分)﹒
通常﹐用户手动选择适当的驱动程序去安装和加载﹒如果驱动程序被安装﹐它的DriverEntry和AddDevice例程必须仍然有效﹐这样使请求驱动的硬件满意新代码的设置﹒换句话说﹐手动的选择可能成功的安装﹐但是初始化是失败的﹒
Class名字和设备IDs
即插即用设备自动安装的过程很大程度上依赖安装程序的 定位合适驱动程序的INF文件和文件中各个部分的能力﹒这个部分文章的目的是解释Class名字和设备Ids﹐还有定位INF文件的过程﹒
每个即插即用设备应该有一个 唯一的指定硬件模型的标识符号﹒因此提供设备ID给即插即用总线硬件和总线驱动程序﹒当然﹐总线驱动程序在新的设备被插入后的很短时间内请求设备ID﹒设备ID的形式与总线类型有关﹒但是﹐一般看起来是:
<enumerator>\<enumerator-specific-device-ID>
(例如﹐PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02)
对于驱动程序代码﹐ 一个硬件设备可能汇报多个设备ID它是设备功能上的与很多models兼容的陈述﹒因为INF文件的[Models]部分包含一个hw-id值﹐所以﹐寻找与新安装的设备返回的设备ID相匹配的INF文件中的条目非常简单﹒同样的INF条目允许相兼容硬件的列表的规范有附加的设备Ids形式﹒如果设备ID不能在INF文件中定位精确的匹配﹐就使用兼容的ID﹒
另一个为设备定位合适的驱动程序的关键元素是 安装类(Setup Class)的观念﹒一系列相关的设备可以共享分层的驱动程序 (例如﹐upper或者lower滤波器)﹐甚至在堆栈中个别的驱动程序﹒安装类被GUID 和name唯一的标识﹒微软定义了一系列驱动程序类﹐新的类可能被定义新的硬件组﹒创建新的组之前﹐必须选择一个新的GUID和class名字﹒

类名
意义
GUID
1394
1394火线控制器 
{6bdd1fc1-810f-11d0-bec7-08002be2092f}
Battery
电池设备 
{72631e54-78a4-11d0-bcf7-00aa00b7b32a}
CDROM
CD-ROM设备
{4d36e965-e325-11ce-bfc1-08002be10318}
DiskDrive
磁盘设备
{4d36e967-e325-11ce-bfc1-08002be10318}
Display
显示适配器
{4d36e968-e325-11ce-bfc1-08002be10318}
FloppyDisk
软盘控制器
{4d36e980-e325-11ce-bfc1-08002be10318}
HDC
硬盘控制器
{4d36e96a-e325-11ce-bfc1-08002be10318}
HIDClass
人性化的输入设备
{745a17a0-74d3-11d0-b6fe-00a0c90f57da}
Image
成像设备
{6bdd1fc6-810f-11d0-bec7-08002be2092f}
Infrared
IrDA设备
{6bdd1fc5-810f-11d0-bec7-08002be2092f}
Keyboard
键盘
{4d36e96b-e325-11ce-bfc1-08002be10318}
MTD
存储器技术驱动程序
{4d36e970-e325-11ce-bfc1-08002be10318}
Media
多媒体设备
{4d36e96c-e325-11ce-bfc1-08002be10318}
Modem
调制解调器
{4d36e96d-e325-11ce-bfc1-08002be10318}
Monitor
监视器
{4d36e96e-e325-11ce-bfc1-08002be10318}
Mouse
鼠标器
{4d36e96f-e325-11ce-bfc1-08002be10318}
Multifunction
多功能设备
{4d36e971-e325-11ce-bfc1-08002be10318}
Network
网络适配器
{4d36e972-e325-11ce-bfc1-08002be10318}
NetClient
网络客户机
{4d36e973-e325-11ce-bfc1-08002be10318}
NetService
网络服务器
{4d36e974-e325-11ce-bfc1-08002be10318}
NetTrans
网络传输
{4d36e975-e325-11ce-bfc1-08002be10318}
PCMCIA
PCMCIA适配器
{4d36e977-e325-11ce-bfc1-08002be10318}
Ports
端口(COM & LPT)
{4d36e978-e325-11ce-bfc1-08002be10318}
Printer
打印机设备
{4d36e979-e325-11ce-bfc1-08002be10318}
Volume
存储卷
{71a27cdd-812a-11d0-bec7-08002be2092f}
System
系统设备
{4d36e97d-e325-11ce-bfc1-08002be10318}
USB
USB
{36fc9e60-c465-11cf-8056-444553540000}

表15.9. 安装类: 名字和GUIDs 
自定义安装
驱动程序一般提供两个定制驱动程序安装的信息﹒
第一﹐提供一个自定义的安装程序代替新硬件安装程序﹐为了提供这个功能﹐ 自定义的安装程序需要使用SETUPAPI.DLL提供的例程﹒这个库中的每个函数的形式是SetupDiXxx﹒DDK提供使用这个库的详细资料﹒
第二﹐ 驱动程序可以提供一个自定义的设置设备的向导页﹒在它的工作要完成之前﹐安装程序发送一个DIF_NEWDEVICEWIZARD_FINISHINSTALL请求来提供给驱动程序一个显示自定义页的机会﹒
控制驱动程序的加载顺序
有时﹐驱动程序的加载顺序是非常重要的﹒可能一个驱动程序依赖另一个驱动程序初始化完成﹒当有这样的依赖产生﹐服务控制管理器(the Service Control Manager)可以取得系统注册表中条目LoadOrderGroup和Dependencies﹐这些值可以在INF文件中的[ServiceInstall]部分指定﹒
LoadOrderGroup是命名一个指定的驱动程序加载顺序组的一个号码﹐Dependencies指定在这个驱动程序加载成功之前必须加载的组﹒
这样的相互依赖不是公共的﹐也不应该是公共的﹒在一个真正的以设备为中心的环境(支持即插即用)中﹐驱动程序应该使用尽量少的联系的顺序﹒另一方面﹐分层很多的驱动程序的执行需要这些规范是合理的﹒
驱动程序的数字签名
WIN2000的CD上附带有很多第三方的驱动程序﹒为了分享这些程序﹐需要几个条件﹒
加之﹐无论何时尝试在WIN2000上安装一个驱动程序﹐都会收到一个陈述设备驱动程序没有数字签名并且它的确实性没有被微软检验的警告信息﹒
下面介绍微软的检验驱动程序的确实性的作用和驱动程序作者和硬件制造商的保证它们的软件包被包含在未来的WIN2000 CD上的负担﹒
微软检验驱动程序的原因
微软检验驱动程序有两个目标:
1.  通过方便的设备驱动程序的发售提供或者促进WIN2000和更多的硬件设备的协同工作能力﹒
2.  确定设备驱动程序是稳定的和没有折中系统的完整性﹒
因为 设备驱动程序操作在内核模式﹐它们可以慢慢的或者很快的使系统崩溃﹒因为系统的不稳定性常常由内核自己引起﹒这样﹐微软为它的操作系统维持一个被鉴定的制造商和驱动程序的目的是明显的﹒
当然﹐WIN2000和大多数的硬件的协同工作能力是一个强有力的买点﹒因此﹐微软常常与硬件制造商一起来确保及时地发布兼容的驱动程序﹒
为了完成这两个目标﹐ 微软有专门的提供硬件和驱动程序证明的团队﹐Windows硬件质量实验室(WHQL)﹒
数字签名
作为 WHQL程序的一部分﹐一个被检验过的驱动程序获得一个允许在WIN2000中安装驱动程序并且不会产生警告的数字签名﹒
数字签名由几个部分组成:
1.  一个被包含在分布式的驱动程序包的 目录文件(.CAT)﹐它包含微软分配的数字签名
2.  一个在INF文件中 [Versions]部分的涉及 .CAT文件的条目
3.  WIN2000的是或者否允许一个没有数字签名的驱动程序安装的策略﹒
数字签名有更改检验﹐这样确保驱动程序被使用供货商提供的原始的代码安装﹒它使用密码技术来完成这个目标﹐这个 数字签名没有更改驱动程序代码
小结
Windows 2000和Windows 98的自动的设备驱动程序的, 安装对于用户来说是一个巨大的进步﹒然而这个步骤需要驱动程序的作者附加的工作﹐至少﹐必须提供一个INF文件﹒

 


 

 

 

2, 注册表

 

INF文件中的内容会在注册表中有所体现

 

硬件子键

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/{设备管理器该设备属性的详细信息}

 

类子键

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{GUID}

 

服务子键

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/{Driver名称}

 

3, 安装流程

Step 1

Step 1

 

Step 2

Step 2

 

Step 3

Step 3

 

Step 4

Step 10

 

Step 5

Step 5

注 * 从磁盘安装

 

Step 6

Step 6

 

Step 7

Step 7

 

Step 8

Step 8

 

Step 9

Step 9

安装完成

 

Step 10

Step10

在设备管理器中查看

 

Step 11

Step11

查看属性

 

4, 给出一个已经编译好的驱动(包括INF文件,符号文件和源代码)

代码就是《驱动开发技术详解》光盘中第一章的代码。

可以使用WinDBG和VMWare进行简单的调试练习。

关于WinDBG的使用会在下一篇Blog中描述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件 的相关文章

  • 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

    如何在 Windows 上关闭 tcp v4 和 tcp v6 连接 我不想终止具有开放连接的整个进程 因为这显然会将其他人踢出该进程 我需要从一个单独的进程执行此操作 因此无法访问套接字句柄等 我正在使用 Windows API 来获取
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 更改 mingw' 启动目录或创建 mingw 符号链接

    设置 mingw 控制台启动目录的最简单方法是什么 我只使用 mingw 进行编译 但由于缺乏编辑器甚至符号链接 我很困惑如何告诉 mingw 控制台出现在不同的目录而不是常规的主目录中 如果有人知道如何像 cygwin 那样将 真正的 符
  • 以编程方式从 java 代码中查找 java.exe 的绝对路径

    如果我有一个由用户启动的 java jar 或类文件 假设在环境变量中设置了 java 路径 那么我如何从代码中找出 java exe javaw exe 的绝对路径文件正在启动 就像在 ubuntu 上一样 我们可以运行 which ja
  • Git 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 对于多重继承,使用隐式转换而不是 QueryInterface() 是否合法?

    假设我有一个类实现两个或多个 COM 接口 正如here https stackoverflow com questions 1742848 why exactly do i need an explicit upcast when imp
  • teracopy 如何替换默认的 Windows 副本

    我问了这个问题Windows 文件复制内部结构 动态加密 https stackoverflow com questions 24220382 windows file copy internals on the fly encryptio
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • 在哪里可以找到 Windows 7 UX 指南中推荐的图标/动画?

    Windows 7 UX 指南有很好的插图和图标示例 但我在 SDK 中确实找不到它们 他们藏在某个地方 还是找不到 如果您谈论的是常见的 UI 图标 那么您应该以编程方式获取它们 例如 您可以使用 var errIcon HICON be
  • 非托管 C++ 中的默认打印机

    我正在寻找一种使用非托管 C 查找 Windows 默认打印机名称的方法 找到了大量 NET 示例 但非托管没有成功 谢谢 以下是如何获取当前打印机和默认打印机的列表 如果有一台设置为默认打印机 另请注意 如果用户没有打印机或未将打印机名称
  • 在 Win7 登录屏幕上运行应用程序[重复]

    这个问题在这里已经有答案了 我想通过服务在 Windows 7 的登录屏幕上运行应用程序 我对此进行了长期研究并尝试了不同的方法 但不幸的是到目前为止还没有完全成功 我设法在当前登录用户的锁定屏幕上运行该应用程序 起初我认为这就是我基本上试
  • NetBeans IDE maven项目无法解决依赖关系

    使用 eclipse 多年后 我正在将自己移植到 NetBeans IDE 我正在打开现有的 Maven 项目 一切似乎都正常 但是当我尝试构建该项目时 它会抛出错误 提示 无法解析项目的依赖项 尽管 JAR 文件存在于我的 m2 目录中
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于
  • TRACKER:错误TRK0005:无法找到:“CL.exe”。该系统找不到指定的文件

    我尝试在 Windows 8 上的 Node js 项目中执行以下命令 npm 安装 电子邮件受保护 cdn cgi l email protection 但我收到一个错误 我不知道如何处理 TRACKER 错误TRK0005 无法找到 C

随机推荐

  • C++:类对象的初始化,构造函数:无参、拷贝构造函数,类中const 成员的初始化,对象的构造顺序

    类的对象 类对象的初始化 构造函数 无参构造函数 拷贝构造函数 类中const 成员的初始化 对象的构造顺序 类对象的初始化 include
  • 解决Jenkins插件不能下载安装的问题

    安装到这一步 显示无法下载Jenkins插件 安装中升级站点 如果你还在安装过程中 遇见这个问题 你可以打开一个新的网页 输入网址http localhost 8080 pluginManager advanced 在最下面的升级站点 把其
  • wimax与anroid的困惑

    我要加入wimax组 研究wimax 但是 为什么是anroid平台呢 wimax和android有关系吗 我们是做wimax芯片的呀 难道wimax芯片上跑anroid系统 好像不太可能 经过分析 应该是xx公司要使用我们的wimax芯片
  • PR-RL:Portrait Relighting via Deep Reinforcement Learning

    文章目录 Title PR RL Portrait Relighting via Deep Reinforcement Learning 1 Article 1 1 Abstract and Introduction 1 2 Conclus
  • thttpd源码分析

    由于最近要自己实现一个嵌入式web服务器 所以开始了对嵌入式web服务器的相关学习 为了使自己对服务器了解更加深入 便找到了开源的服务器进行了相关学习 首先学习的是 thttpd thttpd 是一个小型的 HTTP 服务器 官方网址 ht
  • Elasticsearch 7.13.2启动成功,但无法访问?

    今天在linux服务器上配置了es环境 已经成功运行 如下 原因 elasticsearch出于安全策略考虑 默认仅开启了本地访问 需要额外配置远程访问 备注 生产环境请设置密码 且不要直接开放0 0 0 0 解决 在elasticsear
  • 图像的FFT变换

    一 实验设备 计算机 matlab软件 二 实验目的 1 理解并掌握图像的FFT变换的原理 2 学习使用matlab对图像进行FFT变换 三 实验原理 图像fft变换可以将图像空间域变为频率域 进而对频率域图像进行操作 这样会使操作变得简单
  • vue_cli4遇到的问题及解决

    vue cli4遇到的问题及解决 vue cli4遇到的问题及解决 新建项目时报错 vue cli4遇到的问题及解决 新建项目时报错 新建项目代码 vue create project name 报错信息图 解决办法 检查node版本与np
  • 嵌入式系统C语言编程小心使用局部变量

    问题 今天同事在写一个STM32上的程序时 总是遇到内存溢出的错误 结果发现是因为使用了一个局部变量导致的 因为C语言的局部变量被编译器自动放到栈区的空间 全局变量需要手动申请并释放空间 嵌入式系统的栈区本来就很小 而且要放进去的变量是一个
  • 使用CSS在浏览器中绘制虚拟仪表盘(2020-12-30更新)

    效果
  • 【idea】idea无法打开,常规报错的原因和解决方法

    2020 07 29 更新 mac下因破解无法打开的解决方案 删除 Users 你的名字 Library Preferences IntelliJIdea2019 3 idea vmoptions 添加的内容即可 原因一 老版本的idea没
  • b01lers CTF web 复现

    warmup 按照提示依次 base64 加密后访问 可以访问 flag txt 也就是 Li9mbGFnLnR4dA from base64 import b64decode import flask app flask Flask na
  • Spring基础3——AOP,事务管理

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 AOP简介 1 1 AOP概念 作用 方式
  • 【Qt】智能指针

    https zhuanlan zhihu com p 364014571 ivk sa 1024320u 代码中出现一个bug 最终发现是由于在某个特殊情况下出现了使用垂悬指针 造成了程序崩溃 进而学习了解了Qt的智能指针机制 一 悬垂指针
  • 【力扣经典题目】链表的回文结构,赶快收藏起来

    题目描述 对于一个链表 请设计一个时间复杂度为O n 额外空间复杂度为O 1 的算法 判断其是否为回文结构 给定一个链表的头指针A 请返回一个bool值 代表其是否为回文结构 保证链表长度小于等于900 测试样例 1 gt 2 gt 2 g
  • Windows10 2004无线网卡电源管理消失 电源计划只有平衡

    问题 升级到了Windows10 2004 发现每次睡眠后QQ和微信消息都收不到了 去网卡的属性界面却找不到电源管理面板 并且电源计划中也只能创建平衡的电源计划 在网上找了很多解决办法 最多的是关于一个改注册表中的更改注册表HKEY LOC
  • 9 变量进阶

    变量进阶 变量的引用 可变和不可变类型 局部变量和全局变量 1 变量的引用 变量和数据都是保存在内存中的 在 python 中 函数 的参数传递以及返回值都是靠引用传递的 引用的概念 在 python 中 变量和数据是分开存储的 数据保存在
  • 应用层、传输层、网络层、数据链路层

    应用层 包括 应用服务 FTP FileTransfer Protocol 文件传输协议 和DNS Domain NameSystem 域名系统 发送HTTP请求 DNS域名解析系统 提供通过域名 www baidu com 查找IP地址
  • 劳务派遣员工转正制度是什么

    一 劳务派遣员工转正制度是什么 要根据不同的单位来看 因为具体的制度还是要看用工单位的相关规定 比如大部分银行每年都会有一定的转正名额 公务员和事业单位的转正机会则较少 想要成为正式员工还是要参加招聘考试 银行招聘的时候会以劳务派遣的方式招
  • DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件

    转自 http www itstudy net html 200911 30 20091130234443 htm 第十五章 驱动程序的安装 方便的 自动的和容易的安装一个设备驱动程序对于用户来说是一个重要的步骤 对于提供给用户容易的设备管