首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

檔案系統驅動程式開發基礎(二):WDM 標準模型與核心資料結構

     編輯:關於C++

標準模型概觀

WDM 採結構化程式設計,執行效率高但開發效率較低。所有驅動程式包含基本組件:從 DriverEntry 進入,透過派遣例程 DispatchXXX 分派 IRP,若無法處理則下傳至下層驅動,完成後回傳 NTSTATUS。

分層架構與 IRP 流向

裝置物件堆疊

  • PDO (Physical Device Object):堆疊最底層,代表實體硬體。
  • FDO (Functional Device Object):中間層,提供功能介面。
  • Filter Device Object:FDO 上方為上層過濾器,下方(PDO 上方)為下層過濾器。

IRP 從上層過濾器順流而下至總線驅動,再逐級返回。若中間驅動攔截 IRP 不當處理,將導致資料遺失、死機甚至系統資料損壞,故驅動程式必須嚴守規範。

單一驅動程式標準模型

模型呈現循環流程:IO 管理器發出 IRP → 派遣例程 → StartIo → 中斷服務例程 (ISR) → DPC 例程 → 完成 IRP 回傳發起者。若無實體硬體,StartIo、ISR、DPC 可能不存在。

核心例程、資料結構與函數前綴

DriverEntry 關鍵初始化

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 陣列派遣函數。

重要資料結構

  • DRIVER_OBJECT:代表核心載入的驅動映像。
  • DEVICE_OBJECT:硬體/虛擬硬體抽象,處理 I/O 請求,極為重要。
  • IRP:I/O 請求封包。
  • IO_STACK_LOCATION:IRP 堆疊位置,含參數與控制資訊。

切勿混淆驅動物件與裝置物件。

核心函數前綴分類

前綴類別
Ex執行支援
Hal硬體抽象層
IoI/O 管理器 (含 PnP)
Ke核心
Mm記憶體管理器
Ob物件管理器
Po電源管理
Ps處理序結構
Rtl執行期程式庫
Zw其他系統服務
CcCache 管理
FsRtl檔案系統執行期程式庫

WinDbg 實戰除錯

環境建置

  • 本機安裝 WinDbg,設定符號路徑:SRV*c:\symbols*https://msdl.microsoft.com/download/symbols
  • 遠端機 (VMware) 修改 boot.ini 加入 /debug /debugport=com1 /baudrate=115200
  • 虛擬序列埠採命名管道模式,WinDbg 透過 Kernel Debug 連線

基本操作

bu sioctl!DriverEntry   ; 延遲設定中斷點
g                       ; 執行至中斷點
bl                      ; 列出中斷點
dv / dt                 ; 檢視變數/資料結構
!pcr / !process         ; 取得處理序/執行緒核心物件位址
dt -r1 _eprocess 81bef448

善用 dt 檢視結構體細節,結合原始碼單步追蹤 (F10/F11),快速掌握驅動行為。

結語

本章為驅動開發入門關鍵,建議通讀參考書第 2-5 章,重點攻克同步機制等新概念。驅動程式開發如學習組合語言,初期艱澀,拆解問題、循序漸進終將豁然開朗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved