第一部分 Windows NT的体系结构
第1章 Windows NT操作系统概述
1.1 Windows NT主要特点
1.1.1 多线程
1.1.2 多任务
1.1.3 按需分页的虚拟内存
1.1.4 多处理
1.1.5 处理器体系结构独立性
1.1.6 微核模型
1.1.7 集成化的网络功能
1.1.8 多操作系统仿真
1.2 用户模式程序和环境子系统
1.2.1 绕过环境子系统
1.2.2 本地Windows NT API
1.2.3 Win32环境子系统
1.3 Windows NT可执行层
1.3.1 I/O管理器
1.3.2 对象管理器
1.3.3 安全引用监视器
1.3.4 进程管理器
1.3.5 局部过程调用工具
1.3.6 内存管理器和高速缓存管理器
1.3.7 Win32支持部件
1.4 Windows NT微核
1.5 硬件抽象层
第2章 通过HAL获得硬件独立性
2.1 HAL在Windows NT操作系统中的作用
2.2 设备寻址
2.3 I/O结构
2.3.1 为设备访问选择正确的HAL函数
2.3.2 HAL缓冲区函数
2.4 中断管理
2.5 DMA(直接内存访问)操作
2.6 其他的HAL工具
2.7 HAL所不处理的处理器结构差别
第3章 虚拟内存
3.1 按需分页的虚拟内存
3.1.1 按需分页虚拟内存的原理
3.1.2 内存管理器的操作
3.1.3 地址空间分隔和控制
3.1.4 内存共享
3.1.5 拷贝—写入
3.1.6 内存映射文件
3.1.7 分页
3.1.8 地址转换
3.1.9 页表
3.1.10 从虚拟到物理的地址转换
3.1.11 虚拟地址描述符
3.1.12 环境
3.2 物理内存管理
3.2.1 页框数据库
3.2.2 页面恢复算法
3.2.3 部分对象(Section Object)
3.3 内存管理器调整(Tuning)
3.4 驱动程序和虚拟内存(VM)
3.4.1 内存描述符列表(Memory Descriptor Lists)
3.4.2 结构化例外处理(Structured Exception Handling)
第4章 注册表
4.1 查看和修改注册表
4.2 注册表组织结构(Registry Organiztion)
4.2.1 子关键字(Subkey)、值(Value)和数据类型
4.2.2 管理宽字符串
4.3 设备驱动程序开发者关心的注册表关键字
4.3.1 硬件(HARDWARE)
4.3.2 软件(SOFTWARE)
4.3.3 SYSTEM子关键字和控制设置
第5章 分派和调度
5.1 分派
5.2 调度
5.2.1 线程优先级
5.2.2 优先占用
5.2.3 调度对驱动程序的影响
第6章 中断请求等级和DPC(延迟过程调用)
6.1 了解中断请求等级(IRQL)
6.1.1 IRQL并不是调度优先级
6.1.2 决定IRQL
6.2 如何使用IRQL
6.2.1 IRQL PASSIVE_LEVEL
6.2.2 IRQL APC_LEVEL
6.2.3 IRQL DISPATCH_LEVEL
6.2.4 DIRQL
6.2.5 IRQL HIGH_LEVEL
6.3 延迟过程调用(DPC)
6.3.1 DPC对象
6.3.2 DPC的调用和服务
6.3.3 DPC对象特点
6.4 DpcForIsr
第7章 多处理器问题
7.1 共享数据的问题
7.2 使用锁定(Lock)来完成序列访问共享数据
7.3 互锁
7.3.1 运行型互锁
7.3.2 中断型互锁
7.3.3 在单处理器系统中运行互锁
7.4 互锁的问题
第二部分 I/O管理器和设备驱动程序的具体细节
第8章 I/O结构
8.1 可编程的I/O设备
8.2 总线控制器DMA设备
8.2.1 两类总线控制器DMA设备
8.2.2 逻辑地址
8.2.3 分散/集中(Scatter/Gather)
8.3 系统DMA设备
第9章 I/O管理器
9.1 I/O子系统设计特点
9.2 NT I/O子系统具有一致性并且高度结构化
9.2.1 NT I/O子系统跨平台可移植性
9.3 NT I/O子系统是可配置的
9.4 NT I/O子系统
9.5 NT I/O子系统是多处理器安全的
9.6 NT I/O子系统是基于对象的
9.6.1 文件对象
9.6.2 驱动程序对象
9.6.3 设备对象
9.6.4 中断对象
9.6.5 适配器对象
9.7 NT I/O子系统是异步的
9.8 NT I/O子系统是包驱动的
9.9 NT I/O子系统是分层的
第10章 如何描述I/O请求
10.1 IRP结构
10.1.1 IRP固定部分的域
10.1.2 IRP I/O堆栈位置中的域
10.2 数据缓冲区的描述
10.2.1 直接I/O描述数据缓冲区
10.2.2 使用缓冲的I/O描述数据缓冲区
10.2.3 使用非I/O数据缓冲区描述
10.2.4 评价可使用的数据缓冲区描述符选项
10.3 I/O函数代码
10.3.1 理解设备I/O控制函数(IOCTL)
10.3.2 定义客户的IOCTL
10.3.3 I/O请求参数
10.4 处理和运行IRP
10.5 案例学习:当非I/O方式成为唯一选择时
第11章 分层化的驱动程序模型
11.1 核心模式驱动程序
11.1.1 文件系统驱动程序
11.1.2 中级驱动程序
11.1.3 设备驱动程序
11.1.4 微驱动程序
11.2 中间级和设备驱动程序分层化(Layering)
11.3 文件系统驱动程序分层化
11.4 在堆栈顶部寻找驱动程序
11.5 了解驱动程序结构
11.6 分层处理I/O请求
11.6.1 处理IRP本身
11.6.2 将IRP传递给较低分层的驱动程序
11.6.3 创建传递到更低等级驱动程序的附加IRP
11.6.4 等级化驱动程序模型的优势
11.7 完成通知
11.7.1 在一个完成例程中驱动程序功能
11.8 在驱动程序之间的专门知识
11.9 过滤器驱动程序
11.9.1 过滤器驱动程序使用指导
11.10 快速I/O
11.11 案例学习:载入顺序的重要性
第12章 驱动程序结构
12.1 驱动程序入口点
12.2 理解驱动程序结构
12.2.1 载入和初始化
12.2.2 设备驱动程序的请求处理
12.2.3 中级驱动程序的请求处理
12.2.4 动态卸载
12.2.5 请求处理环境
第13章 驱动程序入口
13.1 决定设备配置
13.1.1 资源列表、描述符和部分描述符
13.1.2 查询系统配置数据
13.1.3 查询总统配置数据
13.1.4 查询注册表
I3.2 创建设备对象
13.2.1 设备扩展
13.2.2 设备名称
13.2.3 设备类型和特性
13.2.4 设备排他性
13.2.5 设备命名考虑
13.2.6 设备标号链接
13.3 获得硬件资源
13.4 转换总线地址
13.4.1 映射逻辑地址到核心虚拟地址空间
13.4.2 举例:转换总线地址
13.4.3 总线地址转换的精华
13.5 输出入口点
13.6 连接中断和注册DpcForIsr
13.6.1 转换中断等级和向量
13.6.2 将驱动程序ISR与中断相连
13.6.3 为DpcForIsr初始化DPC对象
13.7 获得一个适配器对象
13.8 执行设备初始化
13.9 其他DriverEntry操作
13.9.1 中级缓冲区
13.9.2 DMA设备的公共缓冲区
13.9.3 I/O计时器
13.9.4 中级驱动程序和过滤器驱动程序
13.10 动态驱动程序卸载
第14章 分派入口点
14.1 确认请求
14.2 完成请求
14.2.1 提升I/O请求线程优先级
14.2.2 I/O管理器如何完成请求
14.3 挂起和排队请求
14.3.1 系统排队
14.3.2 驱动程序排队
14.3.3 附加设备队列
14.4 请求处理
14.4.1 同步处理并完成
14.4.2 异步处理与结束
14.4.3 结合同步和异步方法
14.5 关闭通告
14.6 删除处理
14.6.1 系统排队和IRP删除
14.6.2 驱动程序排队和IRP删除
14.6.3 删除正在处理的请求
14.7 小结
第15章 中断服务例程和DPC
15.1 中断服务例程
15.1.1 ISR的内部过程
15.1.2 中断共享和ISR
15.2 DpcForIsr和CustomDpc
15.2.1 DpcForIsr的登录入口点
15.2.2 在DpcForIsr中的处理过程
15.3 ISR和DpcForIsr的设计
15.3.1 ISR和DPC
15.3.2 ISR对DPC例程的延迟
15.4 实例分析
第16章 程序化的I/O数据传送
16.1 处理程序化的数据传送
16.1.1 得到请求者缓冲区地址
16.1.2 得到请求者缓冲区长度
16.1.3 通过请求和控制传输操纵设备
16.1.4 在设备和请求者缓冲区之间传递数据
16.2 程序化的I/O驱动程序实例
16.2.1 分派例程和StartIo例程
16.2.2 中断服务例程
16.2.3 DPC例程
16.2.4 例中驱动程序的DPC与ISR之间的关系
16.3 程序化的I/O设备驱动程序设计中的一些问题
16.3.1 将设备内存映射到用户空间
16.3.2 轮询
16.3.3 同步驱动程序的实现
第17章 DMA数据传输
17.1 DMA数据传输处理
17.2 适配器对象
17.3 映射寄存器
17.4 DMA设备结构
17.4.1 基于数据包的DMA
17.4.2 公用缓存DMA
17.4.3 基于数据包的DMA和公用缓冲区DMA的比较
17.5 基于数据包的DMA传输
17.5.1 准备传输
17.5.2 对设备编程
17.5.3 结束传输
17.5.4 延续驱动程序执行
17.6 公用缓冲区DMA传输
17.6.1 分配公用缓冲区
17.6.7 执行传输
17.6.3 延续驱动程序的执行
17.7 基于数据包的DMA驱动程序例子
17.7.1 分派程序
17.7.2 准备传输
17.7.3 对设备编程
17.7.4 中断服务程序
17.7.5 结束传输并且延续程序的执行
17.8 DMA设备驱动程序的设计问题
17.8.1 对齐限制
17.8.2 系统DMA
第18章 驱动程序的生成和调试
18.1 建立驱动程序开发环境
18.1.1 以下将详细讨论上述步骤
18.1.2 建立系统
18.1.3 设置调试
18.2 生成驱动程序
18.3 驱动程序调试
18.3.1 核心调试器扩展
18.4 调试和测试的提示和技巧
18.4.1 在WinDbg中显示输出
18.4.2 在哪里生成你的项目
18.4.3 在你的测试系统上安装多种系统映相
18.4.4 提高串口的速度
18.4.5 用SysRq键中止测试系统
18.4.6 断定假设
18.4.7 ASSERT()只能工作在受限结构上
18.4.8 定义你自己的ASSERT()宏
18.4.9 在MP系统上测试
18.4.10 使用DDK提供的工具
18.4.11 用性能监视器检查你的驱动程序
18.4.12 打开池检查
18.4.13 保持最新
18.4.14 从世界获取帮助
18.5 蓝屏内幕
18.5.1 蓝屏格式
18.5.2 报告或解释蓝屏
18.6 崩溃堆文件
第19章 创建一个完全的驱动程序
19.1 驱动程序错误记录
19.1.1 定义错误信息
19.1.2 分配错误记录包
19.1.3 往事件日志中写包
19.1.4 激活信息编译器
19.1.5 将驱动程序注册为事件记录源
19.2 定义驱动程序版本资源
19.2.1 从Microsoft提供的模板定义.RC文件
19.2.2 创建你自己的资源定义文件
第20章 安装和启动驱动程序
20.1 驱动程序如何启动
20.1.1 驱动程序服务项
20.2 驱动程序特定的和设备特定的参数
20.3 驱动程序安装
20.3.1 文本设置
20.3.2 GUI设置
20.3.3 自定义设置
第三部分 备用的NT驱动程序结构
第21章 文件系统驱动程序
21.1 文件系统驱动程序特性
21.1.1 文件系统驱动程序在请求线程的环境中被调用
21.1.2 文件系统驱动程序同虚拟内存(VM)子系统紧密地集成在一起
21.1.3 文件系统驱动程序与I/O和对象管理器联系紧密
21.2 更多地了解关于开发文件系统驱动程序
第22章 视频微端口驱动程序
22.1 视频端口/微端口驱动程序
22.1.1 视频端口驱动程序
22.1.2 视频微端口驱动程序
22.2 显示驱动程序
22.2.1 设备显示接口(DDI)驱动程序
22.3 DMA(直接内存访问)和视频显示驱动程序
22.4 更深入地了解开发视频显示驱动程序
第23章 SCSI微端口驱动程序
23.1 SCSI微端口驱动程序特性
23.2 SCSI微端口驱动程序结构
23.2.1 初始化工作
23.2.2 请求的初始化
23.2.3 中断服务
23.3 更深入地了解关于开发SCSI微端口驱动程序
第24章 NDIS微端口驱动程序
24.1 标准的NDIS家族
24.2 Windows NT网络结构
24.3 NDIS驱动程序类型和NDIS库
24.4 NDIS LAN微端口驱动程序
24.4.1 初始化
24.4.2 传输处理
24.4.3 中断和DPC处理
24.4.4 传输终结
24.4.5 消息接收
24.4.6 串行化
24.5 更深入地了解如何开发NDIS驱动程序
第四部分 附录
附录A Windows NT状态代码/Win32错误代码
附录B 关于驱动程序编写者信息的资料来源
本书的网页
期刊和杂志
NT内幕杂志
Windows NT杂志
Dobb’s博士的期刊
Microsoft的知识基地
新闻组,邮件列表和一些最常遇到的问题
NTDEV邮件列表
NTFSD邮件列表
DDK-L邮件列表
关于Windows NT核心模式驱动程序最经常问到的问题
研讨会
OSR开放系统资源公司
David Solomon专家研讨会
附录C Windows 2000的一些变化
在Windows 2000上的NT 4.0设备驱动程序
驱动程序登录的变化
Windows 2000的驱动程序入口点
添加设备入口点
处理即插即用IRP
DMA实现上的变化
电源管理
IRP_MN_QUERY_POWER
IRP_MN_SET_POWER
IRP_MN_WAIT_WAKE