Windows驱动开发(一)

1. 引言

很难为术语 “驱动程序”提供一个精确的定义。 就最基本的意义而言,驱动程序是一个软件组件,可让操作系统和设备彼此通信。

例如,假设应用程序需要从设备中读取某些数据。 应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。 驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。 当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统会将数据返回至应用程序。

在这里插入图片描述

驱动分为如下几种类型:

  • 设备函数驱动程序

堆栈中直接与设备进行通信的驱动程序称为函数驱动程序。

  • 设备筛选器驱动程序

执行辅助处理的驱动程序称为筛选器驱动程序。

对于软件驱动程序,可以使用两个选项:KMDF,以及传统的 Windows NT 驱动程序模型。
使用 KMDF 和传统 Windows NT 模型可以编写驱动程序,而无需考虑即插即用 (PnP) 和电源管理。 你可以改为专心于驱动程序的首要任务上。
我们的建议是使用 KMDF,尤其是当你已熟悉它时。如果你希望驱动程序与 PnP 和电源管理完全无关,请使用传统 Windows NT 模型。
如果需要编写考虑电源转换或 PnP 事件的软件,则不能使用传统 Windows NT 模型,而必须使用 KMDF。
注意:在极少数情况下,你需要编写注意到 PnP 或电源事件的软件驱动程序,并且驱动程序需要访问无法通过 KMDF 获取的数据,你必须使用 WDM。

2. 实现方式

WDM(Windows Driver Model)和WDF(Windows Driver Framework)都是微软为Windows操作系统提供的驱动程序开发框架。

2.1 WDM(Windows Driver Model)

  • Windows操作系统早期使用的驱动程序开发模型。

  • WDM提供了一种编程接口和规范,使开发人员能够编写与硬件设备交互的驱动程序。

  • WDM驱动程序以核心驱动程序、功能驱动程序和过滤器驱动程序为基础,涵盖了广泛的硬件设备类型。

  • 开发者需要直接操作硬件资源和处理中断等底层细节。

2.2 WDF(Windows Driver Framework)

  • WDF是微软为简化驱动程序开发而引入的新框架。

  • WDF建立在WDM之上,提供了更高级别和抽象的编程模型。

  • WDF包括两个框架:WDF Kernel-Mode Driver Framework(KMDF)和WDF User-Mode Driver Framework(UMDF)。

  • WDF提供了更多的自动化和简化功能,减少了驱动程序开发的复杂性和错误,提高了开发效率和稳定性。

总结来说,WDM是早期的Windows驱动开发模型,需要开发人员直接操作底层硬件资源,而WDF是在WDM之上的高级和抽象的驱动程序开发框架,提供了更简化和自动化的开发方式。使用WDF可以减少驱动程序开发的复杂性并提高开发效率。

3. 示例

3.1 搭建开发环境

Visual Studio 2022 + Windows 11 版本 22H2 WDK

3.2 创建工程

在Visual Studio中选择Visual C++ -> Driver -> Empty WDM Driver,新建一个空的WDM驱动项目,如图:
在这里插入图片描述

3.3 实现

创建源文件Driver.cpp,同时删除用于驱动安装的inf文件。

#include <ntddk.h>VOID
DRIVERUNLOAD(_In_ struct _DRIVER_OBJECT* DriverObject
)
{UNREFERENCED_PARAMETER(DriverObject);DbgPrint("HelloWorld UnLoad");
}// MSDN中提示文件扩展名应该选择.c,而不是.cpp,否则会出现编译错误:无法解析的外部符号 DriverEntry,函数 GsDriverEntry 中引用了该符号。
// 因此,在这里通过extern "C"导出C风格的DriverEntry函数。
extern "C" 
NTSTATUS 
DriverEntry(_In_ PDRIVER_OBJECT  DriverObject,_In_ PUNICODE_STRING RegistryPath
)
{UNREFERENCED_PARAMETER(DriverObject);UNREFERENCED_PARAMETER(RegistryPath);DbgPrint("HelloWorld Load");DriverObject->DriverUnload = DRIVERUNLOAD;return STATUS_SUCCESS;
}

3.4 编译

此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。了解详细信息: https://aka.ms/Ofhn4c

在这里插入图片描述

解决方案:

1)安装对应工具集版本的Spectre缓解库。

在这里插入图片描述

2)关闭幽灵漏洞缓解。

右键【工程属性】->【C/C++】->【代码生成】->【Spectre Mitigation】,选择【Disabled】。

在这里插入图片描述

3.5 安装

1)使用KmdManager进行安装

2)使用系统命令

管理员权限启动命令提示符:

# install
sc create helloworld binPath="C:\Users\Test\Desktop\HelloWorld.sys" type=filesys
# start
sc start helloworld
# stop
sc stop helloworld
# uninstall
sc delete helloworld

如果启动服务报错,请打开测试模式bcdedit -set testsigning on,并重启。

[SC] StartService 失败 577:

Windows 无法验证此文件的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。

可以使用dbgview查看内核消息:

在这里插入图片描述

3.6 调试

步骤:

1.设置主机通信端口

# 开启系统调试
C:\Windows\system32>bcdedit /debug on
操作成功完成。# 设置主机通信端口,生成连接密钥
C:\Windows\system32>bcdedit /dbgsettings net hostip:192.168.91.1 port:60005
Key=2uiemihoo7ya2.u2uwa3l1v2rz.2ge9fbh1z60xk.2i0mkx6wn29uv

2.使用 设备管理器 确定要用于调试的适配器的 PCI 总线、设备和功能编号。 这些值显示在“常规”选项卡的“位置”下的设备管理器中。

在这里插入图片描述

C:\Windows\system32>bcdedit /set "{dbgsettings}" busparams 3.0.0
操作成功完成。

3.重启计算机

4.调试器连接

C:\Users\Netvine>"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=60005,Key=2uiemihoo7ya2.u2uwa3l1v2rz.2ge9fbh1z60xk.2i0mkx6wn29uv

5.windbg调试

# 设置符号路径
.sympath D:\ISO\Release# 设置函数断点
bp HelloWorld!DRIVERUNLOAD
bp HelloWorld!DriverEntry

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/130584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下Git Bash的基本使用

创建版本库 git init 初始化完成后&#xff0c;会在目录下创建一个.git的隐藏目录&#xff0c;用来存放项目信息。 、 添加文件到版本库 在项目目录下新建文件readme.txt&#xff0c;内容为 Git is a version control system Git is a free software This is my first Try …

MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)

老生长谈&#xff0c;MySQL具有开源、支持多语言、性能好、安全性高的特点&#xff0c;广受业界欢迎。 在数据爆炸式增长的年代&#xff0c;掌握一种数据库能够更好的提升自己的业务能力&#xff08;实施工程师&#xff09;。 此系列将会记录我学习和进阶SQL路上的知识&#xf…

Haproxy搭建Web群集

常见的Web集群调度器分为软件和硬件 软件通常使用开源的LVS、Haproxy、Nginx。 * LVS 性能最好&#xff0c;但是搭建相对复杂 * Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;高并发性能没有Haproxy好。 硬件一般使用比较多的是F5、…

postman连接websocket 测试(v8.5.1)

1. postman v8.5版本 以上支持 websocket。 2. 选择websocket请求模块File - New... 3. 输入请求地址, ws:// 控制台输出: 2023-09-12 15:29:23.039 INFO 11592 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet di…

sql注入之高权限注入和文件读写

死在山野的风里&#xff0c;活在自由的梦里 sql注入之高权限注入 高权限注入1.多个网站共享mysql服务器2.MySQL 权限介绍3.注入流程查询所有数据库名称查询表名对应的字段名查询数据 文件读写1.文件读写注入的原理2.文件读写注入的条件3.读取文件4.写入文件 高权限注入 在数据…

学习SpringMvc第三战-利用SpringMvc实现CRUD

目录 一.前期环境搭建 1.替换pom.xml的内容 2.导入配置文件(小编上传资源) 3.修改xml文件 4.点击创建自动生成代码 5.写一个类用于处理页面跳转 二.正式启动SpringMVC的CRUD 1.建立接口&#xff0c;调用自动生成的接口 2.构建分页代码 2.1书写BookMapper.xml中分页的方…

12个最受欢迎的3D打印机械臂【开源|DIY|套件】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 机器人手臂的用途各不相同&#xff0c;但大多数都能够执行拾取和放置任务&#xff0c;而有些则配备用于 CNC 工作、激光雕刻&#xff0c;甚至 3D 打印。 机械臂具有广泛的应用和各个领域&#xff0c;从执行精密手术和进行工…

Kafka3.0.0版本——消费者(分区的分配以及再平衡)

目录 一、分区的分配以及再平衡1.1、消费者分区及消费者组的概述1.2、如何确定哪个consumer来消费哪个partition的数据1.3、消费者分区分配策略 一、分区的分配以及再平衡 1.1、消费者分区及消费者组的概述 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多…

go语言基本操作---六

并发编程 并行&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。 并发&#xff1a;指在同一时刻只能有一条指令执行&#xff0c;但是多个进程指令被快速的轮换执行&#xff0c;使得在宏观上具有多个进程同时执行的效果&#xff0c;但在微观上并不是同时…

python机器人编程——用python实现一个写字机器人

目录 一、前言二、整体框架2.1 系统构成2.2 硬件介绍2.2.1主要组成部分2.2.2机械结构2.2.3驱动及控制主板PS电机驱动原理简介: 2.2.4其余部分 2.3 机器人python程序框架2.3.1通信服务模块2.3.2消息处理模块2.3.3轨迹解析模块2.3.4机械臂逆解模块2.3.5写字板模块 三、机械臂的建…

浅谈基于LoRa通信技术的建筑能耗监测系统及模块

安科瑞 华楠 摘要&#xff1a;本文提出采用LoRa通信技术开发设计建筑能耗监测系统的建议&#xff0c;通过系统&#xff0c;该系统功能完善、界面友好、通信稳定&#xff0c;在建筑能耗监测领域中有较高的推广价值。 关键词&#xff1a;LoRa通信&#xff1b;建筑能耗&#xff…

63、SpringBoot---定制 RestTemplate--消息转化器、拦截器

★ 定制RestTemplate 如要对RestTemplate进行自定义设置&#xff0c;Spring Boot也提供了两种主要方式&#xff1a;▲ 局部式&#xff1a;在调用RestTemplateBuilder构建RestTemplate之前&#xff0c;先调用RestTemplateBuilder的方法对其定制&#xff0c;通过这种方式设置的R…

最新遥感数据与作物模型同化教程

详情点击公众号链接&#xff1a;最新遥感数据与作物模型同化教程一&#xff1a;遥感基础1.遥感平台&#xff08;如无人机&#xff09;与传感器、国内外主要陆地卫星&#xff08;如Landsat、SPOT、HJ、GF&#xff09; 2.遥感基本原理、光谱响应函数、遥感数据处理流程 3.遥感在陆…

华为交换机:STP的详解和试验

前言 为了解决网络冗余链路所产生的问题,IEEE定义了802.1D协议,即生成树协议STP,利用生成树协议可以避免帧在环路中的增生和无限循环,生成树的主要思想是,当两个交换机之间存在多条链路时,通过一定的算法只激活其中最主要的一条链路,而将其他冗余链路阻塞掉变为备用链路,当主链…

【mysql】—— 函数的基本介绍

前言&#xff1a; MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置的函数来进行数据操作和处理。本期&#xff0c;我将给大家介绍的就是关于 “函数” 的相关知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;日期函数 &#…

一个好玩的浏览器插件

背景 最近抽空开发了一个有意思的浏览器插件。背景是我们在开发过程中有时需要做一些测试验证&#xff0c;需要修改请求头字段和响应头字段的内容&#xff0c;有时需要在页面做测试&#xff0c;反复请求同一个接口&#xff0c;并修改一些字段。 如果此时使用nginx做代理转发再…

数据库数据恢复-Oracle数据库truncate的数据恢复案例

Oracle数据库故障&分析&#xff1a; 北京某单位Oracle 11g R2数据库误执行truncate table CM_CHECK_ITEM_HIS&#xff0c;表数据丢失&#xff0c;查询该表时报错。数据库备份无法使用&#xff0c;表数据无法查询。 Oracle数据库Truncate数据的机理&#xff1a;执行Trunca…

element ui 表格组件与分页组件的二次封装

目录 效果图 组件封装 parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点&#xff1a; 函数式组件的优点&#xff1a; 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数…

智慧工地:让工地可视化、数字化、智能化

智慧工地平台功能包括&#xff1a;劳务管理、施工安全管理、视频监控管理、机械安全管理、危大工程监管、现场物料监管、绿色文明施工、安全隐患排查、施工综合管理、施工质量管理、设备管理、系统管理等模块。 一、项目开发环境 技术架构&#xff1a;微服务 开发语言&#…

【面试高频题】二叉树“神级遍历“入门

题目描述 这是 LeetCode 上的 「99. 恢复二叉搜索树」 &#xff0c;难度为 「中等」。 Tag : 「二叉树」、「树的搜索」、「递归」、「迭代」、「中序遍历」、「Morris 遍历」 给你二叉搜索树的根节点 root&#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结…