WDM 採結構化程式設計,執行效率高但開發效率較低。所有驅動程式包含基本組件:從 DriverEntry 進入,透過派遣例程 DispatchXXX 分派 IRP,若無法處理則下傳至下層驅動,完成後回傳 NTSTATUS。
IRP 從上層過濾器順流而下至總線驅動,再逐級返回。若中間驅動攔截 IRP 不當處理,將導致資料遺失、死機甚至系統資料損壞,故驅動程式必須嚴守規範。
模型呈現循環流程:IO 管理器發出 IRP → 派遣例程 → StartIo → 中斷服務例程 (ISR) → DPC 例程 → 完成 IRP 回傳發起者。若無實體硬體,StartIo、ISR、DPC 可能不存在。
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = DriverUnload;
DriverObject->DriverExtension->AddDevice = AddDevice;
DriverObject->DriverStartIo = StartIo;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi;
// 保存服務登錄鍵路徑
servkey.Buffer = (PWSTR)ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));
RtlCopyUnicodeString(&servkey, RegistryPath);
return STATUS_SUCCESS;
}
紅字標示關鍵例程:AddDevice、DriverUnload、StartIo、MajorFunction 陣列派遣函數。
切勿混淆驅動物件與裝置物件。
| 前綴 | 類別 |
|---|---|
| Ex | 執行支援 |
| Hal | 硬體抽象層 |
| Io | I/O 管理器 (含 PnP) |
| Ke | 核心 |
| Mm | 記憶體管理器 |
| Ob | 物件管理器 |
| Po | 電源管理 |
| Ps | 處理序結構 |
| Rtl | 執行期程式庫 |
| Zw | 其他系統服務 |
| Cc | Cache 管理 |
| FsRtl | 檔案系統執行期程式庫 |
SRV*c:\symbols*https://msdl.microsoft.com/download/symbolsboot.ini 加入 /debug /debugport=com1 /baudrate=115200bu sioctl!DriverEntry ; 延遲設定中斷點
g ; 執行至中斷點
bl ; 列出中斷點
dv / dt ; 檢視變數/資料結構
!pcr / !process ; 取得處理序/執行緒核心物件位址
dt -r1 _eprocess 81bef448
善用 dt 檢視結構體細節,結合原始碼單步追蹤 (F10/F11),快速掌握驅動行為。
本章為驅動開發入門關鍵,建議通讀參考書第 2-5 章,重點攻克同步機制等新概念。驅動程式開發如學習組合語言,初期艱澀,拆解問題、循序漸進終將豁然開朗。