什么是驱动程序 1
基于优先权的区分 1
驱动程序接口 1
第1章 入门 1
需要编写哪种驱动程序 2
哪一类设备 2
哪种硬件接口 3
什么是性能需求 4
总结 4
第一部分 Windows执行环境和VxD 7
第2章 Windows的虚拟世界 7
什么是虚拟机 7
基于页面请求的虚拟内存 8
多任务模式 8
处理器的模式 9
保护模式 10
V86模式 10
Windows执行环境 11
总结 12
第3章Windows实现虚拟环境的方法 13
捕获I /O端口的访问 13
捕获内存映射设备 14
捕获中断和异常 15
处理器寄存器 15
进一步分析线性地址和页面映射 16
Win32地址 18
Win16地址 18
Win32、Win16和DOS应用程序的地址 18
DOS地址 19
Windows 3.x如何满足Win16和DOS应用程序的地址需要 20
Windows 9x如何满足Win32、Win16和DOS应用程序的地址需要 22
总结 25
第4章 初识VxD 26
VxD的加载 26
VxD的基本结构 27
设备描述块 28
相关数据结构 29
事件通知 32
静态加载的VxD的初始化和终止消息 34
动态加载的VxD初始化和结束时的消息 34
VM的状态变化消息 35
线程消息 36
Windows 3.x的不同之处 37
总结 37
第5章 最基本的VxD构架 38
开发VxD所需的工具 38
“DDK”版本的源程序 39
DDB和设备控制入口函数:SKELCTRL.ASM 41
VtoolsD版本的SKELETON.VXD 44
Windows 3.x版本的SKELETON 48
总结 49
第6章VxD与硬件交互 62
I/O映射与内存映射 62
与I/O映射的设备交互 62
静态配置的内存映射设备 63
与内存映射的设备交互 63
动态配置的内存映射设备 64
另一种数据传输的方式:DMA 66
使用系统DMA 67
系统DMA缓冲区的条件 67
分配系统DMA缓冲区的函数 69
VDMAD服务一览 70
VDMAD服务的细节 71
使用总线DMA 73
使用VDMAD_Scatter_Lock的正确方法 76
在总线DMA传输中使用事件 78
Windows 3.x的不同之处 79
总结 79
中断和VMM 86
第7章 在VxD中处理硬件中断 86
使用VPICD服务 87
详解CPICD服务函数:VXDIRQ.C 88
汇编转换层和C处理函数 90
HwIntProc回调函数:DDBISE.ASM和VXDISR.C 90
VXDISR的事件处理 91
Windows 3.x的不同之处 92
总结 93
第8章 虚拟世界中的VxD 103
VMM和处理器异常 104
设备所有权 104
虚拟I/O映射设备:PORTTRAP的例子 104
初始化函数:OnDeviceInit 105
处理不同的I/O端口类型:PortTrapThunk 106
检查所有权:PortTrapHandler 107
处理VM_TERMINATE 110
使用PORTTRAP 110
虚拟内存映射设备:PAGETRAP的例子 110
初始化过程 111
异常处理函数 113
处理VM_Terminate消息 115
使用PAGETRAP 115
虚拟硬件中断 115
哪个VM 115
负责硬件中断反射的VxD 117
回调函数:MaskChangeHandler 118
回调函数:HwIntHandler 119
总结 121
回调函数:EOIHandler 121
回调函数:VirtIntHandler和IRETHandler 121
第9章 即插即用:概况 146
PnP组件 146
在Windows 9x安装过程中的PnP组件 148
设备安装过程中的PnP组件 149
启动时的PnP组件 149
总结 153
第10章 即插即用的设备驱动程序VxD 154
PnP VxD的安装 154
关于INF文件 154
PnP的启动过程 156
关闭系统 161
其他的PnP配置情况 161
新的配置 162
删除设备 162
一个PnP驱动程序VxD的例子:TRICORD.VxD 163
RICORD.INF的细节 163
代码详解 165
总结 170
第11章 从应用程序到VxD通信 183
Win16应用程序到VxD:VxD方面 183
从Win16应用程序到VxD:应用程序方面 184
Win16应用程序到VxD:实例代码 185
从Win32应用程序到VxD:VxD方面 191
从Win32应用程序到VxD:应用程序方面 192
Win32到VxD:实例代码 193
总结 197
第12章 从VxD到应用程序的通信 211
从VxD到Win16应用程序调用的困难 211
在Windows 3.x下的VxD PostMessage 212
使用嵌套执行服务 215
在Windows 9x下的VxD PostMessage 218
在Windows 9x下从VxD到Win16应用程序:Appy Time 219
与Win 32相关的技巧:异步过程调用 220
APCVXD例子 220
与Win32相关的技巧:Win32事件 225
VxD和Win32事件 227
总结 232
31位应用程序与16位DLL交互需要转换层 260
为什么DLL驱动程序都是16位的 260
第13章 关于16位的DLL驱动程序 260
第二部分 DLL驱动程序 260
静态和动态库 261
为什么要把驱动程序做成DLL的形式 261
应用程序与DLL 261
DLL和堆栈段 262
DLL和数据段 263
DLL和动态分配的内存之间的关系 263
DLL初始化和结束 264
DLL函数的要求 264
基本的DLL驱动程序 264
创建基本的DLL驱动程序 265
DLL也需要借助于应用程序 266
总结 267
DLL驱动程序的调试工具 267
第14章 DLL驱动程序:与硬件设备交互 271
DLL和端口访问 271
端口映射的例子 271
驱动程序设计中的常规 272
DLL驱动程序 273
访问内存映射的硬件设备 276
内存映射DLL驱动程序的版本 277
关于内存访问的一些高级话题 278
总结 282
第15章 DLL驱动程序:中断处理 291
Windows内存管理策略 291
驱动程序的内存要求 296
可在中断处理时访问的静态代码和数据:简单的方法 297
Windows 3.x下的正确方法 297
动态分配中断期间安全访问的缓冲区:简单的方法 298
动态分配中断期间安全访问的缓冲区:正确的方法 298
安装中断处理函数 301
全新的驱动程序:概述 302
全新的驱动程序:代码 302
总结 306
第16章 DLL驱动程序:使用DMA 323
操作DMA缓冲区的必要条件 323
如何分配DMA缓冲区 323
使用VDMAD服务函数是更好的实现方法 324
与Windows DMA应用程序相关的知识 324
Windows下的DMA DOS应用程序 324
总结 326
第17章 DLL驱动程序:使用实模式服务函数 327
与DOS驱动程序交互 328
IOCTL的特殊处理 329
与TSR交互 330
总结 341
第18章 转换层:在32位中调用16位 353
什么是Flat Thunk 353
转换层的任务 355
转换层的魔术 355
逐步生成转换层 358
逐步构造转换层 361
总结 362
第19章 DLL驱动程序:使用时钟 374
用于周期性通知的时钟 374
使用SetTimer函数 374
挂接INT 1 Ch和INT 8h 375
不要依赖18.2的频率 375
使用timeSetEvent:Pros和Cons 375
如果上述的方法都不管用,那就求助于VxD 376
计算消耗的时间 376
GetTickCount、timeGetTime和QueryPerformanceCounter 377
总结 377
附录 Intel体系结构 378
8086/8088和实模式 378
选择器和描述符 379
80286和保护模式 379
中断和异常 380
保护模式的机制 381
优先级 382
80386和虚拟8086模式 383
附录B 为C语言的VxD调用汇编语言 386
声明DDB 386
为VMM/VxD的回调函数增加转换层 388
介绍封装库 390
WRAPPERS.H 391
关于WRAPPERS.ASM 392
建立函数封装库 396
总结 397
虚拟8086模式 684