浅谈 windows 驱动开发

简介: 浅谈 windows 驱动开发

1. 前言


最近一段时间一直在研究windows 驱动开发,简单聊聊。


  • 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导致学习曲线直线上升。


  • windows 驱动 从业 人员就更少了。


  • 开发环境部署麻烦。


  • 驱动安装发布麻烦,需要数字签名。如果是发布到windows update 库里面,还需要做微标认证。


为什么还要写?因为在学习的过程中,发现很多东西还是很相同的,如果你是从事linux 开发,可能会有些启发,如果是对windows 驱动开发有需求,可能提供一些不成熟的建议。


接下来开始正文,简单介绍下windows 驱动


2. windows 体系架构


2.1 操作系统与应用程序


在许多现代操作系统中,应用程序和操作系统是相互隔离的。操作系统的核心代码运行在特权模式下,即内核模式。而应用程序运行在非特权模式下,即用户模式。


操作系统和应用程序的关心类似于服务器和客户端的关系,这点在windows 平台下显得更加突出:


image.png


几个概念:


  • system 进程:windows 操作系统本身会起一个 system 进程(加载kernel32.dll),有点类似于 linux 下的 init进程,具体细节不展开。


  • FDO (Function Driver Object):设备功能驱动


  • FiDO (Filter Driver Object):过滤驱动


  • PDO (Physical Driver Object):物理设备驱动,真正访问硬件的地方。


  • IRP (I/O Request Packet),应用程序 想要访问内核数据,必须通过IRP 传递。又叫IRP请求,当应用程序和驱动交互时,发送一个IRP 请求,IRP 会在各层设备驱动之间来回传动与转发。


2.2 操作系统分层


image.png


windows 的设计思想是将内核设计的尽可能的小,并且采用“客户端-服务器”的结构。操作系统各个组件或者模块是通过消息进行通信的。


  • win32 子系统:是最纯正的windows 系统,其他子系统都是通过win32 子系统的接口来实现的,一般很少用到。


  • Natvie API :在win32 api 基础上加上Nt 前缀,基于版本兼容考虑


  • 系统服务:Native API 从用户模式进入内核模式,调用系统服务。(软中断方式实现,陷入内核


  • 执行组件:内核模式下的一组服务函数。


  • 对象管理程序:windows 操作系统提供的服务几乎都是以对象的形式存在的,这里的对象类似于面向对象语言中对象的概论。如驱动对象,设备对象等管理。
  • 进程管理程序:负责创建和终止进程,线程调度是由内核负责的。进程管理程序依赖于其他执行组件。


  • 虚拟内存管理程序:在CPU的内存管理单元(MMU)的协助下,通过某种映射将物理内存和虚拟内存关联起来。


  • I/O 管理器:负责发起I/O 请求,并管理请求。它由一系列内核模式下的例程所组成,这些例程为用户模式下的进程提供了统一接口。I/O 管理器的目标是使来自用户模式的I/O请求独立于设备。


  • 配置管理程序:配置管理程序,记录所有计算机软,硬件的配置信息。它使用一个被称为注册表的数据库保存这些数据。设备驱动程序根据注册表中的信息进行加载


  • 驱动程序:I/O 管理器接收应用程序后,创建相应的 IRP,并传送至驱动程序进行处理:


  • 根据IRP的请求,直接操作硬件,然后完成此IRP,并返回


  • 根据IRP的请求,转发到更底层的驱动中去,并等待底层驱动的返回。


  • 接受到IRP驱动后,不着急于完成。而是分配新的IRP法定其他驱动程序,并等待返回。


  • 内核:内核被认为是 Windows 操作系统的心脏。Windows 的内核从执行组件分割出来。和执行组件相比,内核是非常小的:


  • 对内核对象的支持。


  • 对线程的调度


  • 对多处理器同步支持。


  • 中断处理函数的支持。


  • 对异常陷阱的支持。


  • 对其他硬件特殊功能的支持。


  • 硬件抽象层:不同的硬件平台,提供不同的硬件抽象层,并对上层提供统一的操作硬件的接口。


2.3 应用程序和驱动


image.png

image.png


3. windows 驱动框


3.1 驱动模型:


windows 驱动大致分为这几类:


  • function driver:设备功能驱动


  • filter driver:设备辅助驱动


  • software driver:软件模块驱动


  • bus driver:总线设备驱动


3.2 驱动演变


image.png


  • NT 模型 :2000以前,不支持 PNP (即插即用设备)


  • WDM 模型:NT 基础上,支持 PNP


  • WDF:WDM的重封装


  • KMDF:内核模式(sys)


  • UMDF:用户模式(dll)


  • win7 x64 划时代操作系统,开始数字签名了


  • win10 :双认证签名,也就是说对驱动的安全性要求更高了


3.3 驱动垂直层次结构


image.png


  • 设备的创建顺序,先创建底层PDO,在创建高层的FDO,即从底层设备到高层设备。
  • 在PDO 和 FDO之间可能有各种过滤驱动。每层设备对象由不同的驱动程序创建,或者说每层的设备对应着不同的驱动程序。


  • 底层设备对象寻找上一层的设备对象,是依靠底层设备对象的AttachedDevice 来寻找的。


3.4 驱动水平层次结构


image.png


  • 同一驱动程序创建出来的设备对象的关系称之为水平层次关系。


  • 每一个设备通过NextDevice可以寻找水平层次的下一个设备对象。


3.5 一个复杂的驱动结构


image.png


4. windows 开发环境搭建


4.1 开发环境部署


以 win10 为例,列出需要安装的东西,详细过程限于篇幅以后更新


  • 安装VS2019


  • 安装 Windows SDK:VS 2019 顺带安装


  • 安装 WDK


  • 安装 VMware + Win10 虚拟系统


4.2 常用调试工具


  • windbg:调试内核。WDK 自带,配合串口或者网络调试windows 内核


  • DebugViewer:查看内核打印


  • driverMonitor:驱动安装


  • PCHunter_free:驱动强制卸载,不支持2004版本


  • devicetree:设备枚举


  • winobj:查看符号链接


5. windows 驱动学习建议


有关Windows 驱动开发书籍,博文,教程甚少。如果有这方面需求的可以给以下几个建议:


  • 环境搭建:win7 32 + vs2013 即可。不建议 win10 + vs2019,比较新,遇到问题不好解决。其次早期的一些调试工具,win10 最新版本不一定支持。


  • 绕开数字签名:先使用测试模式,安装驱动。否则光安装部署就够折腾的。


  • 入门采用 WDM 驱动模型。市面上将WDM 的书籍和资料相对多些,相对来说,WDF 开发资料来不少。


  • 多看书,windows 驱动不想linux 资料一大把,遇到不懂得,加技术群,啃书本。

推荐书籍:


  • 《Windows 驱动开发技术详解》:已绝版


  • 《竹林蹊径:深入理解windows 驱动开发》:已绝版


  • 《windows 7:设备驱动程序开发 》:wdf 讲的比较多得书
相关文章
|
5天前
|
IDE 关系型数据库 开发工具
使用Visual Basic进行Windows窗体开发
【4月更文挑战第27天】本文介绍了使用Visual Basic进行Windows窗体(WinForms)开发的步骤,从搭建开发环境到创建、设计用户界面,再到编写事件驱动的代码和数据绑定。Visual Basic结合WinForms提供了一种易学易用的桌面应用开发方案。通过调试、优化、部署和维护,开发者可以构建专业应用程序。随着技术发展,掌握最新UI设计和开发工具对于保持竞争力至关重要。本文为初学者提供了基础指导,鼓励进一步探索和学习。
|
2天前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
|
4天前
|
编解码 Linux Windows
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
本文档介绍了在Windows环境下如何为FFmpeg集成libopus和libvpx库。首先,详细阐述了安装libopus的步骤,包括下载源码、配置、编译和安装,并更新环境变量。接着,同样详细说明了libvpx的安装过程,注意需启用--enable-pic选项以避免编译错误。最后,介绍了重新配置并编译FFmpeg以启用这两个库,通过`ffmpeg -version`检查是否成功集成。整个过程参照了《FFmpeg开发实战:从零基础到短视频上线》一书的相关章节。
19 0
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
|
5天前
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
21 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
27天前
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
32 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
|
2月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
|
5月前
|
监控 安全 API
5.9 Windows驱动开发:内核InlineHook挂钩技术
在上一章`《内核LDE64引擎计算汇编长度》`中,`LyShark`教大家如何通过`LDE64`引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的`InlineHook`函数挂钩其实与应用层一致,都是使用`劫持执行流`并跳转到我们自己的函数上来做处理,唯一的不同的是内核`Hook`只针对`内核API`函数,但由于其身处在`最底层`所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。
40 1
5.9 Windows驱动开发:内核InlineHook挂钩技术
|
5月前
|
监控 API C++
8.4 Windows驱动开发:文件微过滤驱动入门
MiniFilter 微过滤驱动是相对于`SFilter`传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在编写时更简单,多数`IRP`操作都由过滤管理器`(FilterManager或Fltmgr)`所接管,因为有了兼容层,所以在开发中不需要考虑底层`IRP`如何派发,更无需要考虑兼容性问题,用户只需要编写对应的回调函数处理请求即可,这极大的提高了文件过滤驱动的开发效率。
43 0
|
5月前
|
监控 Windows
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
在笔者上一篇文章`《内核监视LoadImage映像回调》`中`LyShark`简单介绍了如何通过`PsSetLoadImageNotifyRoutine`函数注册回调来`监视驱动`模块的加载,注意我这里用的是`监视`而不是`监控`之所以是监视而不是监控那是因为`PsSetLoadImageNotifyRoutine`无法实现参数控制,而如果我们想要控制特定驱动的加载则需要自己做一些事情来实现,如下`LyShark`将解密如何实现屏蔽特定驱动的加载。
33 0
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
|
25天前
|
监控 安全 API
7.3 Windows驱动开发:内核监视LoadImage映像回调
在笔者上一篇文章`《内核注册并监控对象回调》`介绍了如何运用`ObRegisterCallbacks`注册`进程与线程`回调,并通过该回调实现了`拦截`指定进行运行的效果,本章`LyShark`将带大家继续探索一个新的回调注册函数,`PsSetLoadImageNotifyRoutine`常用于注册`LoadImage`映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。
37 0
7.3 Windows驱动开发:内核监视LoadImage映像回调

热门文章

最新文章