Windows 10驱动开发入门(一):环境搭建

驱动的开发对于初学者来说是不友好的,我们不知道怎么入手,从哪里入门。对于初学者来说束手无策,特别是碰到一个很简单的问题,都不知道怎么解决,这一系列的教程,就是用来排除这些障碍。

大部分的驱动开发教程都会先给我们把文档和demo给我们贴出来:

Windows驱动程序入门: Windows 驱动程序入门 - Windows drivers | Microsoft Docs

Github: https://github.com/Microsoft/Windows-driver-samples

但这对于初学者来说,一开始并没有什么用,因为看不懂。我们还是按照之前有一定的编程基础,来进入驱动的开发。假设大家已经安装了vs2019或者更高版本的vistual studio。先开发一个Hello World的驱动程序,把驱动程序安装到测试机上,看发生了什么。我们先不管里面的逻辑原理是什么,先依葫芦画瓢,整出第一个Hello World的demo。

WDK(Windows Driver Kit) 安装

安装WDK也是比较简单的事情,在Vistual studio Install上找到Windows Driver Kit ,进行安装,安装完成了以后会出现Windows Driver Kit已经打钩了。

在这里插入图片描述

编写HelloWDK

新建一个工程,选择Empty WDM Driver项目,新建driver.cpp文件,编写如下代码:

在这里插入图片描述

// driver.cpp
#include <ntddk.h>

extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject);

extern "C"  NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
    
    
	DbgPrint("[GO2CODING_Driver] DriverEntry\n");
	NTSTATUS status = STATUS_SUCCESS;
	pDriverObject->DriverUnload = DriverUnload;

	return status;
}

extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
    
    
	DbgPrint("[GO2CODING_Driver] DriverUnload\n");

	return;
}

这时候编译会出错,

error C2220: 以下警告被视为错误
warning C4100: “pRegPath”: 未引用的形参
warning C4100: “pDriverObject”: 未引用的形参

我们还需要如下的设置:

1.配置属性 - C/C++ -常规 中 将警告视为错误 设置为 否

2.配置属性 - Driver Signing - General 中 Sign Mode 设置为 Off。

3 .配置属性 -Inf2cat - run Inf2cat 设置为 否。

这样编译成功后,生成HelloWDM.infHelloWDM.sys文件。第一个demo也就完成了。

测试虚拟机

在做驱动的时候,并不像以前开发的应用程序那样,最好不要直接在本机上测试,我们需要一台windows 10 的虚拟机,虚拟机的安装方式可以参考相关的教程。

在这里插入图片描述
我们还需要驱动开发的相关工具,包含DebugViewDriverMonitorIRPTraceWinObjDeviceTreeDiskViewDriverManagerEzDriverInstaller,可以在这里进行下载。放到测试机上。

测试机在正常的模式下,是无法安装windows没有签名的驱动,我们需要把测试机变为不需要签名验证。

shift重启测试机。

在这里插入图片描述
进入这个界面,选择 疑难解答->启动设置->重启。重新进入系统,在如下的页面中按 7 启动windows。

在这里插入图片描述
重启完后,把编译好的HelloWDK放到测试机上,进入设备管理(电脑右键->管理),添加过时硬件。

在这里插入图片描述

一路下一步到底,直到出现 从磁盘安装,选择安装的路径到刚才拷贝的路径下。

在这里插入图片描述

在安装驱动之前,我们先以管理员的身份打开debugview,在Capture选择如下,等待着log的输出。
在这里插入图片描述

安装驱动,会 出现如下的提示,选择始终安装。

在这里插入图片描述
提示安装完成。

在这里插入图片描述

在设备管理上出现了,如下的新设备。

在这里插入图片描述
同时在debugview下,我们可以看到如下的log

在这里插入图片描述
这个log对于我们来说,意义太重大了,说明我们不仅仅把驱动安装成功了,还打印出了日志,简直相当于调试了,我们的心安了不少。

HelloWDK.inf的内容如下:

;; The Win2K DDK documentation contains an excellent INF reference.

;--------- Version Section ---------------------------------------------------

[Version]
Signature="$CHICAGO$"
Provider=Go2Coding_Device
DriverVer=11/1/2007,3.0.0.3

; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.

Class=Go2CodingDevice
ClassGUID={
    
    EF2962F0-0D55-4bff-B8AA-2221EE8A79B1}
CatalogFile=HelloWDK.cat

;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

; These sections identify source disks and files for installation. They are
; shown here as an example, but commented out.

[SourceDisksNames]
1 = "HelloWDK",Disk1,,

[SourceDisksFiles]
HelloWDK.sys = 1,,

;--------- ClassInstall/ClassInstall32 Section -------------------------------

; Not necessary if using a standard class

; 9X Style
[ClassInstall]
Addreg=Class_AddReg

; NT Style
[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-5"

;--------- DestinationDirs Section -------------------------------------------

[DestinationDirs]
YouMark_Files_Driver = 10,System32\Drivers

;--------- Manufacturer and Models Sections ----------------------------------

[Manufacturer]
%MfgName%=Mfg0,ntamd64

[Mfg0]

; PCI hardware Ids use the form
; PCI\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd
;改成你自己的ID
%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899

;---------- DDInstall Sections -----------------------------------------------
; --------- Windows 9X -----------------

; Experimentation has shown that DDInstall root names greater than 19 characters
; cause problems in Windows 98

[Mfg0.ntamd64]
%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899

[YouMark_DDI]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_9X_AddReg

[YouMark_9X_AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,DeviceIoControl.sys
HKR, "Parameters", "BreakOnEntry", 0x00010001, 0

; --------- Windows NT -----------------

[YouMark_DDI.NT]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_NT_AddReg

[YouMark_DDI.NT.Services]
Addservice = HelloWDK, 0x00000002, YouMark_AddService

[YouMark_AddService]
DisplayName = %SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\HelloWDK.sys

[YouMark_NT_AddReg]
HKLM, "System\CurrentControlSet\Services\HelloWDK\Parameters",\
"BreakOnEntry", 0x00010001, 0


; --------- Files (common) -------------

[YouMark_Files_Driver]
HelloWDK.sys

;--------- Strings Section ---------------------------------------------------

[Strings]
ProviderName="Go2Coding."
MfgName="Go2Coding Soft"
DeviceDesc="Hello World HelloWDK!"
DeviceClassName="Go2Coding_Device"
SvcDesc="Go2Coding"

如果需要 demo的源代码,可以私信我。

猜你喜欢

转载自blog.csdn.net/weixin_40425640/article/details/125259953#comments_28549300