目录 2
译者序 2
DDK文档说明 2
第一篇 驱动程序编写者指南 2
第1章 驱动程序开发环境 2
1.1 自由构建和检查构建 2
1.2 调试环境 3
第2章 测试驱动程序 4
2.1 DriverVerifier 4
2.2 Driver Verifier的能力 4
2.3 Driver Verifier对图形驱动程序的能力 9
2.4 激活和监视DriveeVerifier 12
1.1 什么是即插即用 21
第1章 即插即用和电源管理的介绍 21
第一部分 即插即用和电源管理的要求 21
第二篇 即插即用、电源管理和设置设计指南 21
1.1.1 PnP组件 22
1.1.2 PnP的支持级别 23
1.2 什么是电源管理 23
1.2.1 电源管理的最初含义 24
1.2.2 电源管理的支持级别 24
1.2.3 全系统范围电源管理的概述 24
1.2.4 电源状态 25
1.3 设备树 26
1.4 驱动程序层次和设备对象 27
1.4.1 驱动程序种类 27
1.4.2 例子:驱动程序层次 30
1.4.3 设备对象种类 32
1.4.4 例子:设备对象 34
2.2 PnP和电源管理DriverEntry例程 37
2.1 必需的PnP支持的概述 37
程序支持 37
第2章 PnP和电源管理必需的驱动 37
2.3 PnP和电源管理AddDevice例程 38
2.4 DispatchPnP例程 41
2.5 DispatchPower例程 41
2.6 PnP和电源管理Unload例程 42
第二部分 即插即用 43
第3章 理解PnP 43
3.1 PnP驱动程序设计准则 43
3.2 PnP和设备树 44
3.3 PnP设备状态 45
3.4 动态地添加一个新的PnP设备 46
3.5 硬件资源 53
3.6 在驱动程序里使用GUID 55
3.6.1 定义和导出新的GUID 55
3.6.2 在驱动程序代码里包含GUID 56
第4章 处理即插即用IRP的规则 58
4.1 PnP IRP需求 58
4.2 沿设备堆栈向下传递PnP IRP 59
4.3 延迟PnP IRP的处理直到低层 60
的驱动程序完成 60
第5章 启动、停止和删除设备 65
5.1 启动一设备 65
5.1.1 启动功能驱动程序里的一个设备 65
5.1.2 启动过滤器驱动程序里的一个设备 67
5.1.3 启动总线驱动程序里的一个设备 67
5.1.4 启动设备设计注意事项 67
5.2 为了资源重新平衡而停止一个设备 68
5.2.1 理解何时停止发布IRP 68
5.2.2 处理IRP_MN_QUERY_STOP_ 69
DEVICE请求 69
DEVICE请求 71
5.2.3 处理IRP_MN_STOP_DEVICE请求 71
5.2.4 处理IRP_MN_CANCEL_STOP_ 71
5.2.5 当一个设备被暂停时,保留进 72
入的IRP 72
5.3 删除一个设备 73
5.3.1 理解何时发布删除IRP 73
5.3.2 处理一个IRP_MN QUERY_REMOVE 76
_DEVICE请求 76
5.3.3 处理一个IRP_MN_REMOVE_ 77
DEVICE请求 77
5.3.4 处理一个IRP_MN_CANCEL_ 81
REMOVE_DEVICE请求 81
5.3.5 处理一个IRP_MN_SURPRISE_ 82
REMOVAL请求 82
6.1 PnP通知概述 85
第6章 使用PnP通知 85
6.2 编写PnP通知回调例程的准则 86
6.3 使用PnP设备接口改变通知 87
6.3.1 为设备接口改变通知注册 87
6.3.2 处理设备接口改变事件 88
6.4 使用PnP目标设备改变通知 88
6.4.1 注册目标设备改变通知 88
6.4.2 处理一个GUID_TARGET_DEVICE 89
_QUERY_REMOVE事件 89
6.4.3 处理一个GUID_TARGET_DEVICE_ 89
REMOVE_COMPLETE事件 89
6.4.4 处理一个GUID_TARGET_DEVICE_ 90
REMOVE_CANCELED事件 90
6.5 使用PnP硬件配置文件改变通知 90
6.5.1 注册硬件配置文件改变通知 90
6.6 使用PnP定制通知 91
6.5.2 处理硬件配置文件改变事件 91
第7章 支持多功能设备 93
7.1 支持多功能PC Card设备 93
7.1.1 支持遵照多功能标准的PC Card 94
7.1.2 支持有不完全配置寄存器地址 94
的PC Card 94
7.1.3 支持有不完全配置寄存器的PC Card 96
7.2 支持多功能PCI设备 99
7.3 支持其他总线上的多功能设备 100
7.4 使用系统提供的mfsys 100
7.5 为一个多功能设备生成资源图 103
8.1 内核模式下的电源管理组件 105
8.1.1 ACPI BIOS 105
8.1.2 ACPI驱动程序 105
第三部分 电源管理 105
第8章 在驱动程序内支持电源管理 105
8.1.3 电源管理器 106
8.1.4 电源管理中驱动程序的作用 106
8.2 驱动程序的电源管理职能 107
8.2.1 报告设备的电源能力 107
8.2.2 对电源管理设置设备对象标记 110
8.2.3 处理电源IRP 110
8.2.6 激活设备唤醒能力 114
8.2.4 设备的加电 114
8.2.5 设备的掉电 114
8.3 处理电源IRP的规则 115
8.3.1 使用PoCallDriver 115
8.3.2 传递电源IRP 115
8.3.3 设备休眠时排队I/O请求 117
8.3.4 处理未被支持的或者无法识别 117
的电源IRP 117
9.1 设备电源状态 118
第9章 独立设备的电源管理 118
9.1.1 设备工作状态D0 119
9.1.2 设备休眠状态D1、D2、和D3 119
9.1.3 设备电源状态所需的支持 120
9.2 管理设备电源策略 121
9.3 为设备电源状态处理IRP_MN_SET 122
_POWER 122
9.3.1 处理设备掉电IRP 122
9.3.2 处理设备加电IRP 125
9.3.3 设备电源IRP的IoCompletion例程 126
9.4 为设备电源状态处理IRP_MN_ 127
QUERY_POWER 127
9.5 为设备电源状态发送IRP_MN_QUERY_ 129
POWER或者IRP_MN_SET_POWER 129
9.6 检测空闲的设备 130
9.6.1 用于空闲检测的电源管理器例程 131
9.6.2 执行设备特定的空闲检测 131
第10章 处理系统电源状态请求 132
10.1 系统电源状态 132
10.1.1 系统工作状态S0 133
10.1.2 系统休眠状态S1、S2、S3和S4 133
10.1.3 系统关机状态S5 134
10.1.4 系统电源动作 135
10.2 系统电源策略 135
10.3 防止系统电源状态变化 136
10.4 为系统电源状态处理IRP_MN_ 136
QUERY_POWER 136
10.4.1 使系统查询电源IRP失效 137
10.4.2 在设备电源策略所有者中处理 137
系统查询电源IRP 137
查询电源IRP 138
10.4.3 在总线驱动程序中处理系统 138
10.4.4 在过滤器驱动程序中处理系统 139
查询电源IRP 139
10.5 为系统电源状态处理IRP_MN_ 139
SET_POWER 139
10.5.1 在设备电源策略所有者中 140
处理系统设置电源IRP 140
10.5.2 在总线驱动程序中处理系统设置 141
电源IRP 141
10.5.3 在过滤器驱动程序中处理系统设置 141
电源IRP 141
第11章 支持具有唤醒能力的设备 143
11.1 等待/唤醒操作综述 143
11.1.1 确定设备是否能唤醒系统 144
IRP的路径 145
11.1.2 理解通过设备树的等待/唤醒 145
11.1.3 完成等待/唤醒IRP综述 149
11.2 处理等待/唤醒IRP的步骤 150
11.2.1 在功能驱动程序或者过滤器驱 150
动程序中处理等待/唤醒IRP 150
11.2.2 在总线驱动程序中处理等待/ 151
唤醒IRP 151
11.3 发送等待/唤醒IRP 152
11.2.3 等待/唤醒IRP的IoCompletion例程 152
11.3.1 确定何时发送等待/唤醒IRP 153
11.3.2 等待/唤醒IRP请求 153
11.3.3 等待/唤醒的回调例程 153
11.3.4 撤消等待/唤醒IRP 154
11.4 等待/唤醒IRP的Cancel例程 155
第四部分 设置 157
第12章 设备安装概述 157
12.1 设备安装组件 157
12.2 PnP设备安装示例 159
12.3 Setup如何为设备选择驱动程序 161
12.4 系统设置阶段 164
第13章 为设备提供驱动程序 166
13.1 驱动程序文件 166
13.2 注册表中的驱动程序信息 167
13.3 指定驱动程序装载顺序 168
13.4 安装过滤器驱动程序 170
13.5 为设备安装Null驱动程序 171
第14章 建立INF文件 173
14.1 INF文件的一般准则′ 173
14.2 为设备文件说明源和目标位置 174
14.3 建立跨平台的和/或双操作系统 175
的INF文件 175
14.4 建立国际化的INF文件 176
的安全性 177
14.5 在设备的INF文件中加强打开文件 177
14.6 从应用程序访问INF文件 178
14.6.1 打开和关闭INF文件 178
14.6.2 从INF文件提取信息 178
第15章 编写协作安装程序 179
15.1 协作安装程序概述 179
15.2 协作安装程序界面 181
15.3 协作安装程序操作 182
15.4 注册协作安装程序 185
15.4.1 注册设备专用的协作安装程序 185
15.4.2 注册类协作安装程序 186
第16章 编写类安装程序 188
16.1 类安装程序界面 188
16.2 设备安装函数小结 189
16.4 在类安装程序的INF文件中加强 190
文件打开的安全性 190
16.3 注册类安装程序 190
第17章 编写定制设备安装应用程序 191
17.1 安装与驱动程序共用的软件实用程序 191
17.2 定制安装应用程序准则 191
第18章 提供设备属性页 193
18.1 设备属性页所需的支持 193
18.2 处理DIF_ADDPROPERTYPAGE 194
_ADVANCED请求 194
18.3 属性页回调函数 195
18.4 处理属性页的Windows消息 195
第19章 设备安装疑难解答 198
19.1 使用SetupAPI记录日志 199
19.1.1 设置SetupAPI记录日志级别 199
19.1.2 解释SetupAPI日志文件示例 201
19.2 显示设备管理器中的隐藏设备 203
设备 204
第20章 安装一个要求重新启动机器的 204
第三篇 内核模式驱动程序设计指南 208
第1章 Windows 2000和WDM驱动程序 208
1.1 Windows 2000组件概述 208
1.2 Windows 2000中的驱动程序种类 209
1.3 Windows 2000和WDM驱动程序的 211
设计目标 211
1.3.1 可移植性 212
1.3.2 可配置性 212
1.3.3 永远抢占优先和永远中断 213
1.3.4 多处理器安全 214
1.3.5 基于对象 216
1.3.6 带有可重用IRP的包驱动I/O 216
1.3.7 支持异步I/O 217
第2章 分层的I/O、IRP和I/O对象 218
2.1 Windows 2000 I/O模型概述 218
文件对象 219
2.3 IRP和驱动程序特定的I/O栈位置 222
2.4 驱动程序对象和标准驱动程序例程 227
2.4.1 对象的不透明性 229
2.4.2 标准驱动程序对象入口点 229
2.4.3 其他标准驱动程序例程 230
2.4.4 标准驱动程序例程的注意事项 232
2.5 设备配置和分层驱动程序 232
2.5.1 样例设备和驱动程序配置 233
2.5.2 添加驱动程序的注意事项 234
2.6 设备对象和分层驱动程序 234
2.6.1 针对样本配置的设备对象 235
2.6.2 设备对象的注意事项 236
序的支持 237
3.1 系统组件和分层内核模式驱动程序 237
第3章 系统定义的对象和对驱动程 237
3.1.1 操纵系统定义的对象的支持例程 238
3.1.2 存储系统定义的对象 240
3.2 设备对象和设备扩展 241
3.2.1 定义设备扩展 242
3.2.2 创建设备对象和设备扩展 243
3.2.3 初始化驱动程序特定的设备 244
对象和设备扩展 244
3.2.4 设置用户缓冲区的访问 245
3.3 适配器对象和DMA 251
3.3.1 映射寄存器 252
3.3.2 获取适配器对象 254
3.3.3 拆分传输请求 255
3.3.4 使用系统DMA 256
3.3.5 使用总线控制器DMA 263
3.3.6 执行发散/收集DMA 270
3.4 控制器对象 271
3.4.1 创建带有控制器扩展的控制器对象 272
3.4.2 为I/O操作分配控制器对象: 273
3.5 中断对象 275
DIRQL和处理器掩码 276
3.5.2 注册ISR 276
3.5.1 获得系统指定的中断向量、 276
3.6 DPC对象 278
3.6.1 注册和排队DpcForIsr例程 278
3.6.2 注册和排队CustomDpc例程 279
3.7 带有相关的DPC的定时器对象 281
3.7.1 注册和启用IoTimer例程 281
3.7.2 注册和排队CustomTimerDpc例程 282
3.8 设备队列对象和互锁队列 284
3.8.1 设置设备队列对象和排队IRP 285
3.8.2 设置一个互锁队列和排队IRP 286
3.9 内核调度者对象 288
3.9.1 定时器对象 290
3.9.2 事件对象 292
3.9.3 信号量对象 294
3.9.4 互斥体对象 296
3.9.5 线程在调度者对象上等待的 299
报警和APC的处理 299
3.10 回调对象 300
3.10.1 定义回调对象 300
3.10.2 使用驱动程序定义的回调对象 301
3.10.3 使用系统定义的回调对象 302
第4章 驱动程序基本结构 304
4.1 标准驱动程序例程 304
4.2 最低层设备驱动程序的分段IRP处理 306
4.3 中间层驱动程序的分段IRP处理 311
4.4 设计和开发一个驱动程序 313
4.4.1 设备对象命名和设备接口注册 313
4.4.2 为驱动程序例程选择名字 314
4.4.3 开始设计 314
4.4.4 开始开发 316
5.1 DriverEntry例程需求 319
5.1.1 DriverEntry例程语法与参数 319
第5章 DriverEntry和Reinitialize例程 319
5.2 DriverEntry例程功能 320
5.2.1 DriverEntry例程必备功能 320
5.1.2 DriverEntry返回值 320
5.2.2 DriverEntry可选功能 321
5.3 Reinitialize例程需求与功能 322
第6章 Dispatch例程 324
6.1 Dispatch例程需求 324
6.1.1 Dispatch例程一般实现 325
6.1.2 Dispatch例程条件实现 325
6.2 Dispatch例程基本功能 326
6.2.2 如何在一个Dispatch例程中 327
完成一个IRP 327
6.2.1 何时检查I/O栈位置 327
6.2.3 何时在Dispatch例程中完成一个IRP 328
6.2.4 如何从一个Dispatch例程传送带 329
有效参数的IRP 329
6.2.5 为较低层驱动程序分配IRP 330
6.2.6 处理异步传输请求 331
6.3 Dispatch例程设计 331
6.3.1 DispatchCreate和DispatchClose功能 332
6.3.2 DispatchCleanup功能 334
6.3.3 DispatchRead或DispatchWrite功能 335
6.3.4 Dispatch(Internal)DeviceControl功能 339
第7章 StartIo和队列管理例程 344
7.1 排队IRP 344
7.2 StartIo例程需求 345
7.2.1 设备驱动程序中的StartIo例程 345
7.2.2 StartIo例程功能 347
7.2.3 I/O操作设备编程 349
7.2.4 较高层驱动程序中的StartIo例程 349
7.2.5 实现StartIo的注意事项 350
7.3 使用互锁队列或设备队列的需求 351
7.3.1 驱动程序管理的队列的存储需求 351
7.3.4 用驱动程序创建的线程管理互锁 352
7.3.3 在驱动程序管理的队列中排队IRP 352
队列 352
7.3.2 建立驱动程序管理的队列 352
7.3.5 管理补充设备队列 353
8.1 ISR需求 357
8.1.1 ISR性能 357
第8章 中断服务例程 357
8.1.3 建立一个ISR 358
8.2 ISR基本功能 358
8.1.2 其他需要的驱动程序例程 358
8.3 重叠I/O操作的ISR功能 359
9.1 DpcForIsr和CustomDpc例程需求 361
9.1.1 DpcForIsr例程与CustomDpc例程 361
第9章 DpcForIsr例程和CustomDpc例程 361
9.1.2 DpcForIsr例程基本需求 362
9.1.3 CustomDpc例程基本需求 362
9.1.4 其他需要的驱动程序例程 363
9.1.5 建立DpcForIsr和CustomDpc例程 363
9.2 DpcForIsr和CustomDpc功能 364
9.2.1 使用缓冲I/O和满足设备控制IRP 365
9.2.2 直接I/O使用 365
9.2.3 实现一个DpcForIsr或CustomDpc 366
例程的注意事项 366
10.1 SynchCritSection例程需求 368
10.1.1 使用SynchCritSection例程 368
第10章 SynchCritSection例程 368
10.2 SynchCritSection例程功能 369
10.1.3 SynchCritSection例程性能需求 369
10.2.1 为I/O操作对设备编程 369
10.1.2 运行SynchCritSection例程 369
10.2.2 维护有关中断驱动I/O操作的状态 370
11.1 驱动程序控制例程 373
Control例程 373
11.1.1 驱动程序控制例程语法和参数 373
第11章 AdapterControl和Controller 373
驱动程序 374
11.1.3 设计有DriverControl例程的 374
11.1.4 存储需求 374
11.1.2 从DriverControl例程返回 374
11.1.5 建立AdapterControl和Controller 375
Control例程 375
11.2 AdapterControl例程需求 376
11.3 ControllerControl例程需求 376
第12章 Cancel例程 378
12.1 Cancel例程需求 378
12.2 处理可撤消IRP 379
12.2.2 在处理请求的驱动程序例程中 380
处理可撤消IRP 380
处理可撤消IRP 380
12.2.1 在传递IRP的驱动程序例程中 380
12.2.4 与Cancel例程一起使用驱动程序 381
提供的自旋锁 381
12.2.3 使用系统撤消自旋锁 381
12.3 Cancel例程功能 385
12.3.2 不带有StartIo例程的驱动程序中 386
Cancel例程 386
的Cancel例程 386
12.3.1 带有StartIo例程的驱动程序中的 386
12.4 处理可撤消IRP时的注意事项 387
13.1 使用IoCompletion例程 389
13.1.1 建立IoCompletion例程 389
第13章 IoCompletion例程 389
13.1.2 调用IoSetCompletion Routine 390
13.1.3 为低层驱动程序分配IRP 392
13.2 IoCompletion例程需要的功能 393
14.1 定时器例程需求 395
14.2 IoTimer例程功能 395
第14章 IoTimer和CustomTimerDpc例程 395
14.2.2 为IoTimer例程建立环境 396
14.2.3 使用IoTimer例程 396
14.2.1 建立IoTimer例程 396
14.3 CustomTimerDpc例程功能 397
14.3.1 设置CustomTimerDpc例程 398
14.3.2 为CustomTimerDpc例程设置环境 398
14.3.3 使用CustomTimerDpc例程 399
15.1 Unload例程需求 401
15.2 Unload例程环境 401
第15章 Unload例程 401
15.3.1 PnP驱动程序的Unload功能 402
15.3.2 非PnP驱动程序的Unload功能 402
15.3 Unload例程功能 402
第16章 常见的驱动程序设计问题 405
16.1 管理硬件优先级 405
16.2 使用自旋锁 407
16.2.1 为自旋锁和被保护数据提供 408
存储空间 408
16.2.2 初始化自旋锁 409
16.2.3 调用使用了自旋锁的支持例程 409
16.2.4 快速释放自旋锁 410
16.2.5 使用自旋锁时防止错误或死锁 412
的出现 412
16.3 轮询设备 413
16.4 管理内存的使用 414
16.4.1 使用系统内存 415
16.4.2 使用内核栈 419
16.4.3 使用后备列表 420
16.4.4 只读内存保护 421
16.5.1 在DMA操作期间刷新高速 422
缓存数据 422
16.5 为DMA和PIO维护高速缓存的一致性 422
16.5.2 在PIO操作期间刷新高速缓存数据 423
16.6 错误记录和NTSTATUS值 423
16.6.1 调用IoAllocateErrorLogEntry 424
16.6.2 填充错误记录包 424
16.6.3 设置错误记录包中的NTSTATUS值 426
16.6.5 定义新的IO_ERR_XXX 427
16.6.6 定义私有NTSTATUS常量 427
16.6.4 调用IoWriteErrorLogEntry 427
16.7 处理可删除介质 428
16.7.1 响应来自文件系统的验证请求 428
16.7.2 通知文件系统可能的介质改变 429
16.7.4 在中间层驱动程序中建立IRP 430
16.8 使设备对应用程序和驱动程序可用 430
16.7.3 检查设备对象中的标志 430
16.8.1 注册设备接口 431
16.8.2 激活和禁止设备接口 432
16.8.3 使用设备接口 432
16.9 可分页代码和数据 433
16.9.1 使驱动程序代码可分页 433
16.9.2 锁住可分页代码或数据 435
16.9.3 对整个驱动程序分页 437
16.10 常见的驱动程序可靠性问题 438
16.10.1 缓冲I/O中的错误 439
16.10.2 引用用户空间地址时的错误 442
16.10.3 直接I/O中的错误 443
16.10.4 调用者输入和设备状态中的错误 444
16.10.5 Dispatch例程中的错误 446
16.10.6 多处理器环境中的错误 447
16.10.7 处理IRP时的错误 448
第一部分 图形驱动程序 451
第1章 图形系统概述 451
第四篇 图形驱动程序设计指南 451
第2章 对图形驱动程序的GDI支持 452
2.1 从驱动程序的观点看GDI 452
2.1.1 作为应用程序图形语言的GDI 453
2.1.2 作为绘制引擎的GDI 453
2.2 GDI/驱动程序的分工 454
2.2.1 GDI和驱动程序的通信 454
2.2.2 PDEV协商 455
2.2.3 表面协商 456
2.3 GDI支持的服务 460
2.3.1 GDI对表面的支持 460
2.3.2 GDI对调色板的支持 461
2.3.3 路径的GDI服务 462
2.3.4 GDI绘图服务及其他 462
2.3.5 GDI字体和文本服务 463
2.4 浮点数支持 464
2.5 数据类型 464
2.3.6 GDI支持的服务及其他 464
3.1 图形驱动程序函数支持 466
3.1.1 必需的图形驱动程序函数 466
第3章 支持DDI 466
程序函数 467
3.1.3 可选的图形驱动程序函数 467
3.1.2 有条件地需要的图形驱动 467
3.2 支持初始化和终止函数 469
3.2.1 驱动程序初始化和清除 469
3.2.2 PDEV初始化和清除 470
3.2.3 启用和禁用表面 471
3.3 创建设备相关位图 471
3.4 支持图形输出 472
3.4.1 绘制直线和曲线 472
3.4.2 绘制和填充路径 476
3.4.3 拷贝位图 478
3.4.4 过渡调色技术 480
3.4.5 图像颜色管理 480
3.5.1 管理调色板 481
3.5.2 实现画刷 481
3.5 支持DDI颜色和调色板函数 481
3.6 支持DDI字体和文本函数 482
3.6.1 管理和优化字体 482
3.6.2 绘制文本 485
第4章 显示器介绍 487
4.1 显示器体系结构 487
第二部分 显示器和视频微端口驱动程序 487
4.1.1 显示器驱动程序职责 488
4.1.2 视频微端口驱动程序职责 488
4.2.3 协处理器 489
4.2.2 加速器 489
4.2.4 VGA 489
4.3 一般的设计和实现策略 489
4.2.1 帧缓冲区 489
4.2 图形适配器的类型 489
驱动程序通信 490
4.4.1 通过IOCTL和视频微端口 490
4.4.2 访问帧缓冲区和硬件寄存器 490
4.4 访问图形适配器 490
4.5 创建图形INF文件 491
4.5.1 INF GeneralConfigData节 492
4.5.2 显示器INF文件节 492
4.5.3 监视器INF文件节 493
4.6.1 INF和安装的要求 495
的兼容性测试要求 495
4.6.2 视频微端口驱动程序的要求 495
4.6 显示器和视频微端口驱动程序 495
4.6.3 显示器驱动程序的要求 496
4.6.4 控制面板的要求 496
5.1 显示器驱动程序DDI函数 497
5.1.1 必需的显示器驱动程序函数 497
第5章 显示器驱动程序 497
程序函数 498
5.1.3 可选的显示器驱动程序函数 498
5.1.2 有条件地需要的显示器驱动 498
5.2 显示器驱动程序初始化 499
5.3.2 返回显示器模式:DrvGetModes 501
5.3.1 切换桌面:对DrvAssertMode的响应 501
5.3.3 支持多PDEV 501
5.3 桌面管理 501
5.4 指针控制 503
5.4.1 指针绘制 504
5.5 管理显示器调色板 505
5.4.3 移动指针:DrvMovePointer 505
5.6 显示器驱动程序中的位图 505
5.4.2 控制指针:DrvSetPointerShape 505
5.7 异步绘图 506
5.9 显示器驱动程序的特别效果 507
5.10 显示器的颜色管理 507
5.8 显示器驱动程序中的透明性 507
5.11 DirectDraw和GDI 509
5.12 跟踪窗口变化 509
5.13 支持DitherOnRealize标志 511
5.14 支持分组的帧缓冲区 511
5.15 卸载视频硬件 514
5.16 显示器驱动程序中的多监视器支持 514
5.17 镜像驱动程序 515
5.17.1 镜像驱动程序INF文件 516
5.17.2 镜像驱动程序安装 516
5.18.1 Newdisp:动态重装显示器 517
驱动程序 517
5.18 显示器驱动程序测试工具 517
5.18.2 允许的驱动器加速的动态改变 518
代码和参考 519
6.1 DirectDraw驱动程序头文件、示例 519
6.2 DirectDraw体系结构概述 519
第6章 DirectDraw DDI 519
6.2.1 关于DirectDraw 521
6.2.2 DirectDraw驱动程序 521
6.2.3 硬件仿真层次 522
6.3 DirectDraw驱动程序基础 522
6.3.1 DirectDraw表面 523
6.3 显示内存 524
6.3.3 内存配置例子 526
6.3.4 交换 532
6.3.5 使用图阵 537
6.3.6 假定状态信息的驱动程序 539
6.3.7 打开显示卡并在Windows 95/Windows98上改变模式 539
6.4 DirectDraw驱动程序初始化 540
6.5 DirectX视频端口扩展 541
6.5.1 视频端口扩展背景 542
DirectDraw接口 546
6.5.3 内核模式视频传输支持的 546
6.6 颜色控制初始化 546
6.5.2 DirectX VPE的初始化 546
6.7 AGP支持 547
6.7.1 标志为支持非本地显示内存 547
6.7.2 指定非本地显示内存堆 548
6.7.3 实际堆基地址的通知 548
6.7.4 非本地显示内存表面的回调处理 549
6.7.5 在非本地显示内存中重新排序纹理 550
6.7.6 处理DMA样式的AGP 550
6.8.1 VPE和内核模式视频传输的 552
体系结构 552
6.8 内核模式视频传输 552
6.8.2 使用内核模式视频传输 553
6.8.3 Windows 2000的DxApi微端口功能 554
6.9 扩展表面定位 555
6.9.1 旧式定位方法的回顾 556
6.9.2 使用扩展的表面定位 556
6.10 扩展的表面能力 557
6.10.1 新的表面能力 557
6.10.2 暴露扩展表面能力 558
6.10.3 扩展的堆限制 558
6.10.4 扩展的表面描述结构 559
6.11 压缩纹理表面 559
6.11.2 创建压缩纹理表面 560
6.11.3 使用压缩纹理表面 560
6.11.1 列举DXT格式 560
6.12 运动补偿 561
6.13 返回DirectDraw和Direct3D的值 562
和参考 564
7.1 Direct3D DDI头文件、示例代码 564
7.2 跨平台Direct3D驱动程序开发 564
第7章 Direct3D DDI 564
7.3.1 所需的Direct3D驱动程序回调 565
函数和函数 565
7.3 Direct3D驱动程序回调函数和函数 565
返回码 566
7.3.3 Direct3D驱动程序回调函数的 566
7.4 Direct3D驱动程序初始化 566
7.3.2 操作码处理 566
7.5 Direct3D环境管理 567
7.5.3 在环境中维护状态 568
7.5.2 删除环境 568
7.5.4 Direct3D表面处理概览 568
7.5.1 建立环境 568
是一个指向表面的指针 569
7.5.6 为什么驱动程序方的结构不能只 569
7.5.7 D3dCreateSurfaceEx和后援表面 569
7.5.5 进一步了解句柄以及通过D3dCreateSurfaceEx创建驱动程序方表面的结构 569
7.5.8 使用D3dCreateSurfaceEx要考 570
虑的其他问题 570
7.6 Direct3D纹理管理 571
7.6.1 多纹理 572
7.6.2 调色板纹理 577
7.6.3 纹理位块转移 577
7.7 绘图原语和状态改变 578
7.7.1 命令和顶点缓冲区 578
7.6.4 驱动程序管理的纹理 578
7.7.2 Direct3D命令缓冲区 580
7.7.3 Direct3D顶点缓冲区 582
7.7.4 加速状态管理 582
7.8 柔性顶点格式 583
7.9 Direct3D驱动程序的高级主题 586
7.9.1 优化的纹理 586
7.9.2 模板位面 587
7.9.3 Guard Band Clipping 588
7.9.4 范围调整 589
7.9.5 W缓冲区 589
7.9.6 Bump Mapping 590
7.9.7 硬件变换和照明 591
7.10 Direct7.0发行事项 599
7.10.1 FVF更新 600
7.10.2 光栅更新 600
第8章 小型客户驱动程序 601
8.1 MCD头文件、示例代码和参考 601
8.2 MCD体系结构 601
8.3 MCD接口 603
8.3.1 必需的MCD函数 603
8.3.2 特定条件下必需的MCD函数 603
8.3.3 可选的MCD函数 603
8.4 MCD初始化 604
8.5 绘制设备环境 605
8.4.1 Hdev句柄 605
8.4.2 像素格式 605
8.5.1 设备环境的创建 606
8.5.3 设备环境删除 607
8.5.4 状态 607
8.5.2 设备环境绑定 607
8.5.5 视口 608
8.6 内存管理 608
8.7.2 查询绘制缓冲区 609
8.7.1 分配绘制缓冲区 609
8.7.3 交换绘制缓冲区 609
8.7 帧缓冲区管理 609
8.8 绘制操作 610
8.8.1 绘制OpenGL的原语 610
8.7.4 MCD中的窗口跟踪 610
8.8.2 绘制间距 612
8.8.3 清除缓冲区 613
8.8.4 同步化 613
8.9.1 纹理环境状态 614
8.9.2 纹理状态 614
8.9 纹理映像 614
8.10 像素操作 616
8.11 分层平面 617
8.11.1 描述分层平面 617
8.11.2 交换分层平面 618
8.11.3 管理分层调色板 618
第9章 视频微端口驱动程序 619
9.1 视频微端口头文件、示例代码和参考 619
9.2 在图形体系结构中的视频微端口 620
驱动程序 620
9.3 视频微端口驱动程序接口 621
9.3.1 必需的微端口驱动程序函数 621
动程序函数 622
9.3.3 可选的视频微端口驱动程序 622
9.3.2 有条件必需的视频微端口驱 622
9.4 视频微端口驱动程序的初始化 623
9.4.1 启动视频微端口驱动程序 623
9.4.2 声明继承资源 626
视频微端口 627
9.5 视频微端口设备扩展 627
9.4.3 为与显示驱动程序通信而初始化 627
9.6 视频微端口的注册表回调函数 628
9.7 处理视频请求 628
9.7.1 系统定义的IOCTL_VIDEO_XXX 629
请求 629
请求 630
9.7.3 处理不支持的IOCTLVIDEO_XXX 630
9.8 在视频微端口中支持PnP及电源管理 630
_XXX请求 630
9.7.2 自定义的显示微端口IOCTL_VIDEO 630
9.9.2 从AGP使用中释放内存 631
9.9.1 通过AGP存取系统内存 631
9.10 图形适配器的子设备 631
9.9 在视频微端口驱动程序中使用AGP 631
9.10.2 与子设备驱动程序通信 632
9.11 视频微端口中的中断 632
9.10.1 侦测子设备 632
9.13 在视频微端口中对适配器重置 634
9.14 微端口驱动中的镜像驱动程序支持 634
9.12 视频微端口的定时器 634
支持 635
9.15.1 查询TV连接器及硬件的拷贝保护 635
9.15 视频微端口的TV连接器及拷贝保护 635
9.15.2 设置TV连接器及拷贝保护硬件 636
9.16.1 基于x86机器的窗口式VDM 637
9.16.2 基于x86机器的全屏VDM 637
9.16 VGA兼容的微端口SvgaHwIoPortXxx 637
9.16.3 VGA兼容的微端口的HwFind 638
Adapter 638
9.16.4 在SvgaHwIoPortXxx中验证指令 639
9.17 将Windows NT 4.0的微端口驱动程序 640
转换到Windows 2000 640
9.16.5 VGA兼容的HwVidStartIO 640
第三部分 打印驱动程序和假脱机组件 643
第10章 打印介绍 643
第11章 打印假脱机程序的体系结构 644
11.1 假脱机组件介绍 644
11.2 打印提供者 645
12.1 打印机驱动程序组件 652
12.2 打印机图形DLL 652
第12章 打印机驱动程序体系结构 652
12.3 打印机接口DLL 659
12.4 打印机数据文件 660
第13章 微软通用打印机驱动程序 661
13.1 通用打印机驱动程序介绍 661
13.1.1 Unidrv能力 662
13.1.2 Unidrv组件 662
13.1.3 Unidrv小驱动程序 663
13.1.4 Unidrv用户接口 663
13.1.6 GPD文件实例 664
13.1.7 微软小驱动程序开发工具 664
13.1.5 Unidrv绘制器 664
13.2 GPD文件介绍 665
13.2.1 GPD文件条目 665
13.2.2 基本单位 676
13.2.3 在小驱动程序中使用多个GPD文件 677
13.2.4 在小驱动程序中使用资源DLL 677
13.3.2 属性类型 678
13.3.1 打印机属性格式 678
13.3.3 一般属性 678
13.3 打印机属性 678
13.4 打印机命令 687
13.4.1 命令条目格式 687
13.4.2 命令名称 688
13.4.3 命令属性 694
13.4.4 命令字符串格式 695
13.4.5 命令执行顺序 697
13.5 打印机特性 699
13.5.1 标准特性 699
13.5.2 定制特性 700
13.5.3 特性条目格式 701
13.5.4 特性属性 702
13.5.5 特性冲突优先级 703
13.6 打印机选项 704
13.6.1 标准选项 704
13.6.3 选项条目格式 708
13.6.4 选项属性 708
13.6.2 定制选项 708
13.6.5 选项限制 715
13.7 打印机字体描述 717
13.7.1 硬件驻留字体 718
13.7.2 Cartridge字体 718
13.7.3 字体替换 719
13.8 条件语句 720
13.9 压缩光栅数据 723
13.9.1 使用Unidrv支持的压缩 723
13.10 过滤光栅数据 724
13.11 处理颜色格式 724
13.9.2 使用定制的压缩 724
13.12 用Unidrv过渡调色 725
13.12.1 GDI提供的过渡调色 725
13.12.2 驱动程序提供的过渡调色 726
13.12.3 设备提供的过渡调色 728
13.13 控制图像质量 728
13.14 处理可安装的特性及选项 731
13.15 指定特性和选项显示的顺序 732
13.16 描述打印机内存配置 733
13.17 指定纸张尺寸 734
13.17.1 支持标准纸张尺寸 735
13.17.2 支持厂商定义的纸张尺寸 735
13.17.3 支持用户定义的纸张尺寸 736
13.18 引用场所 740
13.19 安装一个Unidrv小驱动程序 741
14.1 Pscript能力 743
14.2 Pscript组件 743
第14章 微软PostScript打印机驱动程序 743
14.3 Pscript小驱动程序 744
14.3.1 转换AFM文件到NTF文件 745
14.3.2 安装Pscript小驱动程序 746
14.4 Pscript用户接口 746
14.5 Pscript绘制器 747
15.1 绘图仪驱动程序能力 748
15.2 绘图仪驱动程序组件 748
第15章 微软绘图仪驱动程序 748
15.3 绘图仪驱动程序文件示例 749
15.4 绘图仪驱动程序的小驱动程序 749
15.5 绘图仪驱动程序用户接口 752
15.6 绘图仪驱动程序绘制器 753
16.1 用户接口插件 754
16.1.1 用户接口插件介绍 754
第16章 定制微软的打印机驱动程序 754
16.1.2 UI插件的例子 755
16.1.3 UI插件的COM接口 755
16.1.6 修改一个驱动程序提供的属性 756
16.1.5 从UI插件访问驱动程序设置 756
表页面 756
16.1.4 提供DEVMODE结构附加项 756
16.1.7 增加新的属性表页面 757
16.2.1 绘制插件介绍 758
16.2 绘制插件 758
16.2.2 绘制插件实例 758
16.1.8 定制其他的打印机接口操作 758
16.2.3 绘制插件的COM接口 759
16.2.4 定制的DDI函数 761
16.2.5 定制的PDEV结构 761
16.2.7 与Pscript有关的定制绘制 762
16.2.8 与Unidrv有关的定制绘制 762
16.2.6 从绘制插件访问驱动程序设置 762
16.3 实现打印机驱动程序的COM接口 767
16.3.1 打印机驱动程序的接口标识符 768
16.3.2 创建插件 768
16.3.3 从打印机驱动程序访问插件接口 769
16.3.4 从插件访问打印机驱动程序接口 769
16.4 安装定制的驱动程序组件 770
17.1 编写打印处理器 772
17.1.1 对打印处理器的介绍 772
第17章 定制打印假脱机组件 772
17.1.2 打印处理器示例 773
17.1.3 由打印处理器定义的函数 774
17.1.4 处理一个打印作业 774
17.1.5 安装打印处理器 775
17.2.1 语言监视器 776
17.2.2 端口监视器 776
17.2 编写打印监视器 776
17.2.3 语言和端口监视器交互 777
17.2.4 由打印监视器定义的函数 778
17.2.5 初始化打印监视器 779
17.2.6 打开及关闭一个端口 780
17.2.7 打印一个打印作业 780
17.2.8 管理端口 781
17.2.9 为在群集打印服务器中使用而转 782
换打印监视器 782
17.2.10 安装打印监视器 783
17.3 编写网络打印提供者 784
17.3.1 部分打印提供者概述 784
17.3.2 支持打印机变化的通知 785
17.3.3 安装一个网络打印提供者 786
第18章 Internet打印 787
18.1 从应用程序打印到URL 787
18.2 查看打印Web页面 788
18.3.1 打印Web页面的ASP文件 790
18.3.2 定制打印机细节的Web页面 790
18.3 定制打印Web页面 790
18.3.3 安装定制的打印Web页面 793
18.4 从Web页面安装打印驱动程序 794
19.1 打印机的即插即用 795
19.2 打印机的INF文件 795
第19章 安装及配置打印机驱动程序 795
19.2.1 打印机DIRID 796
19.2.2 打印机INF文件条目 796
19.2.3 打印机INF文件的数据部分 798
19.2.4 打印机INF文件安装部分 799
19.2.5 打印机INF文件CopyFiles节 799
19.3 打印机的目录服务 800
19.3.1 打印假脱机程序对打印机目录服务的支持 800
19.2.6 打印机INF文件实例 800
19.3.2 打印机驱动程序对打印目录服务 801
的支持 801
19.4.2 在打印机安装过程中支持点 802
19.4.1 点号及打印介绍 802
号及打印 802
19.4 支持点号及打印 802
19.4.3 在打印机连接过程中支持点 804
号及打印 804
20.1 CPSUI介绍 807
20.2 CPSUI应用程序实例 807
第20章 CPSUI 807
20.4 应用程序提供的回调函数 808
20.4.1 页面创建回调函数 808
20.3 CPSUI提供的函数 808
20.4.2 页面事件回调函数 809
20.5 创建属性表页面 809
20.5.1 属性表选项 810
20.5.2 CPSUI支持的窗口控件 810
20.5.3 CPSUI提供的页面和模板 811
20.5.4 指定页面的方法 811
20.5.5 在打印机驱动程序中使用CPSUI 812
21.1 允许颜色管理 814
21.2 控制颜色管理 814
第21章 打印机颜色管理 814
21.2.1 系统控制 815
21.2.2 驱动程序控制及设备控制 815
21.2.4 对JPEG及PNG图像的颜色管理 816
21.3 定位ICC配置文件 816
21.2.3 支持CMYK颜色空间 816
21.4 安装ICC配置文件 817
第一部分 网络驱动程序 821
第1章 网络驱动程序设计指南向导 821
第五篇 网络驱动程序设计指南 821
第2章 内核模式驱动程序的网络结构 823
2.1 Windows 2000网络结构和OSI模型 823
2.2 NDIS驱动程序 824
2.2.1 NDIS微端口驱动程序 825
2.2.2 NDIS中间层驱动程序 826
2.2.3 NDIS协议驱动程序 828
2.3 TDI驱动程序 828
2.4.1 无连接环境的网络驱动程序 829
2.4.2 面向连接环境下的网络驱动程序 829
2.4 网络驱动程序环境 829
2.4.3 WAN网络驱动程序的环境 831
3.1 可移植性 833
3.2 多处理器支持 833
第3章 网络驱动程序编程要点 833
3.3 IRQL 834
3.4 同步和通知 834
3.5 包结构 836
3.6 使用共享内存 837
3.7 异步I/O和完成函数 837
4.1 NIC微端口驱动程序类型 839
第4章 NDIS NIC微端口驱动程序 839
4.2 网络接口卡支持 839
第二部分 微端口NIC驱动程序 839
4.3.1 MiniportXxx函数 841
4.3.2 与NDIS库链接 841
4.3 微端口驱动程序代码的重要特征 841
4.3.3 微端口适配器环境 842
4.3.4 VC环境 842
4.3.5 网络OID 843
4.4 示例驱动程序 843
5.1.1 初始化NDIS库和注册微端口 844
5.1 NIC微端口操作 844
驱动程序 844
第5章 NIC微端口操作和函数概述 844
5.1.2 注册网络接口卡 845
5.1.3 对查询和设置微端口信息做出响应 845
5.1.4 创建、激活、去活和删除虚连接 846
5.1.5 发送数据 846
5.1.6 指示和传递接收到的数据 848
5.1.7 指示状态 849
5.1.8 复位网络接口卡 849
5.2 微端口上边界函数 850
5.2.1 无连接微端口的上边界函数 850
5.1.9 终止一个微端口NIC驱动程序 850
5.2.2 面向连接微端口的上层函数 852
5.3 由微端口调用的NDIS函数 853
5.3.1 NDIS提供的初始化和注册函数 854
5.3.2 NDIS提供的硬件设置函数 855
5.3.3 NDIS提供的I/O端口函数 855
5.3.4 NDIS数据的与DMA相关的函数 856
5.3.5 NDIS提供的中断处理函数 857
5.3.6 NDIS提供的同步函数 858
5.3.7 NDIS提供的状态函数 859
5.3.9 NDIS为面向连接微端口提供 860
发送和接收函数 860
的发送和接收函数 860
5.3.8 NDIS为无连接微端口提供的 860
5.3.10 NDIS提供的带外数据宏 861
5.3.11 NDIS提供的包和缓存处理函数 861
5.3.12 NDIS提供的支持函数 863
5.3.13 NDIS提供的介质相关宏 866
和初始化 868
6.1 NDIS微端口驱动程序入口函数 868
第6章 NIC微端口驱动程序入口点 868
6.1.1 初始化包裹 869
6.1.2 注册微端口 869
6.2 NDIS微端口初始化 874
6.2.1 注册NIC 875
6.2.2 声明资源 877
6.2.3 注册中断 881
6.2.5 初始化轮询计时器 882
6.2.6 初始化期间的同步 882
6.2.4 注册关闭函数 882
6.3 查询微端口信息 883
6.4 减少微端口初始化时间 883
6.2.7 在初始化时处理错误 883
第7章 数据传输 886
7.1 中断处理 886
7.2 DPC处理程序 888
7.3 带外数据包 889
7.3.1 等待发送的OOB数据 890
7.3.2 接收的OOB数据 891
7.4 发送包 892
7.4.1 无连接微端口的多包传送 892
7.4.2 无连接微端口的单包发送 894
7.4.3 面向连接微端口的多包发送 896
7.4.4 发送数据前的内存同步 897
7.4.5 发送步骤 897
7.5 非串行化微端口 901
7.5.1 非串行化微端口的NDIS要求 901
7.6.1 无连接和面向连接微端口的 902
7.6 接收数据 902
多包接收 902
内部要求 902
7.5.2 非串行化微端口的驱动程序 902
7.6.2 无连接微端口的单包接收 905
7.6.3 接收数据的高速缓存因素 907
7.6.4 接收数据的步骤 907
7.7 保持统计 909
7.8 802.1p包的优先权 910
7.8.1 查询802.1p优先权支持 911
7.8.2 802.1p优先权的包支持 911
7.8.3 为发送和接收指定包的大小 912
7.8.4 缺省情况下禁止802.1p的优先 913
权支持 913
信息及NDIS支持 914
8.1 NDIS管理信息和OID 914
第8章 获取和设置WMI的微端口 914
8.2 查询微端口信息 915
8.2.1 无连接微端口的查询 915
8.2.2 面向连接微端口的查询 917
8.3.1 为无连接微端口设置信息 918
8.3.2 为面向连接微端口设置信息 918
8.3 设置微端口信息 918
8.3.3 设置微端口信息的时机 919
8.4 报告硬件状态 919
8.5.1 用WMI注册与注销NDIS微端口 920
8.5.2 OID和微端口状态的GUID映射 920
8.5 WMI的NDIS支持 920
8.5.3 支持命名VC 921
8.5.4 NDIS支持的WMI操作 921
8.5.5 向WMI注册标准微端口OID 922
8.5.6 向WMI注册的标准微端口状态 924
8.5.7 定制OID与状态指示 924
第9章 微端口的电源管理 927
9.1 电源管理的需求与可选的OID 927
9.2 网络设备电源状态 928
9.3 网络唤醒事件 929
9.3.3 魔包唤醒 930
9.3.2 网络唤醒帧 930
9.3.4 启用唤醒事件 930
9.3.1 链接改变唤醒 930
9.5 处理OID_PNP_SET_POWER 931
9.4 处理OID_PNP_QUERY_POWER 931
9.5.1 转入睡眠状态 931
9.3.5 处理唤醒事件 931
9.5.2 转入工作状态 932
9.6 早期微端口的电源管理 932
第10章 重置、停止和关闭 934
10.1 硬件重置 934
10.2 停止处理程序 935
10.3 关闭处理程序 936
第11章 广域网微端口NIC驱动程序 937
11.1 RAS体系结构 937
11.2 NDISWAN概述 939
11.3 网络卡、绑定和连接 941
11.4.1 标准广域网微端口驱动程序与 943
局域网微端口驱动程序的区别 943
11.4 广域网微端口驱动程序的实现 943
11.4.3 广域网微端口驱动程序提供 944
的附加特性 944
的服务 944
11.4.2 CoNDIS广域网微端口驱动程序 944
11.4.4 广域网微端口驱动程序的指示 953
11.5 广域网包的组帧 956
11.5.1 异步帧结构 957
11.5.2 X.25帧结构 957
11.6 标准NDIS之上的电话服务扩展 958
11.6.1 NDISTAPI概述 958
11.5.3 ISDN和Switched-56K帧结构 958
11.6.2 线路设备、地址和呼叫 959
11.6.3 设置和查询请求 959
11.6.4 保持状态信息 960
11.6.5 建立句柄 960
11.6.6 TAPI注册 961
11.6.7 TAPI初始化 962
11.6.8 打开线路 963
11.6.9 接受内入呼叫 963
11.6.10 产生TAPI呼叫 964
11.6.11 主动事件处理 965
11.6.12 Line-Up指示 966
11.6.13 关闭呼叫线路 967
11.6.14 NDISTAPI接口 969
11.7 使用支持电话服务的CoNDIS扩展 973
11.7.1 NDPROXY概述 974
11.7.2 CoNDISTAPI注册 974
11.7.3 CoNDIS TAPI初始化 975
11.7.4 建立外出呼叫 976
11.7.5 接受内入呼叫 978
11.7.6 CoNDIS TAPI关闭 981
11.7.7 语音流对呼叫管理器的要求 982
11.7.8 在面向连接NDIS上支持电话 983
服务的非广域网专用的扩展 983
第12章 任务卸载 985
12.1 查询任务卸载能力 985
12.1.1 报告NIC的校验和性能 986
12.1.2 报告NIC的IP安全性性能 987
12.1.3 报告NIC的TCP包分段性能 988
12.3 停用任务卸载能力 989
12.4 访问每数据包信息 989
12.2 启用任务卸载能力 989
12.5 卸载TCP/IP校验和任务 990
12.6 卸载IP安全任务 992
12.7 卸载大TCP包分段 995
12.8 卸载组合 997
12.9 使用注册表键值启用和禁用任务卸载 998
第13章 负载平衡和故障恢复 999
13.1 关于LBFO 999
13.3 在微端口驱动程序上实现LBFO 1000
13.3.1 初始化微端口束 1000
13.2 指定对LBFO的支持 1000
13.3.3 在主微端口失效后提升一个 1001
辅微端口 1001
13.3.2 平衡微端口驱动程序的工作量 1001
14.1 关于FFP 1002
14.1.1 使用一个NIC的FFP 1002
第14章 快速转发路径 1002
14.1.2 使用多个NIC的FFP 1003
14.1.3 IP转发 1004
14.1.4 FFP和包过滤 1005
14.2 NIDS中的FFP支持 1005
14.3 为IP转发在微端口实现FFP 1006
驱动程序 1007
15.1 带WDM下边界的微端口 1007
第15章 带有WDM低层接口的微端口 1007
15.2 注册WDM下边界的微端口函数 1008
15.3 初始化带WDM下边界的微端口 1008
15.4 发出命令与远程设备通信 1009
15.4.1 在总线上发送包 1009
15.5 WDM下边界的实现要点 1010
15.6 WDM下边界的编译标志 1010
15.4.2 在总线上接收包 1010
第16章 IrDA微端口NIC驱动程序 1012
16.1 IrDA微端口驱动程序简述 1012
16.2 IrDA体系结构 1013
16.3 IrDA协议驱动程序 1013
16.4 IrDA介质特性 1014
16.4.1 通信连接速度 1014
16.4.2 通信连接回转时间 1015
16.4.3 接收器同步 1016
16.5 IrLAP帧格式 1017
16.5.1 帧格式简述 1017
16.5.3 地址成员 1018
16.6 IrDA微端口驱动程序包编码方案 1018
16.5.2 帧信息的使用 1018
16.6.2 MIR编码 1019
16.6.3 FIR编码 1019
16.6.1 SIR编码 1019
16.8.1 非即插即用外部串行连接的 1020
16.8 即插即用 1020
SIR适配器 1020
16.7 发送和接收帧序列 1020
适配器 1021
16.8.3 即插即用外部串行连接的SIR 1021
16.8.4 即插即用的内部SIR适配器 1021
16.8.2 非即插即用的内部SIR适配器或者错误地暴露为串口的内部SIR适配器 1021
适配器 1022
16.8.6 即插即用总线连接的FIR适配器 1022
16.8.5 非即插即用总线连接的FIR 1022
和TDI驱动程序 1025
第17章 NDIS中间层驱动程序 1025
第三部分 NDIS中间层驱动程序 1025
17.1 中间层驱动程序的DriverEntry函数 1027
17.2 中间层驱动程序的动态绑定 1033
17.2.1 打开中间层驱动程序下层的 1034
适配器 1034
17.2.2 微端口初始化 1035
17.2.3 中间层驱动程序查询和设置操作 1036
17.2.4 作为面向连接客户程序注册中 1038
间层驱动程序 1038
17.3 中间层驱动程序数据包管理 1039
17.4 中间层驱动程序的限制 1042
17.5 中间层驱动程序接收数据 1042
17.5.1 下边界面向无连接的中间层 1043
驱动程序接收数据 1043
17.5.2 下边界面向连接的中间层 1045
驱动程序接收数据 1045
17.5.3 向高层驱动程序指示接收数据包 1047
17.6 通过中间层驱动程序传输数据包 1047
和PM事件 1050
17.7.1 处理OID_PNP_XXX查询和设置 1050
17.7 处理中间层驱动程序的PnP事件 1050
17.7.2 中间层驱动程序ProtocolPnP 1051
Event处理程序的实现 1051
17.7.3 处理电源设置请求 1052
17.8 中间层驱动程序复位操作 1053
17.9 中间层驱动程序拆除绑定操作 1054
17.10 中间层驱动程序状态指示 1055
第18章 NDIS协议驱动程序 1056
18.1 协议DriverEntry及其初始化 1057
18.1.1 注册NDIS协议驱动程序 1057
18.1.2 在协议驱动程序下打开适配器 1060
18.1.3 协议驱动程序查询和设置操作 1061
18.1.4 作为呼叫管理器或者面向连 1063
接客户进行注册 1063
18.2 协议驱动程序数据包管理 1066
18.3 协议驱动程序的动态绑定 1068
18.4 协议驱动程序接收数据 1068
18.4.1 面向无连接的协议驱动程序接 1069
收数据 1069
18.4.2 面向连接协议驱动程序接收数据 1072
18.5.1 通过面向无连接协议驱动程 1073
序发送数据包 1073
18.5 发送协议驱动程序创建的数据包 1073
18.5.2 通过面向连接协议驱动程序 1075
发送数据包 1075
电源管理事件 1077
18.7 协议驱动程序复位操作 1077
18.6 在协议驱动程序中处理PnP事件和 1077
18.8 协议驱动程序拆除绑定操作 1078
18.9 协议驱动程序状态指示 1079
第19章 TDI传输器及其客户 1080
19.1 传输驱动程序接口(TDI) 1080
19.2 TDI设备对象 1082
19.3 TDI文件对象 1083
19.3.1 代表传输地址的文件对象 1084
19.3.2 代表连接端点的文件对象 1085
19.3.3 代表控制信道的文件对象 1085
19.4 TDI传输驱动程序例程 1086
19.5 TDI内核模式客户交互 1086
19.6 TDI请求及事件 1087
第20章 TDI例程、宏和回调 1089
20.1 TDI驱动程序初始化 1089
20.1.1 注册TDI传输驱动程序 1090
20.1.2 卸载和注销TDI传输驱动程序 1091
20.2 TDI驱动程序调度例程 1091
20.3 TDIIOCTL请求 1092
20.4 TDI客户回调 1093
20.5 TDI库函数和宏 1094
第21章 TDI操作 1097
21.1 打开传输地址 1097
21.2 打开连接端点 1099
21.3 打包并提交IOCTL请求 1099
21.4 设置和查询信息 1100
21.5 建立端端连接 1101
21.6 发送和接收面向连接数据 1103
21.7 发送和接收无连接数据 1106
21.8 面向连接和面向无连接传输 1108
21.9 请求传输相关操作 1109
21.10 接收错误通知 1109
21.11 断开端端连接 1110
21.12 关闭连接端点 1110
21.13 关闭传输地址和控制信道 1111
辅助程序的DLL 1112
22.1 Windows Sockets Helper DLL结构 1112
第22章 Windows Sockets的传输 1112
22.2 用WSH DLL通信 1113
22.3 配置WSH DLL 1113
22.5 用WSH DLL支持连接和断开 1114
连接数据 1114
22.4 WSH DLL同步 1114
22.5.1 客户应用程序和连接数据 1115
22.5.2 服务器应用程序和连接数据 1115
22.5.3 断开连接数据 1116
22.6 WSH DLL函数摘要 1116
接口标准 1119
第23章 面向连接的网络驱动程序 1119
23.1 面向连接环境 1119
第四部分 面向连接的网络驱动程序接口标准 1119
23.2 使用AF、VC、SAP和会话方 1120
23.2.1 地址族 1121
23.2.2 虚连接 1121
23.2.4 会话方 1122
23.3 服务质量 1122
23.2.3 SAP 1122
23.4.2 对NdisXxx函数调用的不同 1123
23.4.1 初始化的不同 1123
23.4.3 虚连接的不同 1123
23.4 MCM和呼叫管理器有何不同 1123
23.6 面向连接操作 1124
23.6.1 面向连接操作总结 1124
23.5 面向连接的时间特性 1124
23.6.2 地址族和SAP上的操作 1127
23.6.3 VC上的操作 1132
23.6.4 创建呼叫 1138
23.6.5 改变活动VC的QoS 1142
23.6.6 增加和删除会话方 1146
23.6.7 发送并接收数据 1150
23.6.8 断开呼叫 1152
23.6.9 获取并设置信息 1155
23.6.10 重置 1157
第24章 安装网络组件 1159
24.1 用于安装网络组件的组件和文件 1159
第五部分 安装网络组件 1159
24.2.1 网络INF文件名的约定 1160
24.2.2 网络INF文件的Version节 1160
24.2 创建网络INF文件 1160
24.2.3 网络INF文件的Models节 1161
24.2.4 INF文件的DDInstall节 1162
24.2.6 网络INF文件的ControlFlags节 1164
24.2.7 网络INF文件的add-registry-sections 1164
24.2.5 网络INF文件的Remove节 1164
24.2.8 DDInstall.Service节 1176
24.2.9 NetworkProvider和PrintProvider节 1177
24.2.10 Winsock节 1179
24.2.11 网络组件安装需求总结 1180
25.1 关于通知对象 1188
25.1.1 通知对象图 1188
第25章 网络组件的通知对象 1188
25.1.2 通知类型 1189
25.1.3 网络组件的安装 1190
25.1.4 删除网络组件 1190
25.1.5 升级网络组件 1191
25.1.6 显示并改变属性 1191
25.2.1 装载通知对象DLL和类对象 1192
25.2 创建通知对象 1192
25.2.2 定义通知对象 1192
25.1.7 网络配置 1192
25.2.3 创建并初始化通知对象实例 1193
25.2.4 安装、升级和删除组件 1194
25.2.5 为组件生成属性页 1194
25.2.6 设置环境来显示属性 1195
25.2.8 将组件变化加入注册表 1196
25.2.9 配置组件驱动程序 1196
25.2.7 评价网络配置的变化 1196
2.2 终端用户I/O请求和Windows 2000