早期的Windows 95/98的设备驱动是VxD(Virtual Device Driver),其中x表示某一类设备。从Windows 2000开始,开发驱动程序必以WDM(Windows Driver Model)为基础的,但是,如果使用DDK来开发WDM,其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易,因此,一般用户都是使用WinDriver、DriverStudio之类的第三方工具。为改善这种局面,从Vista开始,微软推出了新的驱动程序开发环境WDF(Windows Driver Foundation )。
WDF和WDM的关系有点类似于MFC和Windows SDK的关系,有编程经验的人一看就知道为何WDF开发比WDM容易了。
WDF有KMDF(内核模式的驱动程序)和UMDF(用户模式的驱动程序)两种模式:
1、内核模式驱动程序 KMDF(Kernel-Mode Driver Framework): 这类驱动程序作为内核模式操作系统组件的一部分执行,它们管理I/O、即插即用、内存、进程和线程、安全等。内核模式驱动程序通常为分层结构。 关于KMDF更多的内容,可参阅 MSDN中“Getting Started with Kernel-Mode Driver Framework ”。
2、用户模式驱动程序 UMDF(User-Mode Driver Framework): 这类驱动程序通常提供 Win32 应用程序与内核模式驱动程序或其他操作系统组件之间的接口。用户模式驱动程序支持基于协议或基于串行总线(如摄像机和便携音乐播放器)的设备。关于KMDF更多的内容,可参阅 MSDN中“ Introduction to UMDF“。
3、无论内核模式的驱动程序或者用户模式的驱动程序,都使用同一环境进行构建,这一环境称为WDK;都采用同一套对象模型构建,采用同一个基础承载,这个基础就是WDF。由于WDF驱动模型提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。从现在开始,掌握Windows设备驱动程序的开发人员,由过去的“专业”人士,将变为“普通”大众。因此,像WinDriver、DriverStudio之类的第三方工具也随之退出历史舞台。
4、KMDF是Windows系统底层驱动,文件名为:*.SYS,Vista为2万多外设提供了KMDF,其中也包括USB2.0,因此对于具有USB2.0协议的FX2,只需编写与FX2相关的UMDF即可;UMDF是用户层驱动,文件名为:*.DLL。
一、WDM
1、WDM
WDM是英文Windows Driver Model(WDM)的缩写,是Windows98和Windows2000使用的新的驱动程序设计规范。使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。
除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。
2、DDK
Driver Developer Kit,开发2000/XP/2003的驱动开发包。
二、WDF
1、WDF
如所周知,自Windows 2000开始,开发驱动程序必以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。为改善这种局面,微软推出了新的驱动程序开发环境。
WDF是Vista及其以后OS的驱动模型,意为Windows Driver Foundation,此模型比WDM更先进、合理(微软是这样说的),将WDF中关于电源、PnP等一些复杂的细节由微软实现,所以在此模型上开发驱动会 比以前要简单。
WDF和WDM的关系有点类似于MFC和Windows SDK的关系。
2、WDK
Windows Driver Kit,其实WDK可以看做是DDK的升级版本,现在一般的WDK是包含以前DDK相关的功能,现在XP下也可以用WDK开发驱动,WDK能编译出2000-2008的各种驱动。
3、KMDF
内核模式驱动程序 KMDF(Kernel-Mode Driver Framework):这类驱动程序作为内核模式操作系统组件的一部分执行,它们管理I/O、即插即用、内存、进程和线程、安全等。内核模式驱动程序通常为分层结构。 关于KMDF更多的内容,可参阅 MSDN中“Getting Started with Kernel-Mode Driver Framework ”。
KMDF是Windows系统底层驱动,文件名为:*.SYS,Vista为2万多外设提供了KMDF,其中也包括USB2.0,因此对于具有USB2.0协议的FX2,只需编写与FX2相关的UMDF即可。
4、UMDF
用户模式驱动程序 UMDF(User-Mode Driver Framework):这类驱动程序通常提供 Win32 应用程序与内核模式驱动程序或其他操作系统组件之间的接口。用户模式驱动程序支持基于协议或基于串行总线(如摄像机和便携音乐播放器)的设备。关于KMDF更多的内容,可参阅 MSDN中“ Introduction to UMDF“。
UMDF是用户层驱动,文件名为:*.DLL。
三、WDF同WDM区别
1、 WDF将原来普通程序设计中基于对象的技术应用到了驱动开发中。WDM中虽也有对象模型,但与真正的基于对象技术根本就不是一回事。为了实现基于对象的技术,微软精心设计了对象模型并进行了封装。属性、方法、事件等等“一个都不能少”。
2、 无论内核模式的驱动程序或者用户模式的驱动程序,都采用同一套对象模型构建,采用同一个基础承载。这个基础就是WDF。
WDF虽然已经是经过封装和定义的对象模型,但对内核模式和用户模式对象来说,WDF又是两者的父对象。换言之两者都是继承了WDF才得到的,或者都是从WDF派生而来的。相对于内核模式,派生出的对象称为“KMD框架”即KMDF;相对于用户模式,派生出的模型称为“UMD框架”即UMDF。无论何种模式的框架,其内部封装的方法、执行的行为其实还是用WDM完成的。
3、 更重要的,也是微软反复炫耀的是封装了驱动程序中的某些共同行为:例如即插即用和电源管理就属于这种共同行为。因为大多数驱动程序中都需要处理即插即用和电源管理问题,据说这大概要上千行的代码,况且,没有相当水平还不一定能处理好。为了一劳永逸,WDF干脆将即插即用和电源管理封装了进了对象之内,一举成了对象的缺省(默认)行为。
4、 改变了操作系统内核与驱动程序之间的关系,WDM驱动程序中,一方面要处理硬件,另一方面要处理驱动程序与操作系统内核的交互。现在WDF则将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法(函数)完成,这样驱动开发者只需专注处理硬件的行为即可。这不仅避免了顾此失彼两面不周的弊端,也由于双方的分离,对操作系统内的某些改动,硬件制造商配套驱动程序的开发都有莫大的好处。
5、 两种模式的驱动程序(KMDF、UMDF)都使用同一环境进行构建,这一环境称为WDK。即KMDF,UMDF的开发环境都为WDK。
四、操作系统结构
1、操作系统结构
操作系统中,软件要么执行在用户模式中,要么执行在内核模式中。当用户模式程序需要读取设备数据时,它就调用 Win32 API 函数,如 ReadFile。
Win32 子系统模块(如 KERNEL32.DLL)通过调用平台相关的系统服务接口实现该 API,而平台相关的系统服务将调用内核模式支持例程。在 ReadFile 调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile 函数。然后这个用户模式的 NtReadFile 函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为 NtReadFile。
2、驱动类型
虚拟设备驱动程序(VDD):是一个用户模式部件,它可以使 DOS 应用程序访问 x86 平台上的硬件。VDD 通过屏蔽 I/O 权限掩码来捕获端口存取操作,它基本上是模拟硬件操作,这对于那些直接对裸机硬件编程的应用程序特别有用。尽管这种驱动程序在 Windows 98 和 Windows 2000 中共享一个名称并且有相同的功能,但实际上它们完全不同。我们用 VDD缩写代表这种驱动程序,用 VxD 缩写代表 Windows 98 中的虚拟设备驱动程序以示区别。
内核模式驱动程序:分类包含许多子类。PnP 驱动程序就是一种遵循 Windows 2000 即插即用协议的内核模式驱动程序。准确地说,本书涉及的所有内容都是面向 PnP 驱动程序的
WDM 驱动程序:是一种 PnP 驱动程序,它同时还遵循电源管理协议,并能在 Windows 98 和 Windows 2000 间实现源代码级兼容。WDM 驱动程序还细分为类驱动程序(class driver)和迷你驱动程序(minidriver),类驱动程序管理属于已定义类的设备,迷你驱动程序向类驱动程序提供厂商专有的支持。
显示驱动程序是用于显示和打印设备的内核模式驱动程序。
文件系统驱动程序在本地硬盘或网络上实现标准 PC 文件系统模型(包括多层次目录结构和命名文件概念)。
遗留设备驱动程序也是一种内核模式驱动程序,它直接控制一个硬件设备而不用其它驱动程序帮助。这种驱动程序主要包括 Windows NT 早期版本的驱动程序,它们可以不做修改地运行在 Windows 2000 中。
————————————————
版权声明:本文为CSDN博主「cclk-1024」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/longkuis/article/details/124637724