Windows驱动开发(1)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环境搭建相关推荐
- Windows驱动开发入门 -- HelloWorld
一.驱动开发环境搭建 在Download the Windows Driver Kit (WDK)页面中下载最新版本的Visual Studio和WDK进行安装.如果要下载老版本可以到Other WD ...
- [LINUX]LINUX驱动开发最简环境搭建(适用于新手)
LINUX驱动开发环境搭建 一. 前言 二.系统环境 Ubuntu VMWare{非必选} 三.开发环境搭建 1.用于简单学习(Header) 2.用于复杂驱动开发(源码树) a. 基本包 b. 内核 ...
- windows驱动开发环境搭建以及helloworld
文章目录 前言 编译环境-WDK的安装 搭建测试驱动的虚拟机 win11虚拟机 win10虚拟机 在测试机器上运行驱动 修改注册表-显示调试信息 上面驱动代码含义 测试证书签名 其他 旧版本的visu ...
- Windows编程—Windows驱动开发环境搭建
文章目录 前言 步骤 步骤一 步骤二 步骤三 连接测试 步骤四 步骤五 总结 前言 作为一个编写Windows程序的开发人员,对Windows驱动开发 并非必需要掌握,但是掌握 Windows驱动开发 ...
- Windows驱动开发环境搭建:VS2013+WDK8.1
你的Windows驱动开发环境之所以搭建不成功,是因为你没有看这篇博客 1.安装包准备 Visio Studio2013: https://pan.baidu.com/s/1P77yeSKuE7mWl ...
- 配置windows驱动开发环境
配置windows驱动开发环境 撰写:jiftle 时间:2011-09-09 14:30 windows驱动开发需要wd ...
- Windows驱动开发学习笔记(一)—— 环境配置第一个驱动程序
Windows驱动开发学习笔记(一)-- 环境配置&第一个驱动程序 环境配置 第一个驱动程序 环境配置 安装VS2010:https://pan.baidu.com/s/1uZWWxCtB60 ...
- VS2019 windows驱动开发环境配置
配置Windows驱动开发环境 VS2019 下载VS2019 下载链接 https://visualstudio.microsoft.com/zh-hans/downloads/ 选择你所需要的开发 ...
- windows驱动开发3:第一个驱动及调试
一.创建项目 新建一个以Kernel Mode Driver, Empty(KMDF)为模板的驱动项目,项目名称HelloDriver,在项目中新建一个hello.cpp文件作为驱动入口文件,写一点简 ...
- windows驱动开发-WDF编程
文章目录 前言 WDF编程前的准备工作 WDF编程 创建驱动对象 创建设备对象 设备对象的回调函数 链表操作 驱动的测试代码 其他 前言 注:本文的完整代码见仓库 18-WDF-reflect 代码参 ...
最新文章
- 《R语言实战》读书笔记--第一章 R语言介绍
- MATLAB读取二进制文件------fread
- 前端学习(3068):vue+element今日头条管理-上午总结
- C 远程登录linux,远程登录Linux主机进行C编程的操作方法简述.doc
- 从Google搜索联想到了jQuery
- mysql:赋予用户权限、查看及修改端口号
- Office Web Apps开放测试
- poj2914无向图的最小割
- mysql正则时间格式_用正则表达式校验时间格式的正确性
- 返利网app android版
- 基于MES的生产车间管理信息系统
- 浅谈加密算法 aes
- 实时计算与SparkSteaming的对比
- 郑州财经学院第54次全国计算机,郑州财经学院第二期教师博士班开班
- 解决【无法对套接字执行操作,因为系统缺少足够的缓冲区空间,或者因为系统上的队列已满127.0.0.1:8086】问题
- 遗传算法GA算法思路及其C++实现
- 【设计模式】一:六大基本原则详解
- c语言程序0xc0000005解决方案,C语言调试时出现”Unhandled exception 0xC0000005;Access Violation“,是怎么回事呢?...
- 关于vue3中无config文件
- oppo k7x和oppo k7哪个好 oppo k7x和oppo k7参数对比
热门文章
- kindle外源文件封面图片修复方法
- 敏捷项目管理之Scrum教练篇
- Windows10在PowerShell中启动Redis
- 【云原生 | 从零开始学istio】五、istio灰度发布以及核心资源
- WF4.0 基础篇 (二十六) Interop调用WF3.X的Activity
- sess.run(tf.global_variables_initializer()) 做了什么
- 【蓝桥杯C++练习】每日一练03-编程题
- 华为p40配置鸿蒙系统,华为P40系列配置汇总:IMX700五摄+首发鸿蒙OS?
- 12N60-ASEMI高压MOS管12N60
- 进来教你如何解决端口被占用问题