驱动的开发对于初学者来说是不友好的,我们不知道怎么入手,从哪里入门。对于初学者来说束手无策,特别是碰到一个很简单的问题,都不知道怎么解决,这一系列的教程,就是用来排除这些障碍。
大部分的驱动开发教程都会先给我们把文档和demo给我们贴出来:
Windows驱动程序入门: Windows 驱动程序入门 - Windows drivers | Microsoft Docs
Github: https://github/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.inf
和HelloWDM.sys
文件。第一个demo也就完成了。
测试虚拟机
在做驱动的时候,并不像以前开发的应用程序那样,最好不要直接在本机上测试,我们需要一台windows 10 的虚拟机,虚拟机的安装方式可以参考相关的教程。
我们还需要驱动开发的相关工具,包含DebugView
,DriverMonitor
,IRPTrace
,WinObj
,DeviceTree
,DiskView
,DriverManager
,EzDriverInstaller
,可以在这里进行下载。放到测试机上。
测试机在正常的模式下,是无法安装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的源代码,可以私信我。
更多推荐
Windows 10驱动开发入门(一):环境搭建
发布评论