驅動開發:第一個驅動程序

一、環境搭建

二、創建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的禁用方式

5.2 安裝並運行驅動程序

  • 輸入命令devmgmt.msc打開設備管理器,操作 - 添加過時硬件 - 選擇*.inf文件 - 安裝
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章