天天看點

Windows驅動開發(1)HelloWorld環境搭建開發環境搭建測試環境建立HelloWorld項目驅動安裝測試

開發環境

Windows Version: 2004 (19041.264)
WDK Version: 10.0.19041.1
SDK Version: 10.0.19041.1
Visual Studio: Community 2019
           

測試環境

Windows 7 SP1 + KMD Manager + DbgView
           

開發環境搭建

參照:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

除了在安裝

VS2019

的時候,選擇

C++桌面開發環境

,裡面自帶一個和目前系統版本一緻的

SDK

,也可以自己修改,但是可能會和系統不相容。

還需要安裝的元件:

MSVC v142 - VS 2019 C++ ARM build tools (v14.25)
MSVC v142 - VS 2019 C++ ARM Spectre-mitigated libs (v14.25)
MSVC v142 - VS 2019 C++ ARM64 build tools (v14.25)
MSVC v142 - VS 2019 C++ ARM64 Spectre-mitigated libs (v14.25)
MSVC v142 - VS 2019 C++ x64/x86 build tools (v14.25)
MSVC v142 - VS 2019 C++ x64/x86 Spectre-mitigated libs (v14.25)
           

v14.25

根據在所有元件裡看到最新版本的為準,做一下适當調整。

然後下載下傳适用

2004

WDK

安裝檔案,輕按兩下之後,需要聯網下載下傳安裝

WDK

相關檔案和

VS2019

驅動開發插件,根據提示點過去就可以。

測試環境

啟動的時候,需要按

f8

關閉驅動簽名驗證,也可以參考這篇文章添加一個關閉驅動簽名檢查的啟動項。

KMD Mananger

工具用來管理核心驅動服務(注冊、啟動、停止、解除安裝),

DbgView

用來檢視驅動列印資訊,這兩個工具都需要管理者權限運作。

建立HelloWorld項目

建立一個以

Kernel Mode Driver, Empty(KMDF)

為模闆的驅動項目,項目名稱

HelloDriver

,在項目中建立一個

hello.c

檔案作為驅動入口檔案,寫一點簡單的代碼做測試:

///
/// @file hello.c
/// @author REInject
/// @date 2020-05-31
///

#include <ntddk.h>

// 提供一個Unload 函數隻是為了讓這個程式能夠動态解除安裝,友善調試
VOID DriverUnload(PDRIVER_OBJECT driver)
{
	// 但是實際上我們什麼都不做,隻列印一句話
	DbgPrint("hello: Our driver is unloading...\r\n");
}

// DriverEntry,入口函數。相當于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
	// 這是核心子產品入口,可以在這裡寫入我們想寫的東西
	DbgPrint("hello: my salary!");

	// 設定一個解除安裝函數,便于這個函數退出
	driver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}
           

這時候如果直接運作,預設生成的驅動檔案是

Win10

平台的,而且基本上會編譯失敗,需要改一些配置資訊(Debug-x64):

  • 調整

    屬性 - C/C++ - 正常

    ,警告等級 4,将警告視為錯誤 否;
  • 連結器 - 正常

    ,警告視為錯誤 否;
  • Driver Settings - General

    Target OS Version

    改成

    Windows 7

    Target Platform

    改為

    Desktop

  • Stampinf

    裡所有 是 的地方改成 否;
  • Inf2Cat

    裡所有 是 的地方改成 否;
  • Driver Signing - General

    中的

    Sign Mode

    改為 Off;

改好後,使用

Debug-x64

配置,

Ctrl-B

生成驅動檔案,如果報下面這個錯誤的話:

error 1297: Device driver does not install on any devices, use primitive driver if this is intended.
           

根據官網的描述,如果建立的驅動不是基于裝置的,即通用型核心驅動,則需要删或者改一些東西,如果可以看懂怎麼改就直接改就可以,例如:

原始

inf

中要改的部分:

複制代碼

[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$

[Standard.NT$ARCH$]
%HelloDriver.DeviceDesc%=HelloDriver_Device, Root\HelloDriver ; TODO: edit hw-id

[HelloDriver_Device.NT]
CopyFiles=Drivers_Dir

[Drivers_Dir]
HelloDriver.sys

;-------------- Service installation
[HelloDriver_Device.NT.Services]
AddService = HelloDriver,%SPSVCINST_ASSOCSERVICE%, HelloDriver_Service_Inst
           

改成:

[DefaultInstall.NT$ARCH$]
CopyFiles=Drivers_Dir

[Drivers_Dir]
HelloDirver.sys

;-------------- Service installation
[DefaultInstall.NT$ARCH$.Services]
AddService = HelloDriver,%SPSVCINST_ASSOCSERVICE%, HelloDriver_Service_Inst
           

或者看不懂的,直接删了這個

Inf

檔案就可以了,這個檔案暫時用不到。

重新編譯之後,會在

x64/debug

目錄下生成

HelloDriver.sys

驅動檔案。

驅動安裝測試

打開

win7

,使用

KMD Manager

工具進行注冊啟動停止解除安裝服務,發現有出現

Error Number not found

的錯誤,通過一些測試發現是驅動簽名檢查沒有完全禁用,根據官網給出的資訊,

nointegrity

參數在

win7

上是無效的:

nointegritychecks [ on | off ] Disables integrity checks. Cannot be set when secure boot is enabled. This value is ignored by Windows 7 and Windows 8.
           

每次開機手動

f8

或者使用測試簽名,這樣就正常了:也可以将虛拟機設定為核心測試模式,這樣就不會檢查簽名。

Windows驅動開發(1)HelloWorld環境搭建開發環境搭建測試環境建立HelloWorld項目驅動安裝測試

大功告成,我們已經邁出了第一步。