在visual studio2022中,若在单个组件中找不到Windows Driver Kit (WDK)选项,可通过提升vs版本解决,在首次选择时选择WDM
创建好项目在Source Files文件夹中创建一个test.c文件,并输入以下测试代码:
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UNREFERENCED_PARAMETER(pDriverObject);
DbgPrint("Goodbye!\n");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
UNREFERENCED_PARAMETER(pRegistryPath);
pDriverObject->DriverUnload = DriverUnload;
DbgPrint("Hello, World!\n");
return STATUS_SUCCESS;
}
构建运行时遇到以下问题:
主要原因是window sdk和WDK未安装成功,winsdksetup.exe是window sdk的安装程序,安装成功侯在程序中会有Windows Software Development Kit - Windows 10.0.22621.3233;wdksetup.exe是WDK安装程序。
接下来清理,重新生成报错:Device driver does not install on any devices, use primitive driver if this is intended.
程序自动生成的MyDriver1.inf文件如下:
;
; MyDriver1.inf
;
[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
Provider=%ManufacturerName%
DriverVer=
CatalogFile=MyDriver1.cat
PnpLockdown=1
[DestinationDirs]
DefaultDestDir = 13
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$.10.0...16299 ; %13% support introduced in build 16299
[Standard.NT$ARCH$.10.0...16299]
[Strings]
ManufacturerName="<Your manufacturer name>" ;TODO: Replace with your manufacturer name
DiskName="MyDriver1 Source Disk"
原因:INF
文件目前缺少 Service Install
部分,这是导致 Device driver does not install on any devices
错误的主要原因。你需要修改它,使其可以安装一个 软件驱动程序(Software-Only Driver),即 Primitive Driver。
修改后的MyDriver1.inf文件如下:
;
; MyDriver1.inf - INF file for installing a software-only kernel driver
;
[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
Provider=%ManufacturerName%
DriverVer=01/01/2025,1.0.0.0
CatalogFile=MyDriver1.cat
PnpLockdown=1
[DestinationDirs]
DefaultDestDir = 12 ; SYSTEM32\DRIVERS 目录
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
MyDriver1.sys = 1,,
[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$.10.0...16299
[Standard.NT$ARCH$.10.0...16299]
%MyDriver1.DeviceDesc% = MyDriver1_Install, Root\MyDriver1
[MyDriver1_Install]
CopyFiles = MyDriver1.CopyFiles
[MyDriver1.CopyFiles]
MyDriver1.sys
[MyDriver1_Install.Services]
AddService = MyDriver1, 0x00000002, MyDriver1_Service_Inst
[MyDriver1_Service_Inst]
DisplayName = %MyDriver1.DeviceDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START(手动启动)
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
LoadOrderGroup = Base
ServiceBinary = %12%\MyDriver1.sys ; 12 = SYSTEM32\DRIVERS 目录
[Strings]
ManufacturerName="YourManufacturer"
DiskName="MyDriver1 Source Disk"
MyDriver1.DeviceDesc="MyDriver1 Kernel Driver"
关键修改点
添加
Service Install
部分MyDriver1_Install.Services
确保驱动被正确注册为 内核模式驱动。ServiceType = 1
(代表内核驱动)。StartType = 3
(代表手动启动,可以用sc start
启动)。ServiceBinary = %12%\MyDriver1.sys
让系统知道驱动文件存放的位置。
定义设备
Root\MyDriver1
让 Windows 识别它是一个 软件驱动程序(不依赖硬件设备)。这是关键修复,否则 Windows 10+ 认为你的驱动没有设备,导致安装失败。
修正
DestinationDirs
你的驱动
.sys
文件应该放在SYSTEM32\DRIVERS
目录,而不是13
(用户模式 DLL 目录)。DefaultDestDir = 12
(12 代表C:\Windows\System32\drivers
)
编译后执行报错:
解决方法
1. 手动加载驱动
你需要使用 sc
(Service Control Manager)或者 pnputil
命令手动加载驱动:
方法 1:使用 sc
命令
管理员模式打开 CMD。
创建驱动服务
sc create MyDriver1 type= kernel start= demand binPath= "E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys"
type= kernel
表示这是一个内核驱动。start= demand
表示手动启动。
启动驱动
sc start MyDriver1
查看驱动状态
sc query MyDriver1
停止并删除驱动 如果需要卸载驱动:
sc stop MyDriver1 sc delete MyDriver1
方法 2:使用 pnputil
安装驱动
如果你有 INF
文件:
pnputil /add-driver MyDriver1.inf /install
然后使用 sc start MyDriver1
启动驱动
遇到问题:
sc start MyDriver1
[SC] StartService 失败 577:
Windows 无法验证此文件的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。
这个错误表明 你的驱动未签名,或者 Windows 不允许加载未签名的驱动。从 Windows 10 及以后版本(尤其是 64 位 Windows),默认不允许加载未签名的内核驱动。
方法 1:启用测试模式(推荐用于开发调试)
如果你的驱动只是用来开发和测试,你可以启用 测试签名模式,让 Windows 允许加载未签名的驱动。
步骤
打开 CMD(管理员模式),运行以下命令:
bcdedit /set testsigning on
你应该会看到:
操作成功完成。
重启计算机
shutdown /r /t 0
计算机重启后,你会看到桌面右下角显示
测试模式
,表示 Windows 允许加载未签名的驱动。尝试重新启动驱动
sc start MyDriver1
方法 2:临时禁用驱动签名强制
如果你不想长期启用测试模式,可以在每次启动时临时禁用驱动签名验证。
步骤
重启电脑,在 启动 Windows 时 按
F8
(部分新电脑可能需要Shift + F8
)。进入 高级启动选项,选择 "禁用驱动程序强制签名"(
Disable Driver Signature Enforcement
)。启动后,你可以运行:
sc start MyDriver1
以管理员身份运行 PowerShell:
按Win + X
,选择 "Windows Terminal (管理员)" 或 "PowerShell (管理员)"。
Add-MpPreference -ExclusionPath "E:\WorkSpace\TestProject\MyDriver1\x64\Debug\"
验证是否添加成功:
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
如果返回你的路径,说明已成功添加。
重新加载驱动:
安装驱动:sc create MyDriver1 type= kernel start= demand binPath= "E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys"
启动驱动:sc start MyDriver1
查看驱动状态:sc query MyDriver1
执行完还是报错:
无法删除文件“E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys”。对路径“E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys”的访问被拒绝。
停止并删除驱动:
sc stop MyDriver1
sc delete MyDriver1
然后尝试删除文件:
del /f /q E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys
报错:An error occurred while attempting to sign: E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys