Windows驱动开发(一)

news2024/11/25 12:23:28

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.coloradmin.cn/o/1004053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF——Control与Template理解

文章目录 一、前言二、控件三、模板3.1 DataTemplate3.2 ControlTemplate3.3 ContentPresenter 四、结语 一、前言 最近又翻看了下刘铁猛的《深入浅出WPF》&#xff0c;发现对模板章节中的部分内容有了更深的体会&#xff0c;所以写篇文扯扯。 文章标题是Control与Template&a…

画流程图用什么软件好?安利这几款

画流程图用什么软件好&#xff1f;画流程图是一项非常重要的技能&#xff0c;它可以帮助我们更好地规划和管理工作流程&#xff0c;提高工作效率。在现代的企业中&#xff0c;流程图已经成为了不可或缺的一部分&#xff0c;它可以用来描述各种业务流程、流程控制、组织结构等等…

数据治理实战步骤

写在前面:数据治理是数字化转型的基础,是数字要素流通的首要任务。但是面对不同的情况,数据治理的手段不同。 数据治理专员要转换思想,数据治理中单靠技术、软件是不行的,比如一些单位认为数据治理平台是万能的,直接上平台一般是做不好的,需基于企业的组织文化、愿景等对…

vue全局使用sass变量

需求&#xff1a;框架需要使用scss&#xff0c;之后不想把很多重复的css一个一个写&#xff0c;就提取出来咯&#xff0c;到时候只需要更改scss文件就可以了&#xff0c;不用一个一个的找 1.下载sass 这我下的俩个版本&#xff0c;如果你们下载最新版不兼容可以参考我的版本下…

高效办公利器:批量重命名与翻译文件名一步到位

在我们的日常工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;包括图片、文档、视频等各种类型。有时候&#xff0c;我们需要对文件进行重命名或者翻译&#xff0c;以便于我们更方便地管理和使用这些文件。但是&#xff0c;如果一个一个手动操作&#xff0c;将是非常…

《树莓派4B家庭服务器搭建指南》第二十一期:安装开源远程桌面服务rustdesk, 内网丝滑,外网流畅控制

title: 《树莓派4B家庭服务器搭建指南》第二十一期&#xff1a;安装开源远程桌面服务rustdesk, 内网丝滑,外网流畅控制Windows,macOS,Linux设备 tags: 个人成长 categories:树莓派不吃灰 前段时间, 有一台老式MacBook Pro被我改造成了影视资源解码主机, 《树莓派4B家庭服务器搭…

老师怎样发布查询

作为一名老师&#xff0c;我们经常需要向家长发布各种查询&#xff0c;比如成绩查询、作业查询等。以往&#xff0c;我们可能会将查询结果整理成Excel表格&#xff0c;然后通过各种渠道发送给家长&#xff0c;这样既繁琐又不够高效。幸好&#xff0c;现在有了易查分&#xff0c…

MybatisPlus(4)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 在之前我们讲解了大部分查询相关的操作&#xff0c;接下来进行增删改的学…

SpringBoot项目--电脑商城【增加/减少购物车商品数量】

1.持久层[Mapper] 1.1规划需要执行的SQL语句 1.更新该商品的数量.此SQL语句无需重复开发 update t_cart set num?,modified_user?,modified_time? where cid? 2.首先进行查询需要操作的购物车数据信息【查看该条数据是否存在】 SELECT * FROM t_cart WHERE cid?2.接口…

如何解决实时语音通讯技术的延迟问题?

实时语音通讯技术的延迟问题一直是人们关注的焦点。在实时通讯中&#xff0c;延迟会影响到通话的质量和用户体验&#xff0c;因此如何解决实时语音通讯技术的延迟问题是一个重要的挑战。本文将探讨如何解决实时语音通讯技术的延迟问题。 一、延迟的定义和分类 延迟是指从说话…

C语言和汇编到底谁更厉害呢?

今日话题&#xff0c;C语言和汇编到底谁更厉害呢&#xff1f; 有位毕业生与我分享了他的经历。在学校&#xff0c;他学习了汇编和C语言。毕业后&#xff0c;他加入了一家嵌入式企业&#xff0c;发现C语言因其可移植性、开发效率和可读性而更为通用和适用。事实证明&#xff0c;…

排序算法-----冒泡排序与选择排序

目录 前言: 冒泡排序 原理图 代码实现 分析总结 选择排序 原理图 代码实现 分析总结 前言: 今天我们就开始学习排序算法&#xff0c;排序算法也是数据结构与算法在重要组成部分之一&#xff0c;排序算法是最经典的算法知识。因为其实现代码短&#xff0c;应该广&#x…

【设计模式】桥接模式在开发中的应用

1. 概述 桥接模式是一个非常简单的设计模式&#xff0c;可能大家在开发的过程中已经使用到了这种模式而不自知。总的来说&#xff0c;桥接模式最大的作用就是解耦&#xff0c;所谓的解耦&#xff0c;就是通过转换代码的设计&#xff0c;减少类与类&#xff0c;模块与模块之间的…

监听器,过滤器,拦截器

参考博文 文章目录 作用三者区别启动顺序拦截器简要说明实现接口HandlerInterceptor自定义拦截器配置拦截器 过滤器简要说明在springboot 启动类添加该注解ServletComponentScan写个过滤器类&#xff0c;实现Filter接口 监听器简要说明如何使用自定义事件自定义过滤器接口调用…

图片怎么转换成pdf格式?几种方法轻松转换

图片怎么转换成pdf格式&#xff1f;将图片转换成PDF格式的主要原因是方便共享和存储。PDF格式可以在不同的设备和操作系统上轻松打开和查看&#xff0c;而且可以保持原始图片的质量和分辨率。如果你需要将一些图片转换成PDF格式&#xff0c;你可能会问&#xff0c;“该如何做呢…

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

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

两行代码实现Redis消息队列,简单易用

Redis列表数据类型非常适合作为消息队列使用。将新的消息插入到列表尾部&#xff0c;然后从列表头部取出消息进行处理。该方案简单易用&#xff0c;并且支持多个消费者并行处理消息。 两行核心代码即可实现消息队列&#xff0c;如下&#xff1a; // 推送消息 redisTemplate.o…

Java中级编程大师班<第一篇:初识数据结构与算法-数组(2)>

数组&#xff08;Array&#xff09; 数组是计算机编程中最基本的数据结构之一。它是一个有序的元素集合&#xff0c;每个元素都可以通过索引进行访问。本文将详细介绍数组的特性、用法和注意事项。 数组的基本特性 数组具有以下基本特性&#xff1a; 有序性&#xff1a; 数…

初探词法分析实验

本次实验使用C对编译过程中的分词进行初步探究&#xff0c;以下是实验代码&#xff0c;输入文件需要在main函数中自己填写文本所在地址 #include <iostream> #include <stdlib.h> #include <stdio.h> #include<string> #define M 20 using namespace…

核心实验15_端口安全_ENSP

项目场景&#xff1a; 核心实验15_端口安全_ENSP 可指定该接口下最多接入几个设备&#xff08;通过mac绑定实现&#xff09;&#xff0c;人为增加设备时可设置接口自动down掉等&#xff0c;详见补充 实搭拓扑图&#xff1a; 具体操作&#xff1a; sw1: [Huawei]int g0/0/1 [H…