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

Windows 2000 WDM 驅動程式開發:架構、IRP 處理與使用者模式通訊完整範例

     編輯:關於VC++

Windows Driver Model (WDM) 為跨平台(Win98/Win2K)驅動架構,支援 USB、IEEE 1394、ACPI 等新標準。本文解析 WDM 分層架構(FDO/PDO)、DriverEntry 註冊、IRP 分派、DeviceIoControl 使用者模式通訊,並提供極簡驅動與用戶端完整代碼。

WDM 核心概念

  • PDO (Physical Device Object):總線驅動建立,代表實體硬體,唯一。
  • FDO (Functional Device Object):功能驅動建立,代表硬體功能介面,一個 PDO 可對應多個 FDO。
  • IRP (I/O Request Packet):核心與驅動、驅動之間通訊基本單位。
  • GUID 識別:128-bit GUID 取代傳統驅動名稱/ID 識別裝置介面。

驅動程式骨架

DriverEntry

NTSTATUS DriverEntry(PDRIVER_OBJECT DrvObj, PUNICODE_STRING RegPath) {
    DrvObj->DriverExtension->AddDevice = AddDevice;
    DrvObj->MajorFunction[IRP_MJ_CREATE]         = ReqCreate;
    DrvObj->MajorFunction[IRP_MJ_CLOSE]          = ReqClose;
    DrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ReqControl;
    DrvObj->MajorFunction[IRP_MJ_PNP]            = ReqPnp; // 必須處理 PnP IRP
    DrvObj->DriverUnload = DrvUnload;
    return STATUS_SUCCESS;
}

AddDevice 建立 FDO 並附加裝置堆疊

NTSTATUS AddDevice(PDRIVER_OBJECT DrvObj, PDEVICE_OBJECT PDO) {
    PDEVICE_OBJECT fdo;
    IoCreateDevice(DrvObj, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo);
    fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;
    IoAttachDeviceToDeviceStack(fdo, PDO); // 附加至堆疊
    return STATUS_SUCCESS;
}

IRP_MJ_DEVICE_CONTROL 處理使用者控制碼

NTSTATUS ReqControl(PDEVICE_OBJECT DevObj, PIRP Irp) {
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
    ULONG code = irpSp->Parameters.DeviceIoControl.IoControlCode;
    NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;

    switch (code) {
        case HELLOWDM_IOCTL_HELLO:
            DbgPrint("Hello from WDM.\n");
            status = STATUS_SUCCESS;
            break;
    }
    return CompleteRequest(Irp, status, 0);
}

使用者模式客戶端

  1. SetupDiGetClassDevs(&GUID, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE) 取得裝置資訊集。
  2. SetupDiEnumDeviceInterfaces 列舉介面。
  3. SetupDiGetDeviceInterfaceDetail 兩次呼叫取得符號連結名稱(\\.\xxxx#{GUID})。
  4. CreateFile 開啟裝置,DeviceIoControl 發送控制碼。
  5. SetupDiDestroyDeviceInfoList 釋放資源。

開發注意事項

  • 嚴禁使用組合語言(跨平台需求)。
  • 必須正確處理 IRP_MJ_PNP(IRP_MN_START_DEVICE、IRP_MN_REMOVE_DEVICE 等)並向下傳遞。
  • 範例在 Win98 + 98 DDK + VC6 + SoftICE 4.0 開發除錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved