当前位置: 首页 > news >正文

visual studio 2022的windows驱动开发

在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"

关键修改点

  1. 添加 Service Install 部分

    • MyDriver1_Install.Services 确保驱动被正确注册为 内核模式驱动

    • ServiceType = 1(代表内核驱动)。

    • StartType = 3(代表手动启动,可以用 sc start 启动)。

    • ServiceBinary = %12%\MyDriver1.sys 让系统知道驱动文件存放的位置。

  2. 定义设备

    • Root\MyDriver1 让 Windows 识别它是一个 软件驱动程序(不依赖硬件设备)

    • 这是关键修复,否则 Windows 10+ 认为你的驱动没有设备,导致安装失败。

  3. 修正 DestinationDirs

    • 你的驱动 .sys 文件应该放在 SYSTEM32\DRIVERS 目录,而不是 13(用户模式 DLL 目录)。

    • DefaultDestDir = 12(12 代表 C:\Windows\System32\drivers

编译后执行报错:

解决方法

1. 手动加载驱动

你需要使用 sc(Service Control Manager)或者 pnputil 命令手动加载驱动:

方法 1:使用 sc 命令
  1. 管理员模式打开 CMD

  2. 创建驱动服务

    sc create MyDriver1 type= kernel start= demand binPath= "E:\WorkSpace\TestProject\MyDriver1\x64\Debug\MyDriver1.sys"
    • type= kernel 表示这是一个内核驱动

    • start= demand 表示手动启动

  3. 启动驱动

    sc start MyDriver1

  4. 查看驱动状态

    sc query MyDriver1

  5. 停止并删除驱动 如果需要卸载驱动:

    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 允许加载未签名的驱动。

步骤
  1. 打开 CMD(管理员模式),运行以下命令:

    bcdedit /set testsigning on

    你应该会看到:

    操作成功完成。

  2. 重启计算机

    shutdown /r /t 0

    计算机重启后,你会看到桌面右下角显示 测试模式,表示 Windows 允许加载未签名的驱动。

  3. 尝试重新启动驱动

    sc start MyDriver1


方法 2:临时禁用驱动签名强制

如果你不想长期启用测试模式,可以在每次启动时临时禁用驱动签名验证

步骤
  1. 重启电脑,在 启动 Windows 时F8(部分新电脑可能需要 Shift + F8)。

  2. 进入 高级启动选项,选择 "禁用驱动程序强制签名"Disable Driver Signature Enforcement)。

  3. 启动后,你可以运行:

    sc start MyDriver1

  1. 以管理员身份运行 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

 

http://www.dtcms.com/a/106629.html

相关文章:

  • C# System.Text.Json 中 JsonIgnoreCondition 使用详解
  • Linux2 CD LL hostnamectl type mkdir dudo
  • 跨系统平台实践:在内网自建kylin服务版系统yum源
  • 面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
  • AI提示词:好评生成器
  • 鸿蒙NEXT小游戏开发:数字华容道
  • 详解相机的内参和外参,以及内外参的标定方法
  • 背包DP总结
  • GO语言 使用protobuf
  • 【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【代码篇】A题解题全流程(持续更新)
  • 全国产ADC 16bit 2通道1G采样 双FMC子板
  • C++多继承
  • 【抓包工具】win 10 / win 11:Charles 下载、安装、配置(快捷方式、默认端口、登录、https 证书)
  • 【git】VScode修改撤回文件总是出现.lh文件,在 ​所有 Git 项目 中全局忽略特定文件
  • MacOS 的 AI Agent 新星,本地沙盒驱动,解锁 macOS 操作新体验!
  • 地表-地下水系统交互模拟关键技术突破:SWAT-MODFLOW耦合模型构建、验证及多情景预测研究
  • 离线语音识别 ( 小语种国家都支持)可定制词组
  • 项目管理管什么?理什么?
  • 《云端都市:云计算如何重塑未来城市形态》
  • spikingjelly:使用单层全连接 SNN 识别 MNIST
  • Java UnsupportedOperationException 深度解析及解决方案
  • 在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
  • Python从入门到精通4:计算机网络及TCP网络应用程序开发入门指南
  • JuiceFS vs HDFS,最简单的 JuiceFS 入门
  • Muduo网络库实现 [八] - Acceptor模块
  • 【Harmony OS】TypeScrip基础
  • 小米汽车就 SU7 事故回应六点问题,称「事故车起火并非自燃」、「无法分析车门能否打开」,如何看待?
  • 从头开发一个Flutter插件(二)高德地图定位插件
  • [GESP 202503 二级 T2] 时间跨越
  • Docker 镜像导出与导入:export/import vs save/load