Writing Windows WDM device drivers

副标题:无

作   者:(美)[C.坎特]Chris Cant著;孙义等译

分类号:

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


已确认勘误

次印刷

页码 勘误内容 提交人 修订印次

Writing Windows WDM device drivers
    • 名称
    • 类型
    • 大小

    光盘服务联系方式: 020-38250260    客服QQ:4006604884

    意见反馈

    14:15

    关闭

    云图客服:

    尊敬的用户,您好!您有任何提议或者建议都可以在此提出来,我们会谦虚地接受任何意见。

    或者您是想咨询:

    用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问

    Video Player
    ×
    Audio Player
    ×
    pdf Player
    ×
    Current View

    看过该图书的还喜欢

    some pictures

    解忧杂货店

    东野圭吾 (作者), 李盈春 (译者)

    亲爱的云图用户,
    光盘内的文件都可以直接点击浏览哦

    无需下载,在线查阅资料!

    loading icon