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

Windows 驅動開發核心 API 速查:DriverEntry、設備創建、符號鏈接與清理

     編輯:關於C語言

驅動入口:DriverEntry

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,   // 系統創建的驅動對象
    IN PUNICODE_STRING RegistryPath    // 服務鍵路徑
);

職責:初始化驅動對象、創建設備對象、註冊分發函數、創建符號鏈接。

創建設備對象:IoCreateDevice

NTSTATUS IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG           DeviceExtensionSize, // 設備擴展區大小
    IN PUNICODE_STRING DeviceName,          // 可選,NULL 表無名設備
    IN DEVICE_TYPE     DeviceType,          // FILE_DEVICE_XXX
    IN ULONG           DeviceCharacteristics, // FILE_XXX 特性標誌
    IN BOOLEAN         Exclusive,           // TRUE 通常
    OUT PDEVICE_OBJECT *DeviceObject        // 輸出創建的設備對象
);

創建符號鏈接:IoCreateSymbolicLink

NTSTATUS IoCreateSymbolicLink(
    IN PUNICODE_STRING SymbolicLinkName, // "\??\MyDevice" (內核)
    IN PUNICODE_STRING DeviceName        // "\Device\MyDevice"
);

命名空間差異:

  • 內核模式:\??\ 前綴 (如 \??\C:)
  • 用戶模式:\\.\ 前綴 (如 \\.\C:)

清理資源對應函數

操作API參數
刪除符號鏈接IoDeleteSymbolicLinkIN PUNICODE_STRING SymbolicLinkName
刪除設備對象IoDeleteDeviceIN PDEVICE_OBJECT DeviceObject

典型 DriverEntry 骨架

NTSTATUS DriverEntry(PDRIVER_OBJECT drv, PUNICODE_STRING reg) {
    NTSTATUS status;
    PDEVICE_OBJECT devObj = NULL;
    UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\MyDrv");
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\MyDrv");

    // 1. 創建設備
    status = IoCreateDevice(drv, 0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &devObj);
    if (!NT_SUCCESS(status)) return status;

    // 2. 設置分發函數
    for (int i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
        drv->MajorFunction[i] = DispatchPassThrough;
    drv->DriverUnload = Unload;

    // 3. 創建符號鏈接
    status = IoCreateSymbolicLink(&symLink, &devName);
    if (!NT_SUCCESS(status)) {
        IoDeleteDevice(devObj);
        return status;
    }
    return STATUS_SUCCESS;
}

VOID Unload(PDRIVER_OBJECT drv) {
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\MyDrv");
    IoDeleteSymbolicLink(&symLink);
    IoDeleteDevice(drv->DeviceObject);
}

關鍵提示

  • DeviceExtension 用於存儲設備上下文 (隊列、鎖、狀態等)
  • 符號鏈接失敗必須回滾刪除設備對象
  • Exclusive=TRUE 防止用戶模式並發打開導致同步問題
  • WDK 文檔常模糊,結合 Windbg 調試與匯編分析必不可少
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved