1。前言最近在研究windows驱动开发,简单说一下。与linux和windows驱动相比,无论是市面上的书籍、视频还是社区、博文和账号所有者,编写它们的人都很少,这导致学习曲线直线上升。windows驱动从业者就更少了。开发环境部署麻烦。驱动安装和发布比较麻烦,需要数字签名。如果发布到windows更新库,还需要微标签认证。你为什么要写作?因为在学习的过程中,发现很多东西还是老样子。如果你是从事linux开发的,可能会对你有所启发。如果你有windows驱动开发的需求,可以提供一些不成熟的建议。下面我们从正文入手,简单介绍下windows驱动2.Windows架构2.1操作系统和应用程序在很多现代操作系统中,应用程序和操作系统是相互隔离的。操作系统的核心代码运行在特权模式下,即内核模式。并且应用程序运行在非特权模式下,即用户模式。操作系统与应用程序的关系类似于服务器与客户端的关系,在windows平台下更为突出:几个概念:系统进程:windows操作系统本身会启动一个系统进程(加载kernel32.dll),有点类似于linux下的init进程,具体细节不再展开。FDO(FunctionDriverObject):设备功能驱动FiDO(FilterDriverObject):过滤驱动PDO(PhysicalDriverObject):物理设备驱动,实际访问硬件的地方。IRP(I/ORequestPacket),如果应用程序要访问内核数据,就必须通过IRP。也称为IRP请求,当应用程序与驱动程序交互时,发送一个IRP请求,IRP将在各层设备驱动程序之间来回传递和转发。2.2分层操作系统windows的设计理念是将内核设计得尽可能小,采用“客户-服务器”结构。操作系统的每个组件或模块都通过消息进行通信。win32子系统:是最纯粹的windows系统,其他子系统都是通过win32子系统的接口实现的,一般很少用到。NatvieAPI:在win32api的基础上添加Nt前缀,基于版本兼容。系统服务:NativeAPI从用户态进入内核态调用系统服务。(通过软中断实现,困在内核中)执行组件:内核态的一组服务函数。对象管理程序:windows操作系统提供的服务几乎都是以对象的形式存在,这里的对象类似于面向对象语言中对对象的介绍。如驱动对象、设备对象等的管理。进程管理程序:负责创建和终止进程,线程调度是内核的职责。流程管理器依赖于其他执行组件。虚拟内存管理程序:在CPU的内存管理单元(MMU)的协助下,物理内存和虚拟内存通过一定的映射关联起来。I/OManager:负责发起I/O请求和管理请求。它由一系列内核模式例程组成,这些例程为用户模式进程提供统一的接口。I/O管理器的目标是使来自用户模式的I/O请求独立于设备。配置管理程序:配置管理程序记录了所有计算机软硬件的配置信息。它使用称为注册表的数据库来存储此数据。设备驱动程序根据注册表中的信息加载驱动程序:I/O管理器收到申请后,创建相应的IRP并发送给驱动程序处理:根据IRP的请求,直接操作硬件,然后完成IRP,并根据IRP请求返回,转发给下层驱动,等待下层驱动返回。收到IRP驱动后,并不急于完成。相反,它为其他驱动程序分配一个新的IRPquorum并等待它返回。内核:内核被认为是Windows操作系统的核心。Windows内核是从执行组件中分离出来的。与执行组件相比,内核非常小:支持内核对象。线程调度对多处理器的同步支持。中断处理程序支持。支持异常陷阱。支持其他特定于硬件的功能。硬件抽象层:不同的硬件平台提供不同的硬件抽象层,向上层提供操作硬件的统一接口。2.3应用程序和驱动3.Windows驱动框架3.1驱动模型:Windows驱动大致分为这几类:功能驱动:设备功能驱动过滤驱动:设备辅助驱动软件驱动:软件模块驱动总线驱动:总线设备驱动3.2驱动演化NT模型:2000之前,不支持PNP(即插即用设备)WDM模型:基于NT,支持PNPWDF:WDM重新打包KMDF:内核态(sys)UMDF:用户态(dll)win7x64划时代操作系统,开始对win10进行数字签名:双认证签名,意味着对驱动程序的安全要求更高。3.3驱动垂直层次设备创建的顺序是先创建底层PDO,再创建高层FDO,即从底层设备到高层设备。PDO和FDO之间可能存在各种过滤驱动。每一层设备对象由不同的驱动程序创建,或者说每一层设备对应不同的驱动程序。底层设备对象依靠底层设备对象的AttachedDevice找到上层设备对象。3.4驱动水平层次结构同一个驱动创建的设备对象之间的关系称为水平层次关系。每个设备都可以通过NextDevice找到水平层次中的下一个设备对象。3.5一个复杂的驱动结构4.Windows开发环境搭建4.1开发环境部署以win10为例,列出需要安装的东西,详细过程限于篇幅,然后更新安装VS2019安装WindowsSDK:VS2019顺便安装WDKInstallVMware+Win10Virtualsystem4.2常用调试工具windbg:debugkernel。WDK自带,配合串口或网络调试windows内核DebugViewer:查看内核打印driverMonitor:驱动安装PCHunter_free:驱动强制卸载,不支持2004版本devicetree:设备枚举winobj:查看符号链接五、Windows驱动学习建议关于Windows驱动程序开发书籍、博客文章、教程少之又少。如果你有这方面的需求,可以给出如下建议:环境搭建:win732+vs2013就够了。win10+vs2019不推荐,比较新,遇到问题不容易解决。其次,一些早期的调试工具可能不支持最新版本的win10。绕过数字签名:首先使用测试模式,安装驱动程序。否则光是安装部署就很麻烦。WDM驱动程序模型入门。市面上关于WDM的书籍资料比较多,相对来说WDF的开发资料也比较多。多看书,windows驱动不要很多linux的资料,不懂就进技术群,多看书。
