Writing Windows WDM device drivers
副标题:无
分类号:
ISBN:9787111077091
微信扫一扫,移动浏览光盘
简介
ws2000新的驱动程序模型(WDM)。描述了WDM
设备驱动程序的结构、功能和开发方法;通过实际的设备驱动程序例子,说明WDM设备
驱动程序的实现技术、测试和调试方法;介绍了本书提供的一个调试软件DebugPrint;
说明如何在客户驱动程序中使用USB驱动程序接口(USBDI)访问USB设备,以及如何利用
HID类驱动程序以标准方法访问多种输入设备。
片断:
阃ㄐ牛这样其他驱动程序有了一个定义好的接口可?br>使用,这使得向USB总线发出请求是相当直接的。
源代码兼容与二进制兼容
一开始,Micros0ft宣称WDM驱动程序会是Windows98和Windows2000x86之间二进制兼
容的,且与Windows2000Alpha平台源代码兼容。但是,现在看来并不能保证二进制兼容,
尽管DDK在这方面并不清楚。
笔者为了安全起见,仅安装为正确的操作系统构造的驱动程序,也就是说在为Windows
98构造驱动程序时,使用Windows98驱动程序开发工具包(DDK),而对Windows2000使用
Windows2000DDK。
如果使用仅在Windows2000中出现的一些WDM功能,则就不能达到源代码兼容。例如,
Windows2000USB系统驱动程序支持一些Windows98驱动程序不可用的功能。
下面通过开发一个简单的设备驱动程序,首先讨论WDM的核心功能。然后,讨论必须使
用访问内存和处理中断这样的硬件资源的驱动程序。最后,介绍USB和HID系统驱动程序。
使用内核例程IoIsWdmVersi0nAvailable确定要求的WDM版本是否可用。DDK头文件定义两个
常量WDM_MAJORVERSION和WDM_MINORVERSION,对于Windows98,这些常量是1和
0;而对于Windows2000,它们是1和0x10。
1.1.1WDM与NT式驱动程序
图1-1粗略表示了WDM和NT式驱动程序之间的差别,本书后面的内容将说明这个图中提
到的所有功能。
这两种驱动程序之间的重叠是相当多的。实际上,写WDM和NT式驱动程序基本上是相
同的工作,驱动程序代码中的主要不同是如何创建设备。
在WDM驱动程序中,即插即用(PnP)管理器告知何时向系统添加一个设备,或者从系统
删除设备。PnP管理器使用安装INF文件查找新设备的正确驱动程序;相反,NT式驱动程序
必须发现它自己的设备,通常在它的初始化例程中。NT式驱动程序通常使用专门的安装程序
安装。
新的总线驱动程序和类驱动程序仅可用于WDM设备驱动程序,新的WDM和NT式驱动程
序应支持电源管理和WMI特性。
1.1.2可用的驱动程序
如果从头开始写一个驱动程序,似乎大多数的代码都与访问设备无关,在执行一些实际
的输入输出(I/O)之前,有许多“基础构架”必须设置。本书使用一些实际有用的驱动程序作
为例子,会帮助读者尽快入门。一些驱动程序是可以直接使用的,而其他驱动程序形成读者
自己的驱动程序的基础。
一个虚拟设备驱动程序用于解释核心的WDM功能。虚拟设备不使用任何实际的硬件。3
个驱动程序Wdm1、Wdm2和Wdm3逐渐实现更多的功能。一开始,它们提供一个共享内存缓
冲区,使得它们形成其他有用驱动程序的基础。实际上,Wdm2驱动程序就被用作本书其他几
个驱动程序的基础,包括使用系统驱动程序的驱动程序。
在本书中,DebugPrint软件用于提供驱动程序的跟踪调试输出。DebugPrint驱动程序将在
第4章中介绍。读者可以在自己的设备驱动程序中使用DebugPrint。
WdmI0和PHDI0是通用驱动程序,可以马上用于提供对简单硬件设备的访问,一个控制
Win32程序可以使用一组简单但功能很强的命令与硬件对话。这些驱动程序支持中断驱动的
I/O。应用程序例子说明这些通用驱动程序如何用于访问并行端口。
UsbKbd和HidKbd驱动程序都访问连接到USB总线的键盘,这些驱动程序说明使用USB和
HID类驱动程序要求的技术。最后,Win32应用程序HidKbdUser说明用户态应用程序如何发
现和访问HID设备。
1.1.3本书配套光盘
本书配套的光盘含有前面提到的所有驱动程序,包括这些驱动程序的全部源代码和编译
好的可执行文件。每个驱动程序至少有一个测试程序,用于测试驱动程序。另外,本书还有
一些有用的Win32实用程序,用于辅助驱动程序的开发。第4章有安装本书配套光盘上软件的
完整指令。大多数的测试Win32程序是控制台应用程序,使它们很容易写和理解;没有必要让
这些代码成为成熟的窗口式或MFC应用程序。
为了充分利用本书,应该安装全部驱动程序例子并运行Win32测试程序,所有的驱动程序
都包括跟踪调试语句,如果安装了DebugPrint软件,则可以在DebugPrintM0nitor应用程序中
看到跟踪输出。
仔细检查每个例子的源代码是非常有用的,在实际工作中,一个人只有通过写实际的代
码才能学会编程。可以使用这些驱动程序例子作为起点并增加一些功能来进一步掌握设备驱
动程序的编写。
1.1.4设备驱动程序软件工具
有两类软件可用于帮助设备驱动程序的开发,如表1-1所示。驱动程序类是源代码C++类
包装程序,提供驱动程序需要的大多数缺省功能;通用驱动程序可以从用户态访问许多类型
的设备。OSR公司有一个叫做OSRDDK的调试辅助工具。
目录
目 录
前言
第1章 引言 1
1.1 windows驱动程序模型 1
1.1.1 wdm与nt式驱动程序 2
1.1.2 可用的驱动程序 3
1.1.3 本书配套光盘 3
1.1.4 设备驱动程序软件工具 3
1.1.5 未讨论的驱动程序类型 4
1.2 新的思维方式 4
1.2.1 设备驱动程序环境 4
1.2.2 术语与资源 5
1.3 win32程序接口 5
1.3.1 基本i/o 5
1.3.2 重叠的异步请求 6
1.3.3 环境 6
1.3.4 设备特定的限制 7
1.3.5 驱动程序的其他win32访问 7
1.4 小结 7
第2章 概述 8
.2.1 设备驱动程序的组成部分 8
2.1.1 驱动程序入口点和回调例程 9
2.1.2 分发例程 10
2.1.3 创建设备 11
2.1.4 硬件资源分配 11
2.1.5 调用其他驱动程序 11
2.1.6 串行硬件的访问 12
2.1.7 访问硬件 12
2.1.8 硬件问题 12
2.1.9 电源管理 13
2.1.10 wmi 13
2.1.11 nt事件报告 13
2.1.12 系统线程 13
2.2 设备驱动程序的类型 14
2.2.1 windows概述 14
2.2.2 i/o请求处理 14
2.2.3 即插即用设备栈 15
2.2.4 标准总线驱动程序和类驱动
程序 16
2.2.5 驱动程序栈举例 17
2.3 驱动程序选择 18
2.3.1 现成的驱动程序 18
2.3.2 使用标准驱动程序 18
2.3.3 操作系统 19
2.3.4 分层的设备驱动程序 19
2.3.5 单一驱动程序 19
2.3.6 建议的和可选的功能 19
2.4 wdm的合理性 19
2.4.1 一个核心模型 20
2.4.2 复杂性 20
2.4.3 即插即用与分层 20
2.4.4 功能范围 21
2.4.5 开发环境 21
2.4.6 开发者支持 21
2.5 小结 21
第3章 设备驱动程序设计 22
3.1 引言 22
3.2 驱动程序设计指南 22
3.2.1 文档 22
3.2.2 好的设计 22
3.3 内核调用 23
3.3.1 内核宏 24
3.3.2 内核对象 25
3.3.3 驱动程序例程名称 25
3.4 处理器模型 25
3.4.1 处理器模式 25
3.4.2 中断级 26
3.5 使用内存 27
3.5.1 内存池 27
3.5.2 旁视列表 28
3.5.3 其他的内存考虑 28
3.5.4 访问用户应用程序内存 29
3.5.5 dma 29
3.6 irp处理 29
3.6.1 irp参数 30
3.6.2 在驱动程序栈中处理irp 30
3.7 小结 31
第4章 wdm驱动程序环境 33
4.1 系统设置 33
4.1.1 ddk 33
4.1.2 本书配套光盘软件的安装 34
4.1.3 快捷方式 35
4.2 实用程序 35
4.2.1 dos框 36
4.2.2 计算机管理控制台 36
4.2.3 nt devices小程序 36
4.2.4 硬件向导 36
4.2.5 注册表编辑器 36
4.2.6 inf编辑器 36
4.2.7 wbem 36
4.2.8 调试程序 37
4.2.9 nt和windows 2000实用程序 37
4.2.10 本书配套光盘上的工具 37
4.3 驱动程序目标 37
4.4 驱动程序语言和库 38
4.5 好的代码 39
4.6 build实用程序 39
4.6.1 makefile 39
4.6.2 sources 40
4.6.3 makefile文件 40
4.6.4 build目录 41
4.6.5 其他build步骤 41
4.6.6 dirs文件 42
4.7 vc++项目 42
4.7.1 makefile构造环境 42
4.7.2 makedrvr 43
4.7.3 目录 44
4.7.4 常见任务 44
4.8 wdm1驱动程序代码 44
4.8.1 编译器选项 45
4.8.2 头文件 45
4.8.3 驱动程序进入模块 45
4.8.4 版本资源 46
4.8.5 访问注册表 46
4.8.6 unicode_string结构 48
4.9 安装wdm1 50
4.10 安装详细信息 50
4.10.1 inf文件 50
4.10.2 注册表 51
4.10.3 windows 2000对象 51
4.11 设备和驱动程序的管理 51
4.11.1 添加另一个设备 51
4.11.2 删除设备 51
4.11.3 更新驱动程序 52
4.11.4 nt式驱动程序 52
4.12 小结 52
第5章 设备接口 74
5.1 设备 74
5.1.1 设备访问 74
5.1.2 后续的i/o 75
5.2 设备对象和设备扩展 75
5.3 设备对象的创建和删除 76
5.3.1 创建设备 77
5.3.2 删除设备 78
5.4 设备名 78
5.5 设备接口 80
5.6 win32设备接口访问 82
5.6.1 得到设备的接口名 83
5.6.2 运行wdm1test 84
5.7 小结 86
第6章 测试与调试 92
6.1 测试、测试、再测试 92
6.2 驱动程序测试 92
6.2.1 测试所有的函数是否都工作 92
6.2.2 windows 2000和windows 98 93
6.2.3 多处理器 93
6.2.4 取消i/o 93
6.3 调试 94
6.4 调试技术 95
6.4.1 递增式的开发 95
6.4.2 检查版本 96
6.4.3 windows 2000还是windows 98 96
6.5 调试工具 96
6.5.1 windows 2000事件 96
6.5.2 跟踪工具 97
6.5.3 驱动程序验证程序 97
6.5.4 调试程序 97
6.6 debugprint 97
6.6.1 使用debugprint 98
6.6.2 使用debugprint monitor 98
6.6.3 在驱动程序中使用debugprint 99
6.7 关于调试的说明 101
6.7.1 更新驱动程序 101
6.7.2 驱动程序在引导时失败 101
6.7.3 驱动程序依赖性 101
6.7.4 未取消的irp 101
6.8 错误检查代码 102
6.9 小结 104
第7章 分发例程 105
7.1 分发例程irp 105
7.2 i/o请求包 105
7.2.1 分发例程处理 105
7.2.2 可重入性 106
7.2.3 irp处理 106
7.2.4 irp完成 107
7.3 irp结构 107
7.4 常用的irp参数 109
7.4.1 “创建”irp, iro_mj_create 109
7.4.2 “关闭”irp, irp_mj_close 109
7.4.3 “读”irp, irp_mj_read 110
7.4.4 “写”irp, irp_mj_write 110
7.4.5 ioctl irp, irp_mj_ioctl 110
7.5 用户缓冲区 110
7.5.1 缓冲i/o 110
7.5.2 直接i/o 110
7.5.3 其他i/o方式 111
7.5.4 deviceiocontrol缓冲区 111
7.6 wdm1分发例程 111
7.6.1 创建和关闭 112
7.6.2 写 113
7.6.3 读 115
7.6.4 ioctl 115
7.6.5 系统控制 116
7.7 小结 116
第8章 即插即用与设备栈 117
8.1 设计概述 117
8.1.1 设计目标 117
8.1.2 即插即用系统 118
8.2 即插即用消息 121
8.3 设备枚举 123
8.3.1 固定的和可配置的设备 123
8.3.2 枚举 123
8.3.3 设备树 124
8.4 设备栈 125
8.4.1 pnp支持与设备栈 125
8.4.2 设备对象 125
8.5 上沿 126
8.5.1 usb键盘例子 126
8.5.2 功能设备对象和物理设备对象 128
8.5.3 上沿定义 128
8.6 小结 129
第9章 即插即用的实现 130
9.1 实现即插即用 130
9.1.1 添加和删除设备 131
9.1.2 基本的pnp处理程序 131
9.1.3 沿设备栈向下传递不支持
的irp 135
9.1.4 pnp状态和消息 135
9.1.5 状态标志 136
9.1.6 保持irp 137
9.1.7 打开的句柄 138
9.1.8 处理pnp irp的时间 139
9.1.9 实现资源分配 145
9.2 测试wdm2 150
9.3 其他pnp irp 151
9.3.1 irp_mn_device_usage_
notification 151
9.3.2 irp_mn_filter_resource_
requirements 151
9.3.3 irp_mn_query_bus_
information 151
9.3.4 irp_mn_query_
capabilities 151
9.3.5 irp_mn_query_device_
relations 152
9.3.6 irp_mn_query_device_
text 152
9.3.7 irp_mn_query_id 152
9.3.8 irp_mn_query_
interface 152
9.3.9 irp_mn_query_pnp_device_
state 152
9.3.10 irp_mn_query_resource_
requirements 153
9.3.11 irp_mn_query_
resources 153
9.3.12 irp_mn_read_config 153
9.3.13 irp_mn_set_lock 153
9.3.14 irp_mn_write_config 153
9.4 pnp通知 153
9.4.1 win32 pnp通知 153
9.4.2 设备驱动程序pnp通知 157
9.4.3 通知请求驱动程序交互 158
9.5 高级的即插即用 158
9.5.1 总线驱动程序 158
9.5.2 发送pnp irp 159
9.5.3 设备属性 160
9.6 小结 160
第10章 电源管理 161
10.1 电源概述 161
10.1.1 acpi 161
10.1.2 win32电源管理 162
10.1.3 wdm2power应用程序 162
10.1.4 电池小类驱动程序 163
10.2 系统电源策略 163
10.3 电源irp 164
10.4 处理电源irp 165
10.4.1 处理设备电源irp 165
10.4.2 处理系统电源irp 165
10.4.3 不处理电源irp 167
10.5 设备电源策略主 167
10.6 处理“设置电源”irp 169
10.6.1 设置系统电源状态 171
10.6.2 设置设备电源状态 174
10.6.3 setpowerstate 174
10.7 分发例程的电源处理 175
10.8 测试wdm2电源功能 175
10.9 设备功能 176
10.10 高级电源管理 177
10.10.1 唤醒 177
10.10.2 电源顺序 178
10.10.3 停止系统关闭事件 178
10.10.4 电源通知 178
10.10.5 检测系统电源状态变化 178
10.10.6 wmi支持 178
10.11 小结 179
第11章 安装 180
11.1 wdm驱动程序的安装过程 180
11.2 inf文件 180
11.3 标准节 181
11.4 inf文件的节层次结构 182
11.4.1 wdm1free.inf 183
11.4.2 infedit 186
11.5 跨平台和wdm inf文件 187
11.5.1 在windows 2000中安装wdm1 188
11.5.2 windows 2000服务注册表项 188
11.6 查找驱动程序 189
11.6.1 硬件id 190
11.6.2 兼容id 190
11.6.3 重复枚举 191
11.7 nt式驱动程序的安装 191
11.7.1 安装过程 192
11.7.2 驱动程序的装入顺序 193
11.7.3 nt 4控制面板devices小程序 193
11.7.4 windows 2000设备管理 194
11.7.5 windows 98设备管理 195
11.7.6 reg文件 195
11.8 在windows 98中安装nt式驱动
程序 195
11.9 小结 196
第12章 wmi 204
12.1 概述 204
12.1.1 wbem模型 205
12.1.2 wdm提供者 205
12.2 一个wmi驱动程序 207
12.2.1 wmi构造环境 209
12.2.2 注册为wmi数据提供者 210
12.2.3 处理系统控制irp 211
12.2.4 querywmireginfo处理程序 213
12.2.5 querywmidatablock处理
程序 213
12.2.6 setwmidatablock处理程序 215
12.2.7 setwmidataitem处理程序 216
12.2.8 executewmimethod处理程序 217
12.2.9 触发wmi事件 218
12.3 wmi运行 219
12.4 小结 220
第13章 事件的报告 221
13.1 概述 221
13.2 消息文件 222
13.3 注册为事件源 224
13.4 事件的产生 225
13.5 wdm3事件的测试 228
13.6 小结 228
第14章 debugprint 229
14.1 设计规范 229
14.2 设计实现 229
14.3 测试驱动程序代码 230
14.3.1 系统线程 230
14.3.2 事件 233
14.3.3 同步 233
14.3.4 产生跟踪事件 235
14.3.5 链表 236
14.3.6 最后的代码 238
14.4 debugprint驱动程序 239
14.4.1 设计 240
14.4.2 debugprint设备 240
14.4.3 读队列 241
14.4.4 取消irp 242
14.4.5 写算法 244
14.4.6 读算法 245
14.5 debugprint monitor 246
14.5.1 设计 247
14.5.2 win32工作者线程 247
14.5.3 debugprint_event类 247
14.5.4 win32重叠i/o 248
14.6 小结 251
第15章 wdmio和phdio驱动程序 252
15.1 win32接口 252
15.1.1 ioctl 253
15.1.2 命令 253
15.2 lpt打印机驱动程序的应用程序 254
15.2.1 并行端口 254
15.2.2 wdmoiotest 255
15.2.3 phdiotest 255
15.2.4 发出命令 256
15.2.5 使用中断驱动的i/o写数据 258
15.2.6 使用中断驱动的i/o读数据 260
15.3 测试wdmio 261
15.3.1 安装wdmio 261
15.3.2 logconfig节 261
15.3.3 运行wdmiotest 262
15.4 测试phdio 263
15.4.1 安装phdio 263
15.4.2 运行phdiotest 263
15.5 wdmio和phdio的分析 264
15.5.1 使用哪一个 264
15.5.2 缺陷 264
15.6 小结 265
第16章 硬件i/o irp的排队 266
16.1 硬件访问 266
16.2 irp队列 267
16.2.1 设备队列 267
16.2.2 startio例程 268
16.3 命令的处理 271
16.4 取消排队的irp 272
16.4.1 排队irp的取消 273
16.4.2 wdmio irp取消策略 273
16.4.3 另一种取消策略 274
16.5 “清理”irp的处理 275
16.6 测试、取消和清理 277
16.7 补充设备队列 278
16.8 小结 282
第17章 中断驱动的i/o 283
17.1 中断处理 283
17.1.1 中断的性质 283
17.1.2 连接到中断 284
17.2 wdmio读与写 285
17.3 中断处理程序 288
17.4 延迟过程调用 289
17.4.1 使用基本的dpc 290
17.4.2 自定义dpc 291
17.5 定时器 292
17.5.1 1秒间隔定时器 292
17.5.2 wdmio超时 292
17.5.3 自定义定时器 293
17.6 小结 294
第18章 nt硬件 295
18.1 nt式驱动程序的构造 295
18.1.1 ddk问题 295
18.1.2 编译环境 296
18.1.3 nt式驱动程序结构 296
18.2 设备的创建与删除 296
18.3 资源分配 298
18.4 资源转换 304
18.5 资源的查找 305
18.5.1 自动检测的硬件 306
18.5.2 查询可配置总线 308
18.5.3 最后的资源查找技术 309
18.6 小结 309
第19章 wdm系统驱动程序 310
19.1 客户驱动程序的编写 310
19.2 过滤驱动程序 311
19.3 nt层次 311
19.4 小结 312
第20章 通用串行总线 313
20.1 设备类 313
20.2 概述 314
20.2.1 windows usb驱动程序接口 314
20.2.2 传输类型 315
20.3 usb低级结构 315
20.3.1 usb设备 315
20.3.2 usb信号 316
20.3.3 总线信号 316
20.3.4 低层协议 317
20.3.5 电源 318
20.4 usb设备框架 318
20.4.1 总线枚举 318
20.4.2 标准控制事务 319
20.4.3 描述符 320
20.4.4 驱动程序安装 321
20.4.5 usb类 321
20.4.6 新增功能 322
20.5 客户驱动程序设计 323
20.5.1 端点类型选择 323
20.5.2 等时设备 323
20.6 小结 324
第21章 usb驱动程序接口 325
21.1 usb客户驱动程序设计 326
21.1.1 usbkbd的使用 326
21.1.2 usbkbd安装 327
21.1.3 头文件和库 328
21.2 usbdi的ioctl 328
21.2.1 urb 329
21.2.2 usbdi的调用 330
21.2.3 多个usbdi调用 332
21.3 访问usb 332
21.3.1 初始化usb设备 332
21.3.2 发出urb 334
21.3.3 选择接口 335
21.3.4 其他初始化 338
21.3.5 取消配置的选择 338
21.3.6 中断传输 338
21.3.7 控制传输 341
21.3.8 其他问题 342
21.4 usbkbd的测试 342
21.5 usbdi结构参考 346
21.6 usbdi urb参考 348
21.6.1 urb设置功能 348
21.6.2 urb传输功能 350
21.6.3 urb缺省管道功能 351
21.6.4 urb等时帧功能 352
21.7 小结 352
第22章 人工输入设备模型 353
22.1 hid概述 353
22.2 hid模型 354
22.2.1 报告 354
22.2.2 用法 355
22.2.3 获取hid功能 356
22.3 hid模型表示 357
22.3.1 hid描述符 357
22.3.2 设备属性 357
22.3.3 报告描述符 358
22.6 小结 363
第23章 hid客户 364
23.1 hid类驱动程序 364
23.1.1 hid类驱动程序特征 364
23.1.2 windows hid客户程序 365
23.1.3 头文件 366
23.1.4 hid usb小驱动程序 366
23.1.5 usb启动设备 367
23.2 用户态hid客户程序 367
23.2.1 查找hid设备 368
23.2.2 读取hid功能 368
23.2.3 读取输入报告 372
23.2.4 发送输出报告 374
23.2.5 其他用户态hid客户函数 376
23.2.6 运行hidkbduser 376
23.3 内核态hid客户程序 379
23.3.1 客户程序类型 379
23.3.2 pnp通知 380
23.3.3 hidkbd设备 381
23.3.4 读取hid功能 386
23.3.5 hidkbd设备的打开和关闭 387
23.3.6 数据的读写 387
23.3.7 其他hid类ioctl 392
23.4 小结 392
附录a 信息资源 393
附录b pc99 396
附录c 直接存储器访问 400
附录d 词汇表 401
前言
第1章 引言 1
1.1 windows驱动程序模型 1
1.1.1 wdm与nt式驱动程序 2
1.1.2 可用的驱动程序 3
1.1.3 本书配套光盘 3
1.1.4 设备驱动程序软件工具 3
1.1.5 未讨论的驱动程序类型 4
1.2 新的思维方式 4
1.2.1 设备驱动程序环境 4
1.2.2 术语与资源 5
1.3 win32程序接口 5
1.3.1 基本i/o 5
1.3.2 重叠的异步请求 6
1.3.3 环境 6
1.3.4 设备特定的限制 7
1.3.5 驱动程序的其他win32访问 7
1.4 小结 7
第2章 概述 8
.2.1 设备驱动程序的组成部分 8
2.1.1 驱动程序入口点和回调例程 9
2.1.2 分发例程 10
2.1.3 创建设备 11
2.1.4 硬件资源分配 11
2.1.5 调用其他驱动程序 11
2.1.6 串行硬件的访问 12
2.1.7 访问硬件 12
2.1.8 硬件问题 12
2.1.9 电源管理 13
2.1.10 wmi 13
2.1.11 nt事件报告 13
2.1.12 系统线程 13
2.2 设备驱动程序的类型 14
2.2.1 windows概述 14
2.2.2 i/o请求处理 14
2.2.3 即插即用设备栈 15
2.2.4 标准总线驱动程序和类驱动
程序 16
2.2.5 驱动程序栈举例 17
2.3 驱动程序选择 18
2.3.1 现成的驱动程序 18
2.3.2 使用标准驱动程序 18
2.3.3 操作系统 19
2.3.4 分层的设备驱动程序 19
2.3.5 单一驱动程序 19
2.3.6 建议的和可选的功能 19
2.4 wdm的合理性 19
2.4.1 一个核心模型 20
2.4.2 复杂性 20
2.4.3 即插即用与分层 20
2.4.4 功能范围 21
2.4.5 开发环境 21
2.4.6 开发者支持 21
2.5 小结 21
第3章 设备驱动程序设计 22
3.1 引言 22
3.2 驱动程序设计指南 22
3.2.1 文档 22
3.2.2 好的设计 22
3.3 内核调用 23
3.3.1 内核宏 24
3.3.2 内核对象 25
3.3.3 驱动程序例程名称 25
3.4 处理器模型 25
3.4.1 处理器模式 25
3.4.2 中断级 26
3.5 使用内存 27
3.5.1 内存池 27
3.5.2 旁视列表 28
3.5.3 其他的内存考虑 28
3.5.4 访问用户应用程序内存 29
3.5.5 dma 29
3.6 irp处理 29
3.6.1 irp参数 30
3.6.2 在驱动程序栈中处理irp 30
3.7 小结 31
第4章 wdm驱动程序环境 33
4.1 系统设置 33
4.1.1 ddk 33
4.1.2 本书配套光盘软件的安装 34
4.1.3 快捷方式 35
4.2 实用程序 35
4.2.1 dos框 36
4.2.2 计算机管理控制台 36
4.2.3 nt devices小程序 36
4.2.4 硬件向导 36
4.2.5 注册表编辑器 36
4.2.6 inf编辑器 36
4.2.7 wbem 36
4.2.8 调试程序 37
4.2.9 nt和windows 2000实用程序 37
4.2.10 本书配套光盘上的工具 37
4.3 驱动程序目标 37
4.4 驱动程序语言和库 38
4.5 好的代码 39
4.6 build实用程序 39
4.6.1 makefile 39
4.6.2 sources 40
4.6.3 makefile文件 40
4.6.4 build目录 41
4.6.5 其他build步骤 41
4.6.6 dirs文件 42
4.7 vc++项目 42
4.7.1 makefile构造环境 42
4.7.2 makedrvr 43
4.7.3 目录 44
4.7.4 常见任务 44
4.8 wdm1驱动程序代码 44
4.8.1 编译器选项 45
4.8.2 头文件 45
4.8.3 驱动程序进入模块 45
4.8.4 版本资源 46
4.8.5 访问注册表 46
4.8.6 unicode_string结构 48
4.9 安装wdm1 50
4.10 安装详细信息 50
4.10.1 inf文件 50
4.10.2 注册表 51
4.10.3 windows 2000对象 51
4.11 设备和驱动程序的管理 51
4.11.1 添加另一个设备 51
4.11.2 删除设备 51
4.11.3 更新驱动程序 52
4.11.4 nt式驱动程序 52
4.12 小结 52
第5章 设备接口 74
5.1 设备 74
5.1.1 设备访问 74
5.1.2 后续的i/o 75
5.2 设备对象和设备扩展 75
5.3 设备对象的创建和删除 76
5.3.1 创建设备 77
5.3.2 删除设备 78
5.4 设备名 78
5.5 设备接口 80
5.6 win32设备接口访问 82
5.6.1 得到设备的接口名 83
5.6.2 运行wdm1test 84
5.7 小结 86
第6章 测试与调试 92
6.1 测试、测试、再测试 92
6.2 驱动程序测试 92
6.2.1 测试所有的函数是否都工作 92
6.2.2 windows 2000和windows 98 93
6.2.3 多处理器 93
6.2.4 取消i/o 93
6.3 调试 94
6.4 调试技术 95
6.4.1 递增式的开发 95
6.4.2 检查版本 96
6.4.3 windows 2000还是windows 98 96
6.5 调试工具 96
6.5.1 windows 2000事件 96
6.5.2 跟踪工具 97
6.5.3 驱动程序验证程序 97
6.5.4 调试程序 97
6.6 debugprint 97
6.6.1 使用debugprint 98
6.6.2 使用debugprint monitor 98
6.6.3 在驱动程序中使用debugprint 99
6.7 关于调试的说明 101
6.7.1 更新驱动程序 101
6.7.2 驱动程序在引导时失败 101
6.7.3 驱动程序依赖性 101
6.7.4 未取消的irp 101
6.8 错误检查代码 102
6.9 小结 104
第7章 分发例程 105
7.1 分发例程irp 105
7.2 i/o请求包 105
7.2.1 分发例程处理 105
7.2.2 可重入性 106
7.2.3 irp处理 106
7.2.4 irp完成 107
7.3 irp结构 107
7.4 常用的irp参数 109
7.4.1 “创建”irp, iro_mj_create 109
7.4.2 “关闭”irp, irp_mj_close 109
7.4.3 “读”irp, irp_mj_read 110
7.4.4 “写”irp, irp_mj_write 110
7.4.5 ioctl irp, irp_mj_ioctl 110
7.5 用户缓冲区 110
7.5.1 缓冲i/o 110
7.5.2 直接i/o 110
7.5.3 其他i/o方式 111
7.5.4 deviceiocontrol缓冲区 111
7.6 wdm1分发例程 111
7.6.1 创建和关闭 112
7.6.2 写 113
7.6.3 读 115
7.6.4 ioctl 115
7.6.5 系统控制 116
7.7 小结 116
第8章 即插即用与设备栈 117
8.1 设计概述 117
8.1.1 设计目标 117
8.1.2 即插即用系统 118
8.2 即插即用消息 121
8.3 设备枚举 123
8.3.1 固定的和可配置的设备 123
8.3.2 枚举 123
8.3.3 设备树 124
8.4 设备栈 125
8.4.1 pnp支持与设备栈 125
8.4.2 设备对象 125
8.5 上沿 126
8.5.1 usb键盘例子 126
8.5.2 功能设备对象和物理设备对象 128
8.5.3 上沿定义 128
8.6 小结 129
第9章 即插即用的实现 130
9.1 实现即插即用 130
9.1.1 添加和删除设备 131
9.1.2 基本的pnp处理程序 131
9.1.3 沿设备栈向下传递不支持
的irp 135
9.1.4 pnp状态和消息 135
9.1.5 状态标志 136
9.1.6 保持irp 137
9.1.7 打开的句柄 138
9.1.8 处理pnp irp的时间 139
9.1.9 实现资源分配 145
9.2 测试wdm2 150
9.3 其他pnp irp 151
9.3.1 irp_mn_device_usage_
notification 151
9.3.2 irp_mn_filter_resource_
requirements 151
9.3.3 irp_mn_query_bus_
information 151
9.3.4 irp_mn_query_
capabilities 151
9.3.5 irp_mn_query_device_
relations 152
9.3.6 irp_mn_query_device_
text 152
9.3.7 irp_mn_query_id 152
9.3.8 irp_mn_query_
interface 152
9.3.9 irp_mn_query_pnp_device_
state 152
9.3.10 irp_mn_query_resource_
requirements 153
9.3.11 irp_mn_query_
resources 153
9.3.12 irp_mn_read_config 153
9.3.13 irp_mn_set_lock 153
9.3.14 irp_mn_write_config 153
9.4 pnp通知 153
9.4.1 win32 pnp通知 153
9.4.2 设备驱动程序pnp通知 157
9.4.3 通知请求驱动程序交互 158
9.5 高级的即插即用 158
9.5.1 总线驱动程序 158
9.5.2 发送pnp irp 159
9.5.3 设备属性 160
9.6 小结 160
第10章 电源管理 161
10.1 电源概述 161
10.1.1 acpi 161
10.1.2 win32电源管理 162
10.1.3 wdm2power应用程序 162
10.1.4 电池小类驱动程序 163
10.2 系统电源策略 163
10.3 电源irp 164
10.4 处理电源irp 165
10.4.1 处理设备电源irp 165
10.4.2 处理系统电源irp 165
10.4.3 不处理电源irp 167
10.5 设备电源策略主 167
10.6 处理“设置电源”irp 169
10.6.1 设置系统电源状态 171
10.6.2 设置设备电源状态 174
10.6.3 setpowerstate 174
10.7 分发例程的电源处理 175
10.8 测试wdm2电源功能 175
10.9 设备功能 176
10.10 高级电源管理 177
10.10.1 唤醒 177
10.10.2 电源顺序 178
10.10.3 停止系统关闭事件 178
10.10.4 电源通知 178
10.10.5 检测系统电源状态变化 178
10.10.6 wmi支持 178
10.11 小结 179
第11章 安装 180
11.1 wdm驱动程序的安装过程 180
11.2 inf文件 180
11.3 标准节 181
11.4 inf文件的节层次结构 182
11.4.1 wdm1free.inf 183
11.4.2 infedit 186
11.5 跨平台和wdm inf文件 187
11.5.1 在windows 2000中安装wdm1 188
11.5.2 windows 2000服务注册表项 188
11.6 查找驱动程序 189
11.6.1 硬件id 190
11.6.2 兼容id 190
11.6.3 重复枚举 191
11.7 nt式驱动程序的安装 191
11.7.1 安装过程 192
11.7.2 驱动程序的装入顺序 193
11.7.3 nt 4控制面板devices小程序 193
11.7.4 windows 2000设备管理 194
11.7.5 windows 98设备管理 195
11.7.6 reg文件 195
11.8 在windows 98中安装nt式驱动
程序 195
11.9 小结 196
第12章 wmi 204
12.1 概述 204
12.1.1 wbem模型 205
12.1.2 wdm提供者 205
12.2 一个wmi驱动程序 207
12.2.1 wmi构造环境 209
12.2.2 注册为wmi数据提供者 210
12.2.3 处理系统控制irp 211
12.2.4 querywmireginfo处理程序 213
12.2.5 querywmidatablock处理
程序 213
12.2.6 setwmidatablock处理程序 215
12.2.7 setwmidataitem处理程序 216
12.2.8 executewmimethod处理程序 217
12.2.9 触发wmi事件 218
12.3 wmi运行 219
12.4 小结 220
第13章 事件的报告 221
13.1 概述 221
13.2 消息文件 222
13.3 注册为事件源 224
13.4 事件的产生 225
13.5 wdm3事件的测试 228
13.6 小结 228
第14章 debugprint 229
14.1 设计规范 229
14.2 设计实现 229
14.3 测试驱动程序代码 230
14.3.1 系统线程 230
14.3.2 事件 233
14.3.3 同步 233
14.3.4 产生跟踪事件 235
14.3.5 链表 236
14.3.6 最后的代码 238
14.4 debugprint驱动程序 239
14.4.1 设计 240
14.4.2 debugprint设备 240
14.4.3 读队列 241
14.4.4 取消irp 242
14.4.5 写算法 244
14.4.6 读算法 245
14.5 debugprint monitor 246
14.5.1 设计 247
14.5.2 win32工作者线程 247
14.5.3 debugprint_event类 247
14.5.4 win32重叠i/o 248
14.6 小结 251
第15章 wdmio和phdio驱动程序 252
15.1 win32接口 252
15.1.1 ioctl 253
15.1.2 命令 253
15.2 lpt打印机驱动程序的应用程序 254
15.2.1 并行端口 254
15.2.2 wdmoiotest 255
15.2.3 phdiotest 255
15.2.4 发出命令 256
15.2.5 使用中断驱动的i/o写数据 258
15.2.6 使用中断驱动的i/o读数据 260
15.3 测试wdmio 261
15.3.1 安装wdmio 261
15.3.2 logconfig节 261
15.3.3 运行wdmiotest 262
15.4 测试phdio 263
15.4.1 安装phdio 263
15.4.2 运行phdiotest 263
15.5 wdmio和phdio的分析 264
15.5.1 使用哪一个 264
15.5.2 缺陷 264
15.6 小结 265
第16章 硬件i/o irp的排队 266
16.1 硬件访问 266
16.2 irp队列 267
16.2.1 设备队列 267
16.2.2 startio例程 268
16.3 命令的处理 271
16.4 取消排队的irp 272
16.4.1 排队irp的取消 273
16.4.2 wdmio irp取消策略 273
16.4.3 另一种取消策略 274
16.5 “清理”irp的处理 275
16.6 测试、取消和清理 277
16.7 补充设备队列 278
16.8 小结 282
第17章 中断驱动的i/o 283
17.1 中断处理 283
17.1.1 中断的性质 283
17.1.2 连接到中断 284
17.2 wdmio读与写 285
17.3 中断处理程序 288
17.4 延迟过程调用 289
17.4.1 使用基本的dpc 290
17.4.2 自定义dpc 291
17.5 定时器 292
17.5.1 1秒间隔定时器 292
17.5.2 wdmio超时 292
17.5.3 自定义定时器 293
17.6 小结 294
第18章 nt硬件 295
18.1 nt式驱动程序的构造 295
18.1.1 ddk问题 295
18.1.2 编译环境 296
18.1.3 nt式驱动程序结构 296
18.2 设备的创建与删除 296
18.3 资源分配 298
18.4 资源转换 304
18.5 资源的查找 305
18.5.1 自动检测的硬件 306
18.5.2 查询可配置总线 308
18.5.3 最后的资源查找技术 309
18.6 小结 309
第19章 wdm系统驱动程序 310
19.1 客户驱动程序的编写 310
19.2 过滤驱动程序 311
19.3 nt层次 311
19.4 小结 312
第20章 通用串行总线 313
20.1 设备类 313
20.2 概述 314
20.2.1 windows usb驱动程序接口 314
20.2.2 传输类型 315
20.3 usb低级结构 315
20.3.1 usb设备 315
20.3.2 usb信号 316
20.3.3 总线信号 316
20.3.4 低层协议 317
20.3.5 电源 318
20.4 usb设备框架 318
20.4.1 总线枚举 318
20.4.2 标准控制事务 319
20.4.3 描述符 320
20.4.4 驱动程序安装 321
20.4.5 usb类 321
20.4.6 新增功能 322
20.5 客户驱动程序设计 323
20.5.1 端点类型选择 323
20.5.2 等时设备 323
20.6 小结 324
第21章 usb驱动程序接口 325
21.1 usb客户驱动程序设计 326
21.1.1 usbkbd的使用 326
21.1.2 usbkbd安装 327
21.1.3 头文件和库 328
21.2 usbdi的ioctl 328
21.2.1 urb 329
21.2.2 usbdi的调用 330
21.2.3 多个usbdi调用 332
21.3 访问usb 332
21.3.1 初始化usb设备 332
21.3.2 发出urb 334
21.3.3 选择接口 335
21.3.4 其他初始化 338
21.3.5 取消配置的选择 338
21.3.6 中断传输 338
21.3.7 控制传输 341
21.3.8 其他问题 342
21.4 usbkbd的测试 342
21.5 usbdi结构参考 346
21.6 usbdi urb参考 348
21.6.1 urb设置功能 348
21.6.2 urb传输功能 350
21.6.3 urb缺省管道功能 351
21.6.4 urb等时帧功能 352
21.7 小结 352
第22章 人工输入设备模型 353
22.1 hid概述 353
22.2 hid模型 354
22.2.1 报告 354
22.2.2 用法 355
22.2.3 获取hid功能 356
22.3 hid模型表示 357
22.3.1 hid描述符 357
22.3.2 设备属性 357
22.3.3 报告描述符 358
22.6 小结 363
第23章 hid客户 364
23.1 hid类驱动程序 364
23.1.1 hid类驱动程序特征 364
23.1.2 windows hid客户程序 365
23.1.3 头文件 366
23.1.4 hid usb小驱动程序 366
23.1.5 usb启动设备 367
23.2 用户态hid客户程序 367
23.2.1 查找hid设备 368
23.2.2 读取hid功能 368
23.2.3 读取输入报告 372
23.2.4 发送输出报告 374
23.2.5 其他用户态hid客户函数 376
23.2.6 运行hidkbduser 376
23.3 内核态hid客户程序 379
23.3.1 客户程序类型 379
23.3.2 pnp通知 380
23.3.3 hidkbd设备 381
23.3.4 读取hid功能 386
23.3.5 hidkbd设备的打开和关闭 387
23.3.6 数据的读写 387
23.3.7 其他hid类ioctl 392
23.4 小结 392
附录a 信息资源 393
附录b pc99 396
附录c 直接存储器访问 400
附录d 词汇表 401
Writing Windows WDM device drivers
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!