文章目錄
一、環境搭建
- 下載安裝Visual Studio S2019、WDK https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
- 在控制面板中確保SDK與WDK版本是否一致。(如果SDK和WDK版本不對應則無法編譯)
二、創建KMDF項目
- 創建一個空的Kenel Mode Driver項目
- 爲項目添加一個c文件,命名爲「MyDriver.c」,粘貼以下demo代碼
#include <ntddk.h> #include <wdf.h> DRIVER_INITIALIZE DriverEntry; EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd; //卸載例程(回調函數) VOID unLoad(_In_ struct _DRIVER_OBJECT* DriverObject) { KdPrint(("驅動卸載...")); } // NTSTATUS CreateMyDevice(PDRIVER_OBJECT DriverObject) { NTSTATUS status; UNICODE_STRING devName; //內核模式才能訪問此名稱 UNICODE_STRING symLinkName; //供用戶模式下訪問的名稱 //初始化設備名稱(注意,若名稱格式不對將藍屏) RtlInitUnicodeString(&devName, L"\\Device\\myDevice"); //創建設備 PDEVICE_OBJECT pDevObj;//用來接收創建設備的結果 status = IoCreateDevice ( DriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, //是否獨佔 OUT & pDevObj ); if (!NT_SUCCESS(status)) { if (status == STATUS_INSUFFICIENT_RESOURCES) { KdPrint(("資源不足 STATUS_INSUFFICIENT_RESOURCES")); } if (status == STATUS_OBJECT_NAME_EXISTS) { KdPrint(("對象名已存在 STATUS_OBJECT_NAME_EXISTS")); } if (status == STATUS_OBJECT_NAME_COLLISION) { KdPrint(("對象名有衝突 STATUS_OBJECT_NAME_COLLISION")); } KdPrint(("設備創建失敗...")); return status; } KdPrint(("設備創建成功...")); //創建符號鏈接名稱 (注意,若名稱格式不對將藍屏) RtlInitUnicodeString(&symLinkName, L"\\??\\chy888"); //綁定符號鏈接至設備名稱,用於暴露給用戶模式下的程序訪問 status = IoCreateSymbolicLink(&symLinkName, &devName); if (!NT_SUCCESS(status)) { IoDeleteDevice(&pDevObj); } return status; } NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { KdPrint(("加載驅動...")); //添加卸載例程後,驅動就可以在內存中反覆加載卸載 DriverObject->DriverUnload = unLoad; //創建設備 NTSTATUS status = CreateMyDevice(DriverObject); return status; }
三、編譯
- VS2019需禁用Spectre緩解
- 在項目屬性 - Driver Settings 中設置驅動要運行的目標系統環境,然後【編譯】。
- 編譯報錯「警告被視爲錯誤」的解決方案:項目-屬性-C/C+±常規-將警告視爲錯誤-否
- 編譯成功,生成了以下三個文件
四、搭建雙機調試環境
五、運行
5.1 安裝DbgView以捕獲DbgPrint()信息
- 在被調試OS上安裝DbgView.exe,用於捕獲DbgPrint()信息 (CSDN下載 or 官網下載)
- 以管理員身份運行,勾選Capture Kernel選項
- 如果被調試的是Win10或Win7,則需要先新建註冊表項,然後DbgView才能捕獲信息
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中打開或者創建子項Debug Print Filter,然後新建一個名爲“DEFAULT”的DWORD類型的鍵,值爲0xF
- 可以寫爲批處理bat,以管理員身份運行,最後記得重啓OS
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter" /V DEFAULT /T REG_DWORD /D 0xF /F
pause
5.3 禁用驅動強制簽名
(1) Win10的禁用方式
- 第一步:在開機高級選項中禁用強制簽名,參考:win10怎麼安裝沒有數字簽名的驅動
- 第二步:以管理員權限打開命令行工具,輸入以下3行命令,然後重啓電腦,進入測試模式。
bcdedit.exe /set nointegritychecks on
BCDEDIT -SET LOADOPTIONS DISABLE_INTEGRITY_CHECKS
BCDEDIT -SET TESTSIGNING ON
(2) Win7的禁用方式
- Win7 x86 與 Win7 x64的方式不相同
- 參考:https://zhidao.baidu.com/question/541870311.html
5.2 安裝並運行驅動程序
- 輸入命令
devmgmt.msc
打開設備管理器,操作 - 添加過時硬件 - 選擇*.inf文件 - 安裝