1、Windows 2000 驱动程序开发大全 Windows 2000 驱动程序开发大全 第 1 卷 设计指南1目录1. 前言 22. 目录 53. 第一卷 驱动程序编写者指南 434. 第二卷 即插即用、电源管理和设置设计指南 545. 第三卷 内核模式驱动程序设计指南 2106. 第四卷 图形驱动程序设计指南 4037. 第五卷 网络驱动程序设计指南 761第四章 数据传输 827第五章 获取和设置 WMI 的微端口信息及 NDIS 支持 .852第六章 微端口的电源管理 863第七章 重置,停止和关闭 869第十二章 带 WDM 低级接口的微端口驱动程序 .934第十三章 IrDA 微端口
2、 NIC 驱动程序 938NCF_VIRTUAL,NCF_SOFTWARE_ENUMERATED,NCF_PHYSICAL,NCF_MULTIPORT_INSTANCED_ADAPTER,NCF_HAS_UI,NCF_HIDDEN,NCF_NOT_USER_REMOVABLE。 1079NCF_VIRTUAL,NCF_SOFTWARE_ENUMERATED 和 NCF_PHYSICAL 是相互排斥的。 .1079对于物理适配器,BUSTYPE 项是必需的。对 EISA 适配器, EISACOMPRESSEDID 项是必需的。这个项说明了 EISA 压缩 ID 和适配器掩码。多端口网络适配器需要
3、PORT1DEVICENUMBER 或 PORT1FUNCTIONNUMBER 项。 .1079成。如:MS_DLC。 10858. 封底 1093Windows 2000 驱动程序开发大全 第 1 卷 设计指南21. 前言使用本文档Microsoft Windows 2000 的驱动程序开发包(DDK)文档总览给您详尽的信息,这些信息对编写 Windows2000 平台任何类型的驱动程序都是必须的。本文档也描述了 Windows Driver Model(WDM)驱动程序,这些驱动程序在 Windows2000 和 Microsoft Windows 98 平台之间是源码级兼容的。文档路标下
4、页的图表提供了本文档的一个路标。它说明了你需要读 DDK 的哪一部分,和基于你将要编写的驱动程序类型,以怎样的顺序,发现最为有用的信息。下面是对 DDK 每一部分的简单描述,在该路标的在线版本上,你可通过点击各本书的图标或者标题得到进一步的信息。版本说明一个独立的文件,即 install.htm,包括了从附送的 CD-ROM 中安装在线 DDK 的系统需求。它也包含了一些别处没有的、重要的、最新的信息。该文件放在安装 DDK 的根目录下,也在 CD-ROM 安装盘的 DDK 根目录下。新版本在本版本新内容部分里包括关于 Microsoft Windows 2000 里的新技术和驱动程序级接口的
5、信息。驱动程序编写者指南驱动程序编写者指南告诉你怎样构建、测试和调试 Windows 2000 驱动程序。它包括下列信息: 驱动程序开发环境, DDK 提供的 BUILD 应用程序, 驱动程序测试(Driver Verifier)应用程序, 可用来调试驱动程序的工具和例程。图表设置、即插即用和电源管理设置、即插即用及电源管理设计指南和参考手册覆盖了 Windows2000 的两个主要特性:即插即用和电源管理。通过设计,WDM 驱动程序支持即插即用和电源管理。如果可能的话,任何专为Windows 2000 编写的其他驱动程序均应该支持即插即用和电源管理。这些部分也包括了设备设置。该文档的这一部分
6、提供设置、即插即用和电源管理的总体描述。对驱动程序说明信息,驱动程序编写者也应该查阅本文档中特定种类的驱动程序。设置、即插即用和电源管理设计指南的第 1 部分包括关于即插即用和电源管理的介绍。它也描述了驱动程序必须提供的技术支持类型。设置、即插即用和电源管理设计指南的第 2 部分包括一个即插即用的总览和驱动程序必须做什么来支持即插即用。设置、即插即用和电源管理设计指南的第 3 部分包括关于编写支持电源管理的驱动程序的信息。这些章节提供了一个从驱动程序编写者角度所看到的电源管理总览,并描述了驱动程序必须提供的支持。设置、即插即用和电源管理设计指南的第 4 部分包括设备设置的信息。Windows
7、2000 驱动程序开发大全 第 1 卷 设计指南3设置、即插即用和电源管理参考手册的第 1 部分包括结构、 IoXxx 例程和 IRP 的参考信息,这些参考信息包含在即插即用支持里。设置、即插即用和电源管理参考手册的第 2 部分包括结构、 PoXxx 例程和 IRP 的参考信息,这些参考信息包含在电源管理支持里。设置、即插即用和电源管理参考手册的第 3 部分包括设备设置的参考信息,包括 INF 文件格式的参考页,设置例程,设备安装功能及结构,以及文本模式设置文件格式。内核模式驱动程序内核模式驱动程序设计指南和参考覆盖了需求和系统定义的某些类型的外设驱动程序接口,包括大部分 WDM 驱动程序。网
8、络驱动程序和图形驱动程序包括在 DDK 不同的部分里。文件系统驱动程序和过滤器包括在可安装的文件系统(IFS)包里。内核模式驱动程序设计指南的第 1 部分给 Windows2000 内核模式驱动程序编写者提供了有用的信息。它覆盖了各种驱动程序,勾划出了系统的 I/O 体系结构,并描述了每个驱动程序必须支持的例程。内核模式驱动程序设计指南的第 2 至第 9 部分没有在本卷中印出。你将在附送的 CD-ROM 上发现这些信息,包括串行和并行设备、存储、输出、视窗管理手段(Windows Management Instrumentation) (WMI)和系统管理总线( System Manageme
9、nt Bus) (SMB) ,等等。内核模式驱动程序参考手册已经被更新以便包括支持例程的参考内容,Windows2000 和 WDM驱动程序能够调用这些例程。WDM 驱动程序编写者能够决定一个特别的支持例程是否能够通过在每个支持例程参考里检查新的“Include”部分而被调用,从而来看是否那个支持例程在 wdm.h 里输出,即在 WDM 驱动程序的主 DDK 头文件里输出。内核模式驱动程序参考手册的第 2 部分包括对 IRP 的描述。不同于 PnP 和电源,这些例程对内核模式设备来说是总体上的描述;但对使用串行和并行端口的设备而言,则是详尽的描述。对 PnP和电源 IRP,参见设置、即插即用和
10、电源管理参考手册;对设备类型的 IRP 细节,参看这些设备类型的单个文档。内核模式驱动程序参考手册的第 3 部分包括 SCSI 端口和 SCSI 微端口例程、新的改变微类例程和相关结构的更新过的参考手册。内核模式驱动程序参考手册的第 4 部分包括 HID 驱动程序和 HID 客户使用的系统例程和结构的参考手册。这部分也描述了 I/O 请求和回调例程,这些 I/O 请求和回调例程受键盘和鼠标设备(kbdclass,mouclass,i8042prt)主要的非 HID 系统驱动程序支持。内核模式驱动程序参考手册的第 5 部分覆盖了 USB 驱动程序。内核模式驱动程序参考手册的第 6 部分包括了由
11、IEEE1394 驱动程序所使用的系统定义的例程和结构的参考手册。内核模式驱动程序参考手册的第 7 部分包括了关于 PCMCIA 驱动程序的信息。内核模式驱动程序参考手册的第 8 部分包括了关于 SMB 客户驱动程序的信息。内核模式驱动程序参考手册的第 9 部分描述了 WMI 内核模式数据提供者。内核流驱动程序内核流驱动程序设计指南和参考手册覆盖了多媒体设备驱动程序的实现,如声卡、DVD 播放器、数码相机和电视调谐卡。内核流体系结构是 WDM 最基本的部分,为 Windows98 和 Windows2000 所支持。内核流驱动程序设计指南和参考手册的总体部分包括一个内核流总览。所有的内核流驱动
12、程序都依赖本部分里的概念。内核流驱动程序设计指南和参考手册中的声频驱动程序部分描述了怎样为所有的声频设备,包括声卡或者外部声音设备,来编写驱动程序。本部分包括 Microsoft DirectMusic驱动程序文档。内核流驱动程序设计指南和参考手册的视频捕获驱动程序部分描述了怎样为流式视频(streaming video)设备,如数码相机和电视调谐卡,来编写驱动程序。图形驱动程序图形驱动程序设计指南和参考手册为下面的图形驱动程序描述了系统定义的接口和实现需求: 显示和视频微端口驱动程序 打印机驱动程序Windows 2000 驱动程序开发大全 第 1 卷 设计指南4在每节的第 1 部分里包括与
13、显示和打印机驱动程序有关的信息。由于 Windows2000 的推出,为了反映设备驱动程序接口(DDI)和系统提供的图形驱动程序接口(GDI)额外的和变化的信息,所有的章节已经被更新。在每节的第 2 部分包括显示和视频微端口驱动程序的详细信息,包括 GDI、DDI、Microsoft DirectDraw、Microsoft Direct3D 和微端口驱动程序信息等章节里。在每本书的第 3 部分包括打印机的详细信息。这些章节描述了打印机驱动程序和 Windows2000假脱机打印系统的体系结构。第 3 部分解释了怎样为新的打印机提供支持和怎样替换假脱机打印的定制组件。第 4 部分,覆盖了微软的
14、静止图像体系结构,它不包括在本卷里,但是包括在附送的 CD-ROM的 DDK 文档里。网络驱动程序网络驱动程序设计指南和参考手册描述了以下类型的网络驱动程序的系统定义的接口和实现需求: 微端口 NIC 驱动程序 中间网络驱动程序,它被置于微端口 NIC 驱动程序和协议驱动程序之间 网络传输堆栈里的协议驱动程序系统定义的网络驱动程序接口包括网络驱动程序接口规范(NDIS)和传输驱动程序接口(TDI) 。网络驱动程序设计指南的第 1 部分覆盖了所有 Windows2000 网络驱动程序的常见主题。这些章节讨论了 Windows2000 的网络驱动程序的体系结构,网络驱动程序的编程考虑,以及网络驱动
15、程序的设置。网络驱动程序设计指南的第 2 部分覆盖了微端口 NIC 驱动程序,包括 WAN 微端口。网络驱动程序设计指南的第 3 部分覆盖了中间层网络驱动程序、协议驱动程序和 Windows Sockets 的传输辅助程序 DLL。TDI 设计信息没有包括在本卷里,但是包括在完全的在线 DDK 文档里。网络驱动程序设计指南的第 4 部分描述了面向连接的媒体的 NDIS 支持,如异步传输模式(ATM)和 ISDN。网络驱动程序设计参考手册的第 1 部分描述了 NDIS 提供的功能和宏,NDIS 驱动程序使用这些功能和宏与系统和每个其他的部分进行通信。第 1 部分也描述了 NDIS 定义的和系统定
16、义的结构, NDIS 驱动程序使用这些结构。下列 DDK CD-ROM 文档没有刊印: 驱动程序编写者指南 4.0调试驱动程序 设置、即插即用和电源管理第 3 部分,5.0编写电池微类驱动程序 内核模式驱动程序设计指南第 2-9 部分串行和并行驱动程序存储驱动程序输入设备驱动程序USB 驱动程序IEEE 1394 驱动程序PCMCIA 驱动程序SMB 客户驱动程序支持 WMI 图形驱动程序设计指南第 4 部分静止图像驱动程序 网络驱动程序设计指南第 3 部分,4.0-6.0TDI,例程,宏和回调TDI 操作Windows Sockets 的传输辅助程序 DLL 虚拟设备驱动程序Windows
17、2000 驱动程序开发大全 第 1 卷 设计指南5增补的文档注意:在这些 DDK 参考书里,图形驱动程序参考和网络驱动程序参考没有刊印在本卷里,这些参考部分仅仅是在线可用。2. 目录第一卷 驱动程序编写者指南 .1第 1 章 驱动程序开发环境 .21.1 自由构建和检查构建 21.2 调试环境 3第 2 章 检查驱动程序 .42.1 Driver Verifier .42.1.1 Driver Verifier 的能力 .52.1.1.1 自动检查 .52.1.1.2 特别内存池(Special Memory Pool) 62.1.1.3 强迫 IRQL 检查(Forcing IRQL Che
18、cking) .72.1.1.4 低资源模拟(Low Resources Simulation ) 82.1.1.5 内存池跟踪(Memory Pool Tracking ) 82.1.1.6 I/O 检查 82.1.2 Driver Verifier 对图形驱动程序的能力 .92.1.2.1 图形驱动程序的特别内存池 .102.1.2.2 图形驱动程序的低资源模拟 .112.1.3 激活和监视 Driver Verifier122.1.3.1 检查器(Verifier)命令行 122.1.3.2 Driver Verifier 管理器 .132.1.3.3 全局标记应用程序(Global F
19、lags Utility) .16第二卷 即插即用、电源管理和设置设计指南 .17第一部分 即插即用和电源管理的要求 .18第 1 章 即插即用和电源管理的介绍 .191.1 什么是即插即用? 191.1.1 PnP 组件 201.1.2 PnP 的支持级别 201.2 什么是电源管理? 211.2.1 电源管理的最初含义 .221.2.2 电源管理的支持级别 .221.2.3 全系统范围的电源管理的总览 .221.2.4 电源状态 .231.3 驱动程序层次和设备对象 241.3.1 驱动程序种类 .24Windows 2000 驱动程序开发大全 第 1 卷 设计指南61.3.1.1 总线驱
20、动程序 .251.3.1.2 功能驱动程序 .251.3.1.3 过滤器驱动程序 .251.3.2 驱动程序层次-一个例子 .261.3.3 设备对象种类 .271.3.4 设备对象-一个例子 .28第 2 章 PnP 和电源管理必须的驱动程序支持 .312.1 必须的 PnP 支持的总览 312.2 PnP 和电源管理 DriverEntry 例程 .312.3 PnP 和电源管理 AddDevice 例程 332.3.1 编写 AddDevice 例程的指南 .342.4 DispatchPnP 例程 352.5 DispatchPower 例程 362.6 PnP 和电源管理 Unloa
21、d 例程 36第二部分 即插即用 .38第 1 章 理解 PnP.391.1 PnP 驱动程序设计指南 391.2 PnP 和设备树 401.3 PnP 设备状态 411.4 动态地添加一个新的 PnP 设备 411.5 硬件资源 461.5.1 逻辑配置 .471.5.1.1 支持资源需求列表的逻辑配置类型 .471.5.1.2 资源列表的逻辑配置类型 .471.6 在驱动程序里使用 GUID .481.6.1 定义和导出新的 GUID481.6.2 在驱动程序代码里包含 GUID49第 2 章 处理即插即用 IRP 的规则 512.1 PnP IRP 需求 .512.2 沿设备堆栈传递 P
22、nP IRP522.3 延迟 PnP IRP 的处理直到低层的驱动程序完成 .53第 3 章 启动、停止和删除设备 .563.1 启动一设备 563.1.1 启动功能驱动程序里的一个设备 .563.1.2 启动过滤器驱动程序里的一个设备 .583.1.3 启动总线驱动程序里的一个设备 .583.1.4 启动设备设计注意 .593.2 为了资源重新平衡而停止一个设备 593.2.1 理解何时停止发布 IRP .593.2.2 处理 IRP_MN_QUERY_STOP_DEVICE 请求 603.2.3 处理 IRP_MN_STOP_DEVICE 请求 623.2.4 处理 IRP_MN_CANC
23、EL_STOP_DEVICE 请求 62Windows 2000 驱动程序开发大全 第 1 卷 设计指南73.2.5 当一个设备被暂停时,保留进入的 IRP .633.3 删除一个设备 643.3.1 理解何时发布删除 IRP .643.3.2 处理一个 IRP_MN_QUERY_REMOVE_DEVICE 请求 .663.3.3 处理一个 IRP_MN_REMOVE_DEVICE 请求 683.3.3.1 删除功能驱动程序里的一个设备 .683.3.3.2 删除过滤器驱动程序里的一个设备 .693.3.3.3 删除总线驱动程序里的一个设备 .693.3.4 处理一个 IRP_MN_CANCE
24、L_REMOVE_DEVICE 请求 713.3.5 处理一个 IRP_MN_SURPRISE_REMOVAL 请求 72第 4 章 使用 PnP 通知 754.1 PnP 通知总览 754.2 编写 PnP 通知回调例程的指南 764.3 使用 PnP 设备接口改变通知 774.3.1 为设备接口改变通知注册 .774.3.2 处理设备接口改变事件 .784.4 使用 PnP 目标设备改变通知 784.4.1 注册目标设备改变通知 .784.4.2 处理一个 GUID_TARGET_DEVICE_QUERY_REMOVE 事件 794.4.3 处理一个 GUID_TARGET_DEVICE_
25、REMOVE_COMPLETE 事件 804.4.4 处理一个 GUID_TARGET_DEVICE_REMOVE_CANCELLED 事件 804.5 使用 PnP 硬件 profile 改变通知 .804.5.1 注册硬件 profile 改变通知 814.5.2 处理硬件 profile 改变事件 814.6 使用 PnP 定制通知 81第 5 章 支持多功能设备 .835.1 支持多功能 PC Card 设备 .835.1.1 支持遵照多功能标准的 PC Card 845.1.2 支持有不完全配置寄存器地址的 PC Card 845.1.3 支持有不完全配置寄存器的 PC Card 8
26、75.2 支持多功能 PCI 设备 905.3 支持其他总线上的多功能设备 905.4 使用系统提供的 mf.sys.915.5 为一个多功能设备生成资源图 92第三部分 电源管理 .94第 1 章 在驱动程序内支持电源管理 .951.1 内核模式下的电源管理组件 951.1.1 ACPI BIOS 951.1.2 ACPI 驱动程序 .961.1.3 电源管理器 .961.1.4 电源管理中驱动程序的作用 .971.2 驱动程序的电源管理职能 97Windows 2000 驱动程序开发大全 第 1 卷 设计指南81.2.1 报告设备的电源性能 .971.2.1.1 DeviceD1 和 De
27、viceD2981.2.1.2 WakeFromD0,WakeFromD1,WakeFromD2 ,和 WakeFromD3981.2.1.3 DeviceState.981.2.1.4 SystemWake.991.2.1.5 DeviceWake .1001.2.1.6 D1Latency,D2Latency ,和 D3Latency1001.2.2 对电源管理设置设备对象标记 .1001.2.3 处理电源 IRP .1011.2.3.1 系统电源 IRP1011.2.3.2 独立设备的电源 IRP1021.2.4 设备的上电 .1031.2.5 设备的掉电 .1031.2.6 激活设备唤
28、醒能力 .1041.3 处理电源 IRP 的规则 1041.3.1 使用 PoCallDriver 1041.3.2 传递电源 IRP .1051.3.3 设备休眠时排队 I/O 请求 .1061.3.4 处理未被支持的或者无法识别的电源 IRP .106第 2 章 独立设备的电源管理 .1072.1 设备电源状态 1072.1.1 设备工作状态 DO1082.1.2 设备休眠状态 D1,D2,和 D3 1082.1.3 设备电源状态所需的支持 .1102.2 管理设备电源策略 1102.3 为设备电源状态处理 IRP_MN_SET_POWER1112.3.1 处理设备掉电 IRP .1122
29、.3.2 处理设备上电 IRP .1142.3.3 设备电源 IRPIoCompletion 例程 1142.4 为设备电源状态处理 IRP_MN_QUERY_POWER.1152.5 为设备电源状态发送 IRP_MN_QUERY_POWER 或者发送 IRP_MN_SET_POWER .1162.6 检测空闲的设备 1182.6.1 用于空闲检测的电源管理器程序 .1182.6.2 执行设备特定的空闲检测 .119第 3 章 处理系统电源状态请求 .1203.1 系统电源状态 1203.1.1 系统工作状态 S0 .1213.1.2 系统休眠状态 S1,S2 ,S3,S4 .1213.1.3
30、 系统关机状态 S5 .1233.1.4 系统电源动作 .1233.2 系统电源策略 1243.3 防止系统电源状态变化 125Windows 2000 驱动程序开发大全 第 1 卷 设计指南93.4 为系统电源状态处理 IRP_MN_QUERY_P0WER1253.4.1 使系统查询电源 IRP 失效 1263.4.2 在设备电源策略所有者中处理系统查询电源 IRP .1263.4.3 在总线驱动程序中处理系统查询电源 IRP .1273.4.4 在过滤驱动程序中处理系统查询电源 IRP .1273.5 为系统电源状态处理 IRP_MN_SET_POWER1283.5.1 在设备电源策略所有
31、者中处理系统设置电源 IRP .1283.5.1.1 确定当前的设备电源状态 .1293.5.1.2 发送一个响应系统设置电源 IRP 的设备设置电源 IRP1293.5.2 在总线驱动程序中处理系统设置电源 IRP .1303.5.3 在过滤驱动程序中处理系统设置电源 IRP .130第 4 章 支持具有唤醒能力的设备 .1324.1 等待/唤醒操作综述 .1324.1.1 确定设备是否能唤醒系统 .1334.1.2 理解通过设备树的等待/唤醒 IRP 的路径 .1344.1.3 完成等待/唤醒 IRP 综述 .1364.2 处理等待/唤醒 IRP 的步骤 .1374.2.1 在功能驱动程序
32、或者过滤驱动程序 (FDO)中处理等待/唤醒 IRP1374.2.2 在总线驱动程序(PDO)中处理等待/唤醒 IRP1384.2.3 等待/唤醒 IRPIoCompletion 例程 .1394.3 发送等待/唤醒 IRP 1394.3.1 确定何时发送等待/唤醒 IRP 1404.3.2 等待/唤醒 IRP 请求 .1404.3.3 等待/唤醒的回调例程 1404.3.4 撤消等待/唤醒 IRP 1414.4 等待/唤醒 IRP 的 Cancel 例程 142第四部分 设置 .143第 1 章 设备安装总览 .1451.1 设备安装组件 1451.2 PnP 设备安装示例 1471.3 S
33、etup 如何为设备选择驱动程序? 1481.4 系统设置阶段 151第 2 章 为设备提供驱动程序 .1522.1 驱动程序文件 1522.2 注册表中的驱动程序信息 1532.3 指定驱动程序装载顺序 1542.4 安装过滤器驱动程序 1562.5 为设备安装 Null 驱动程序 .158第 3 章 建立 INF 文件 1593.1 INF 文件总体指南 1593.2 为设备文件说明源和目标位置 1603.3 建立跨平台的和/或者双操作系统的 INF 文件 .161Windows 2000 驱动程序开发大全 第 1 卷 设计指南103.4 建立国际化的 INF 文件 1623.5 在设备的
34、 INF 文件中加强打开文件的安全性 1623.6 从应用程序访问 INF 文件 .1633.6.1 打开和关闭 INF 文件 1643.6.2 从 INF 文件提取信息 164第 4 章 编写协同安装程序 .1654.1 协同安装程序总览 1654.2 安装程序界面 1674.3 协同安装程序操作 1684.3.1 处理 DIF 代码 1684.4 注册协同安装程序 1704.4.1 注册设备专用的协同安装程序 .1704.4.2 注册类协同安装程序 .171第 5 章 编写类安装程序 .1745.1 类安装程序界面 1745.2 设备安装函数小结 1755.3 注册类安装程序 1765.4
35、 在类安装程序的 INF 文件中加强文件打开的安全性 176第 6 章 编写定制设备安装应用程序 .1786.1 安装与驱动程序共用的软件实用程序 1786.2 定制安装应用程序指导 178第 7 章 提供设备属性页 .1817.1 设备属性页所需的支持 1817.2 处理 DIF_ADDPROPERTYPAGE_ADVANCED.1817.3 属性页回调函数 1837.4 处理属性页的 Windows 信息 .183第 8 章 设备安装疑难解答 .1868.1 使用 SetupAPI 记录日志 .1878.1.1 设置 SetupAPI 记录日志级别 .1878.1.2 解释 SetupAP
36、I 日志文件示例 .1898.2 显示 Device Manager 中的隐藏设备 191第 9 章 安装一个要求重新启动机器的设备 .192第三卷 内核模式驱动程序设计指南 .1第一部分 一般内核模式 .2第 1 章 Windows 2000 和 WDM 驱动程序 .31.1 Windows 2000 组件一览 .31.2 Windows 2000 中的驱动程序种类 .41.3 Windows 2000 和 WDM 驱动程序的设计目标 51.3.1 移植性 .61.3.2 可配置性 .61.3.3 永远抢占优先和永远中断 .7Windows 2000 驱动程序开发大全 第 1 卷 设计指南1
37、11.3.4 多处理器安全 .81.3.5 基于对象 .91.3.6 带有可复用 IRP 的包驱动 I/O.101.3.7 支持异步 I/O.11第 2 章 分层的 I/O、 IRP 和 I/O 对象 122.1 Windows 2000 I/O 模型概述 122.2 终端用户 I/O 请求和 Windows 2000 文件对象 .132.2.1 用户 I/O 请求的注意事项 142.3 IRP 和驱动程序指定的 I/O 栈位置 .142.3.1 IRP 处理的注意事项 .182.4 驱动程序对象和标准驱动程序例程 .192.4.1 对象的不透明性 .192.4.2 标准驱动程序对象入口点 .
38、202.4.3 其他标准驱动程序例程 .212.4.4 标准驱动程序例程的注意事项 .222.5 设备配置和分层驱动程序 .232.5.1 样例设备和驱动程序配置 .242.5.2 添加驱动程序的注意事项 .242.6 设备对象和分层驱动程序 .242.6.1 针对样本配置的设备对象 .252.6.2 设备对象的注意事项 .26第 3 章 系统定义的对象和对驱动程序的支持 .273.1 系统组成部分和分层内核模式驱动程序 .283.1.1 操纵系统定义的对象的支持例程 .283.1.2 存储系统定义的对象 .303.2 设备对象和设备扩展 .313.2.1 定义设备扩展 .313.2.2 创建
39、设备对象和设备扩展 .323.2.3 初始化驱动程序特定的设备对象和设备扩展 .333.2.4 设置用户缓冲区的访问 .353.2.4.1 使用缓冲 I/O .353.2.4.2 使用直接 I/O .363.2.4.3 使用非直接也非缓冲的 I/O .383.3 适配器对象和 DMA.393.3.1 映射寄存器 .403.3.2 获取适配器对象 .413.3.3 拆分传输请求 .423.3.4 使用系统 DMA.433.3.4.1 基于包的系统 DMA .433.3.4.1.1 为基于包的 DMA 分配适配器通道 .443.3.4.1.2 为基于包的 DMA 设置系统 DMA 控制器 .453
40、.3.4.2 公用缓冲区系统 DMA .47Windows 2000 驱动程序开发大全 第 1 卷 设计指南123.3.4.2.1 为公用缓冲区系统 DMA 分配适配器通道 .483.3.4.2.2 为公用缓冲区 DMA 设置系统 DMA 控制器 .493.3.5 使用总线控制器 DMA.493.3.5.1 基于包的总线控制器 DMA .503.3.5.1.1 分配总线控制器适配器对象 513.3.5.1.2 设置传输操作 523.3.5.2 公用缓冲区的总线控制器 DMA .543.3.6 执行发散/收集 DMA553.4 控制器对象 .563.4.1 创建带有控制器扩展的控制器对象 .57
41、3.4.2 I/O 操作分配控制器对象 583.5 中断对象 .593.5.1 获得系统指定的中断向量、DIRQL 和处理器掩码 603.5.2 注册 ISR603.6 DPC 对象 .613.6.1 注册和排队 DpcForIsr 例程 .623.6.2 注册和排队 CustomDpc 例程 633.7 带有相关的 DPC 的定时器对象 .643.7.1 注册和启用 IoTimer 例程 643.7.2 注册和排队 CustomTimerDpc 例程 653.8 设备队列对象和互锁队列 .663.8.1 设置设备队列对象和排队 IRP673.8.2 设置一个互锁队列和排队 IRP683.9
42、内核调度者对象 .693.9.1 定时器对象 .713.9.2 事件对象 .723.9.3 信号量对象 .743.9.4 互斥体对象 .753.9.5 线程在调度者对象上等待的报警和 APC 的处理 .783.10 回调对象 .793.10.1 定义回调对象 .793.10.2 使用驱动程序定义的回调对象 .803.10.3 使用系统定义的回调对象 .80第 4 章 驱动程序基本结构 .824.1 标准驱动程序例程 .824.2 最低层设备驱动程序的分段 IRP 处理 .834.3 中间层驱动程序的分段 IRP 处理 .864.4 设计和开发一个驱动程序 .884.4.1 设备对象命名和设备接
43、口注册 .884.4.2 为驱动程序例程选择名字 .884.4.3 开始设计 .894.4.4 开始开发 .91Windows 2000 驱动程序开发大全 第 1 卷 设计指南13第 5 章 DriverEntry 和 Reinitialize 例程 .935.1 DriverEntry 例程需求 935.1.1 DriverEntry 例程语法与参数 935.1.2 DriverEnty 返回值 .945.2 DriverEntry 例程功能 945.2.1 DriverEntry 例程必备功能 955.2.2 DrierEntry 可选功能 955.3 Reinitialize 例程需求与
44、功能 96第 6 章 Dispatch 例程 986.1 Dispatch 例程需求 .986.1.1 Dispatch 例程一般实现 .996.1.2 Dispatch 例程条件实现 .1006.2 Dispatch 例程基本功能 .1016.2.1 何时检查 I/O 栈位置 1016.2.2 如何在一个 Dispatch 例程中完成一个 IRP1026.2.3 何时在 Dispatch 例程中完成一个 IRP1036.2.4 如何从一个 Dispatch 例程传送带有效参数的 IRP1046.2.5 为较低层驱动程序分配 IRP1056.2.6 处理异步传输请求 .1056.3 Dispa
45、tch 例程设计 .1066.3.1 DispatchCreate 和 DispatchClose 功能 .1066.3.1.1 基本 DispatchCreateClose 例程 1076.3.1.2 实现 DispatchCreateClose 的注意事项 1076.3.2 DispatchCleanup 功能 1086.3.3 DispatchRead 或 DispatchWrite 功能 .1096.3.3.1 使用缓冲 I/O 的 DispatchReadWrite1106.3.3.2 使用直接 I/O 的 DispatchReadWrite1116.3.3.3 较高层驱动程序的 D
46、ispatchReadWrite .1116.3.3.4 实现 DispatchReadWrite 的注意事项 1126.3.4 Dispatch(Internal)DeviceControl 功能 1136.3.4.1 最低层驱动程序中的 DispatchDeviceControl.1146.3.4.2 较高层驱动程序中的 DispatchDeviceControl.1146.3.4.3 类/端口驱动程序中的 Dispatc(Internal)DeviceControl.1156.3.4.4 实现 Dispatch(Internal)DeviceControl 的注意事项 .116第 7 章
47、 StartIo 和队列管理例程 .1187.1 排队 IRP1187.2 StarIo 例程需求 .1197.2.1 设备驱动程序中的 StartIo 例程 1207.2.2 StartIo 例程功能 1217.2.2.1 使用缓冲 I/O 的设备驱动程序 StartIo 例程 .1227.2.2.2 使用直接 I/O 的设备驱动程序 StartIo 例程 .1227.2.2.3 在 StartIo 中处理设备控制请求 .123Windows 2000 驱动程序开发大全 第 1 卷 设计指南147.2.3 I/O 操作设备编程 1237.2.4 较高层驱动程序中的 StartIo 例程 12
48、47.2.5 实现 StartIo 的注意事项 1247.3 使用互锁队列或设备队列的需求 .1257.3.1 驱动程序管理的队列的存储需求 .1267.3.2 建立驱动程序管理的队列 .1267.3.3 驱动程序管理的队列中排队的 IRP1267.3.4 用驱动程序创建的线程管理互锁队列 .1277.3.5 管理补充设备队列 .128第 8 章 中断服务例程 .1318.1 ISR 需求 .1318.1.1 ISR 性能 .1318.1.2 附加的需求的驱动程序例程 .1328.1.3 建立一个 ISR1328.2 ISR 基本功能 .1328.3 ISR 重叠 I/O 操作功能 .133第
49、 9 章 DpcForIsr 例程和 CustomDpc 例程 1359.1 DpcForIsr 和 CustomDpc 例程需求 .1359.1.1 DpcForIsr 例程与 CustomDpc 例程 1359.1.2 DpcForIsr 例程基本需求 .1369.1.3 CustomDpc 例程基本需求 1369.1.4 其他需要的驱动程序例程 .1379.1.5 建立 DpcForIsr 和 CustomDpc 例程 1379.2 DpcForIsr 和 CustomDpc 功能 .1389.2.1 使用缓冲 I/O 和满足设备控制 IRP.1399.2.2 直接 I/O 使用 1399.2.3 实现一个 DpcForIsr 或 CustomDpc 例程的注意事项 140第 10 章 SynchCritSection 例程 14210.1 SynchCritSection 例程需求 .14210.1.1 使用 SynchCritSection 例程 .14210.1.2 运行 SynchCritSection 例程 .14310.1.3 SynchCritSection 例程性能需求 .14310.