目 錄
第一部分 設備驅動程序體係結構概述
第1 章 對象 2
1.1 對象的本質 2
1.2 軟件對象是什麼 2
1.3 預備知識 4
1.4 軟件組件 4
第2 章 WDF 體係結構 6
2.1 WDF 組件的功能 6
2.2 WDF 的設計目標 7
2.3 WDF 中的設備和驅動程序支持 7
2.4 WDF 驅動程序模型 8
2.5 WDF 對象模型 9
2.5.1 內核模式對象 10
2.5.2 用戶模式對象 10
2.6 即插即用和電源管理支持 11
2.7 集成的I/O 排隊和取消 12
2.7.1 並發 12
2.7.2 I/O 模型 13
2.7.3 I/O 請求流程 13
2.7.4 設備I/O 請求 14
2.7.5 即插即用和電源管理請求 15
2.8 WMI 請求(僅限內核模式驅動程序) 15
2.9 驅動程序框架 15
2.9.1 內核模式框架 16
2.9.2 用戶模式框架 18
2.10 Windows 內核 18
2.10.1 反射器 19
2.10.2 驅動程序宿主進程 19
2.10.3 驅動程序管理器 19
2.11 開發和測試工具 19
2.11.1 PFD 20
2.11.2 SDV 21
2.11.3 框架驗證器 21
2.11.4 跟蹤日誌 21
2.11.5 調試器擴展 22
2.11.6 適用性和版本控製 22
第二部分 用戶模式驅動程序
第3 章 Windows 7 用戶模式驅動程序概述和操作 24
3.1 在用戶模式中支持的設備 24
3.2 UMDF 模型概述 25
3.2.1 UMDF 對象模型 27
3.2.2 UMDF 對象 27
3.3 驅動程序迴調接口 28
3.4 UMDF 驅動程序功能 29
3.4.1 身份模擬 30
3.4.2 設備屬性存儲 30
3.5 I/O 請求流 30
3.5.1 I/O 請求調度 32
3.5.2 創建、清理和關閉請求 32
3.5.3 創建、讀、寫和設備I/O 控製請求 34
3.6 I/O 隊列 35
3.6.1 調度類型 36
3.6.2 隊列和電源管理 36
3.7 I/O 請求對象 37
3.7.1 根據I/O 請求獲取緩衝區 37
3.7.2 嚮I/O 目標發送I/O 請求 38
3.7.3 為I/O 請求創建緩衝區 39
3.7.4 取消和掛起的請求 40
3.7.5 完成I/O 請求 41
3.7.6 自適應超時 41
3.8 自管理I/O 42
3.9 同步問題 42
3.10 鎖 43
3.11 即插即用和電源管理通知 43
3.12 設備枚舉和啓動 44
3.13 關閉設備電源和移除設備 45
3.14 構建、測試和調試 47
3.14.1 安裝和配置 47
3.14.2 版本控製和更新 48
第4 章 針對UMDF 進行驅動程序編程 49
4.1 Windows I/O 概述 49
4.2 COM 簡介 51
4.3 UMDF 體係結構 51
4.4 必需的驅動程序功能 53
4.5 UMDF 示例驅動程序 55
4.5.1 最小UMDF 驅動程序:Skeleton 驅動程序 56
4.5.2 Skeleton 驅動程序的類、對象和接口 56
4.6 驅動程序動態鏈接庫和導齣 57
4.6.1 驅動程序入口點:DllMain 57
4.6.2 獲得類對象:DllGetClassObject 59
4.7 COM 支持函數 60
4.7.1 IUnknown 方法 60
4.7.2 IClassFactory 接口 61
4.7.3 驅動程序迴調對象 61
4.7.4 設備迴調對象 64
4.8 以Skeleton 驅動程序為基礎進行開發 69
4.8.1 自定義導齣文件 69
4.8.2 自定義源文件 69
4.8.3 自定義INX 文件 70
4.8.4 自定義Comsup.cpp 文件 70
4.8.5 將特定於設備的代碼加入Driver.cpp 70
4.8.6 將特定於設備的代碼加入Device.cpp 71
第5 章 使用COM 開發UMDF 驅動程序 72
5.1 入門指南 72
5.1.1 COM 基礎知識 72
5.1.2 HRESULT 74
5.2 使用UMDF COM 對象 75
5.2.1 獲得UMDF 對象的接口 76
5.2.2 引用計數 77
5.3 基本的基礎設施實現 78
5.3.1 DllMain 78
5.3.2 DllGetClassObject 78
5.3.3 驅動程序對象的類工廠 79
5.3.4 實現UMDF 迴調對象 79
5.3.5 實現QueryInterface 81
第三部分 內核模式驅動程序
第6 章 Windows 7 內核模式驅動程序概述與操作 84
6.1 KMDF 支持的設備 84
6.2 KMDF 組件 85
6.3 KMDF 驅動程序結構 85
6.4 KMDF 和WDM 驅動程序比較 86
6.5 設備對象和驅動程序角色 87
6.5.1 過濾器驅動程序和過濾器設備對象 88
6.5.2 功能驅動程序和功能設備對象 88
6.5.3 總綫驅動程序和物理設備對象 89
6.5.4 舊版設備驅動程序和控製設備對象 89
6.6 KMDF 對象模型 90
6.6.1 方法、屬性和事件 90
6.6.2 對象層次結構 91
6.6.3 對象特性 93
6.6.4 對象上下文 93
6.6.5 對象創建和刪除 94
6.7 KMDF I/O 模型 95
6.7.1 I/O 請求處理程序 96
6.7.2 I/O 隊列 97
6.7.3 I/O 請求對象 100
6.7.4 從I/O 請求檢索緩衝區 100
6.7.5 I/O 目標 101
6.7.6 創建I/O 請求緩衝區 102
6.7.7 取消和掛起請求 102
6.7.8 完成I/O 請求 104
6.7.9 自托管I/O 104
6.7.10 訪問IRP 和WDM 結構 104
第7 章 即插即用和電源管理 105
7.1 即插即用和電源管理概述 105
7.2 設備枚舉和啓動 106
7.2.1 功能或過濾器設備對象的啓動順序 106
7.2.2 物理設備對象的啓動順序 107
7.2.3 設備電源關閉和移除 108
7.3 WMI 請求處理程序 111
7.4 同步問題 112
7.4.1 同步範圍 112
7.4.2 執行級彆 114
7.4.3 鎖 115
7.4.4 同步機製的交互作用 115
7.5 安全 116
7.5.1 安全默認值 116
7.5.2 參數驗證 116
7.5.3 Unicode 計數字符串 116
7.5.4 安全設備命名技術 117
第8 章 內核模式的安裝和生成 118
8.1 WDK 生成工具 118
8.2 生成環境 119
8.3 生成項目 120
8.4 生成Featured Toaster 120
8.4.1 Makefile 和Makefile.inc 121
8.4.2 源文件 121
8.4.3 生成過程 122
8.5 安裝KMDF 驅動程序 123
8.5.1 WDF 輔助安裝程序 123
8.5.2 INF 123
8.5.3 KMDF 驅動程序的INF 124
8.5.4 wdffeatured.inf 124
8.6 目錄文件和數字簽名 125
8.7 安裝Featured Toaster 126
8.8 測試KMDF 驅動程序 127
8.8.1 PREfast 127
8.8.2 SDV 127
8.8.3 KMDF 日誌 128
8.8.4 KMDF 驗證程序 128
8.8.5 調試KMDF 驅動程序 129
8.8.6 內核調試 130
8.8.7 KMDF 驅動程序功能 130
8.9 調試宏和例程 131
8.10 WDF 調試程序擴展命令 132
8.11 使用WPP 跟蹤與KMDF 驅動程序 132
8.12 使用WinDbg 與Featured Toaster 133
8.13 版本控製和動態綁定 135
第9 章 為KMDF 編寫驅動程序 136
9.1 KMDF 與WDM 示例之間的差彆 139
9.2 KMDF 示例中使用的宏 140
9.3 KMDF 驅動程序結構和概念 140
9.3.1 對象創建 141
9.3.2 對象上下文區 141
9.3.3 I/O 隊列 142
9.3.4 I/O 請求 143
9.4 最小的KMDF 驅動程序:SimpleToaster 143
9.4.1 創建WDF 驅動程序對象:DriverEntry 144
9.4.2 創建設備對象、設備接口和I/O 隊列:EvtDriver-DeviceAdd 145
9.4.3 設備對象和設備上下文區 147
9.4.4 設備接口 148
9.4.5 默認I/O 隊列 149
9.4.6 處理I/O 請求:EvtIoRead、EvtIoWrite、EvtIoDevice-Control 150
9.5 純軟件驅動程序示例 151
9.5.1 文件創建和關閉請求 151
9.5.2 其他的設備對象特性 153
9.5.3 設置其他設備對象屬性 154
第10 章 為即插即用和電源管理編寫程序 156
10.1 注冊迴調函數 156
10.2 管理電源策略 159
10.3 通電和斷電時的迴調函數 161
10.4 支持喚醒信號的迴調函數 162
第11 章 為WMI 支持編寫程序 163
11.1 WMI 體係結構 163
11.2 注冊為WMI 數據提供程序 163
11.3 處理WMI 請求 164
11.4 WDM 驅動程序的WMI 要求 165
11.5 WMI 類名和基類 166
11.6 觸發WMI 事件 168
11.7 解決具體的WMI 問題 172
11.7.1 驅動程序的WMI 類並不齣現在
ootwmi 命名空間中 172
11.7.2 不能訪問驅動程序的WMI屬性或方法 172
11.7.3 未接收驅動程序的WMI事件 173
11.7.4 改變WMI 請求的安全設置並不生效 173
11.8 測試WMI 驅動程序支持的技術 174
11.8.1 WMI IRP 和係統事件日誌 174
11.8.2 WMI WDM 提供程序日誌 174
11.9 WMI 事件跟蹤 175
第12 章 編寫KMDF 硬件驅動程序 177
12.1 支持設備中斷 177
12.1.1 創建中斷對象 178
12.1.2 創建中斷對象的代碼 178
12.1.3 啓用和禁用中斷 179
12.1.4 啓用中斷的代碼 179
12.1.5 禁用中斷的代碼 180
12.1.6 啓用中斷後和禁用中斷前的處理 180
12.2 處理中斷 181
12.2.1 EvtInterruptIsr 迴調函數的代碼 182
12.2.2 中斷的延遲處理 183
12.3 映射資源 184
12.3.1 映射資源的代碼 185
12.3.2 取消映射資源的代碼 189
第13 章 編寫多個I/O 隊列程序並編寫I/O 程序 190
13.1 編寫I/O 隊列簡介 190
13.2 創建和配置隊列 191
13.2.1 為寫請求創建隊列的代碼 192
13.2.2 為讀請求創建隊列的代碼 193
13.2.3 為設備I/O 控製請求創建隊列的代碼 194
13.3 處理並行隊列的請求 195
13.3.1 處理I/O 請求的代碼 195
13.3.2 執行緩衝I/O 197
13.4 將請求轉發給隊列 198
13.5 從手動隊列獲取請求 199
13.6 讀取和寫入注冊錶 202
13.7 監視器計時器:自管理I/O 205
13.7.1 啓動和重啓自管理I/O設備 206
13.7.2 設備斷電和移除期間的自管理I/O 206
13.7.3 實現監視器計時器 207
附錄 驅動程序信息網站 212
參考 文獻 221
· · · · · · (
收起)