本书主要介绍了用DriverStudio 3.1开发工具开发Windows 2000/XP下的WDM设备驱动程序的原理及编程方法。本书详细介绍了WDM基本程序框架和编程,IRP的基本概念及编程,WDM和应用程序之间的通信、即插即用、电源管理、WMI的编程技术,IRP串行处理、过滤器驱动程序,WDM访问硬件设备、处理硬件中断、实现DMA操作的编程技术,以及大量的基本编程技术,还有USB接口和PCI接口设备驱动程序WDM的开发。本书附有20个典型的编程实例,便于读者学习和掌握。本书是一本技术性较强的工具书。本书的适用对象是具有一定计算机硬件及C++语言基础的计算机应用开发人员,是计算机应用开发人员和高等院校学生的实用参考书。
第1章 WINDOWS 2000和WDM驱动程序 1
1.1 Windows 2000组件概述 1
1.2 Windows 2000中的驱动程序种类 2
1.3 WDM驱动程序特点 3
1.3.1 内核模式驱动程序的设计目标 3
1.3.2 WDM驱动程序模型 5
1.3.3 设备和驱动程序的层次结构 6
1.3.4 中断级别IRQL 6
1.3.5 设备接口 7
第2章 WDM驱动程序的基本结构 9
2.1 KDriver类 9
2.1.1 基本函数 9
2.1.2 基本例程 10
2.2 KPnpDevice类 15
2.2.1 基本函数 15
2.2.2 基本例程 20
2.2.3 扩展例程 21
2.3 KPnpLowerDevice类 23
2.4 CharSample实例 23
第3章 IRP操作 25
3.1 IRP数据结构 25
3.1.1 IRP重要域 30
3.1.2 IO堆栈单元 31
3.2 KIrp类 38
3.3 IRP基本操作 43
3.3.1 完成IRP 43
3.3.2 向下传递IRP 43
3.3.3 取消IRP 46
3.3.4 分配和释放IRP 47
第4章 WDM驱动程序编程入门 49
4.1 建立WDM编程环境 49
4.2 创建WDM驱动程序 51
4.2.1 使用DriveWizard创建RegSample的工程文件 51
4.2.2 修改RegSample的工程文件 58
4.2.3 RegSample实例 59
4.3 生成WDM驱动程序 65
4.4 安装WDM驱动程序 66
4.5 Win32 Console和MFC应用程序 72
4.5.1 Win32 Console应用程序 72
4.5.2 MFC应用程序 75
4.6 调试说明 81
第5章 WDM驱动程序和应用程序之间的通信 82
5.1 应用程序与驱动程序的通信 82
5.1.1 打开设备 82
5.1.2 关闭设备 84
5.1.3 DeviceIoControl函数调用 84
5.1.4 ReadFile和WriteFile函数调用 87
5.2 驱动程序与应用程序的通信 88
5.2.1 DeviceIoControl异步完成 89
5.2.2 WIN32事件通知 91
5.3 驱动程序对应用程序通信实例 94
5.3.1 异步完成实例 94
5.3.2 事件通知实例 103
第6章 基本编程技术 109
6.1 字符串操作 109
6.1.1 字符串格式 109
6.1.2 串处理函数 109
6.1.3 KUnitizedName类 110
6.1.4 KUstring类 111
6.2 内存管理 112
6.2.1 内存类型 112
6.2.2 KMemory类 113
6.2.3 KHeap类 115
6.3 数据操作 116
6.3.1 Klist, KInterlockedList和KInterruptSafeList类 116
6.3.2 Kfifo, KInterlockedFifo和KInterruptSafeFifo类 120
6.3.3 KArray 122
6.3.4 KInterlockedCounter类 124
6.3.5 其他数据处理函数 125
6.4 KRegistryKey类 126
6.5 KFile类 131
6.6 KDeferredCall类 134
6.7 定时器 136
6.7.1 1Hz定时器 136
6.7.2 KTimedCallback类 136
6.8 KIoWorkItem类 137
6.9 CancelSpinLock类 138
6.10 KSpinLock类 139
6.11 内核同步对象 140
6.11.1 KDispatcherObject类 140
6.11.2 KDispatcherObject派生类 142
6.12 TimerSample实例 147
6.13 FileThread实例 150
6.14 ReadWrite实例 160
第7章 即插即用例程 170
7.1 即插即用简介 170
7.1.1 PnP组件 170
7.1.2 即插即用IRP 170
7.1.3 即插即用状态 171
7.2 即插即用编程 172
7.2.1 即插即用例程 172
7.2.2 即插即用策略 173
7.2.3 PnP例程编程 175
7.2.4 PnP资源 178
7.3 即插即用通知 178
7.3.1 Win32 PnP通知 178
7.3.2 内核模式通知 181
7.3.3 定制通知 183
7.3.4 PnPEvent实例 184
第8章 电 源 管 理 195
8.1 电源管理概述 195
8.1.1 系统电源状态与设备电源状态 196
8.1.2 设备的电源能力 197
8.1.3 IRP_MJ_POWER请求 198
8.1.4 电源管理控制标志位 199
8.1.5 设备的唤醒特征和空闲检测 199
8.2 电源管理编程 199
8.2.1 电源管理例程 199
8.2.2 电源管理政策 200
8.2.3 电源管理编程 204
8.2.4 设备唤醒 204
8.2.5 空闲检测 204
8.3 电源管理实例 205
8.3.1 PowerIdle实例 205
8.3.2 PowerSleep实例 209
第9章 WMI 212
9.1 WMI概述 212
9.2 WMI编程类函数 214
9.2.1 KWmiContext类 214
9.2.2 KWmiDataBlock类 217
9.2.3 KWmiString类 218
9.3 WMISample实例 219
第10章 IRP的串行处理 249
10.1 由系统管理的IRP设备队列的串行处理 249
10.1.1 实现由系统管理的IRP设备队列串行处理的函数 249
10.1.2 系统管理的IRP设备队列串行处理程序分析 251
10.2 由驱动程序管理的IRP队列的串行处理 255
10.2.1 KDriverManagedQueueEx类 255
10.2.2 驱动系统管理的IRP队列串行处理程序分析 257
10.3 IRP串行处理实例 261
10.3.1 StartIoChar_Device实例 261
10.3.2 StartIoChar_Driver实例 264
第11章 WDM过滤器驱动程序 268
11.1 KWdmFilterDevice类 268
11.2 WDM过滤器驱动程序生成 270
11.3 WDM过滤器驱动程序安装 272
11.3.1 同时安装功能驱动程序和过滤器驱动程序 273
11.3.2 单独安装过滤器驱动程序 274
11.4 CharFilter实例 277
11.5 CharFilter_Class实例 281
第12章 USB设备开发 284
12.1 USB接口概述 284
12.1.1 USB设备的配置. 接口和端点 285
12.1.2 USB数据的传输方式 287
12.1.3 USB描述符 292
12.1.4 标准设备请求 298
12.2 USB编程类函数 299
12.2.1 KUsbLowerDevice类 300
12.2.2 KUsbInterface类 304
12.2.3 KUsbPipe类 305
12.3 USBCOUNTER实例 308
12.3.1 驱动程序 311
12.3.2 应用程序 320
12.3.3 CY7C63001程序 322
第13章 PCI设备驱动程序开发 323
13.1 硬件访问 323
13.1.1 KIoRange和KMemoryRange类 323
13.1.2 KIoRegister和KMemoryRegister类 325
13.1.3 KIoRegisterSafe和KMemoryRegisterSafe类 325
13.1.4 硬件访问编程 325
13.2 中断处理 327
13.2.1 KInterrupt类 327
13.2.2 中断处理编程 329
13.3 DMA传输 330
13.3.1 DMA编程类函数 330
13.3.2 DMA传输编程 334
13.4 PCI9054实例 337
13.5 DMASample实例 346
第14章 完全DDK支持的WDM驱动程序开发 353
14.1 创建WDM驱动程序 353
14.2 WDM驱动程序 359
附录A DRIVERMONITOR的使用介绍 367
附录B SOFTICE的使用介绍 369
附录C SOFTICE命令详解 374
参考文献 400
WDM(Windows Driver Model)是微软公司全新的驱动程序模式, 支持即插即用. 电源管理和WMI技术, 它的运行平台是Windows 98/2000/XP/2003操作系统. 随着Windows操作系统的不断发展, 那些致力于Windows操作系统下微机接口设备开发的广大科技开发人员, 必须学习和掌握WDM的原理及编程方法.
我对WDM进行了深入的研究, 在学习的过程中, 不仅在原理上有许多一时难以理解的问题, 而且在编写实例时, 也遇到了许多未曾想到的技术困难. 虽然最终解决了所有问题, 但却花费了大量的时间. 可以自信地说, 我的经验是宝贵的, 读者将会少走很多弯路和节省大量的时间.
我对参考文献所提到的《Windows WDM设备驱动程序开发指南》. 《Programming the Microsoft Windows Driver Model》和《Windows 2000驱动程序开发大全》三本书做了深入的研究, 基本掌握了WDM的编程思想. 我之所以说编程思想, 是因为这三本书所用的是DDK工具, 而我所用的是DriverWorks工具. 我不大喜欢用DDK编程, 它太复杂了, 有点非高手莫入的味道. 有人把DDK比做汇编语言, 把DriverWorks比做C语言, 这比较恰当. 也许有人认为还是DDK正宗, 话虽如此, 但对于大多数的计算机应用开发人员来说, 时间及效率可能更重要. 这便是我为什么向读者积极推荐用DriverStudio工具来开发Windows设备驱动程序的原因.
开发工具
下面谈谈WDM设备驱动程序的开发工具.
开发WDM离不开DDK, 微软公司提供的DDK版本有:Windows 98 DDK. Windows 2000 DDK. Windows XP DDK(Windows.XP.SP1 DDK)和Windows.Server.2003 DDK, 分别对应相应的4种操作系统. WDM程序仅在源代码级兼容这四个操作系统, 其所生成的可执行代码是不同的, 必须用相应的DDK来生成某一操作系统下的WDM驱动程序.
本书没有将Windows 98考虑在内, 主要基于两点:一则它已渐渐远去, 再者, 它对WDM的支持不是特别好, 有一些语句它并不支持. 关于这一点, 请参考文献1. 2.
DriverStudio是一个开发工具包, 它包含VtoolsD. DriverWorks. DriverNetWorks和SoftICE等开发工具, 现在其最高的版本为3.1版本. VtoolsD用于开发Windows98下的VxD驱动程序, DriverWorks用于开发普通设备的WDM驱动程序, DriverNetWorks用于开发网络设备的WDM驱动程序, SoftICE用于开发程序的调试. 用DriverWorks或DriverNetWorks开发WDM驱动程序, 需要DDK的支持.
WDM程序框架有一定的要求, 若用DDK开发WDM, 读者可参考文献1. 2的范例. 可以用DriverStudio 3.1中的DriverWizard生成一个DDK支持的WDM驱动程序框架, 本书的第14章讲述了其过程. 用DriverWorks所生成的WDM程序框架, 对于开发人员来说, 非常简单. 但实质上, 仍满足DDK对WDM的要求, 调用的仍是DDK所提供的基本函数.
本书还用到Visual C++ 6.0和Windows XP SP2 SDK工具. Platform SDK只在编译PnPEvent和WMISample实例的应用程序时需要.
本书配套光盘
本书配套光盘含有书中所有实例的驱动程序和应用程序的全部源代码, 以及生成的驱动程序和可执行的应用程序. 除USBCounter和PCI9054实例因需要硬件设备的支持而无法运行外, 其他18个实例均可运行. 但光盘中的实例仅在Windows XP操作系统下完成.
Chinesedot目录下的HZK16点阵字库, FileThread实例需要用到.
设备类注册表下的注册表文件用于创建Windows 2000和Windows XP操作系统下的“WDM范例”设备类信息.
再版信息
同第一版相比, 主要有四个方面的变化:
1.开发工具为最新的DriverStudio 3.1.
2.主要修改了第4, 5, 11章的内容.
3.对程序做了必要的注释, 另外对部分实例做了轻微的改动.
4.第14章, 讲述了只用DDK支持的WDM驱动程序的创建过程.
忠告:
若论对WDM的理解, 本书不及参考文献中的任何一本. WDM驱动程序不是一下子就可以入门的, 调试PCI和USB设备驱动程序时, 更需要对硬件设计及编程有相当的了解, 并制定严谨的调试步骤. 本书的特点是选择了一个较好学的工具, 对入门的详细步骤进行了描述, 以及提供了大量实例.
希望这本书能对您现在或将来的工作有所帮助.
本书的目标是实用和简单, 特点是入门和实例.
我以自己的实战经验写书, 既然是经验, 难免有高低之分, 请大家见谅.
由于作者的理论水平有限, 书中难免出现差错和遗漏, 敬请广大计算机应用开发人员批评指正.
感谢爱人周利莉的支持和激励.
感谢邰铭和于洪涛教员的支持.
感谢张瑾和李晶晶教员的支持.
感谢吴强. 张勇. 孙勇的支持.
感谢江华. 周慧琴夫妇的支持.
感谢邵高平. 程保炜. 胡君杰和刘立柱教员的支持.
感谢网络时代.
感谢各位读者.
感谢电子工业出版社.
感谢我的家人和朋友们.
武安河
无封面