用户模式驱动模型(UMDF)简介

微软在新一代Windows驱动开发包WDK中提供了一种新的驱动模型:用户模式驱动模型(UMDF)。

UMDF和传统的驱动程序差异非常大,简要说来,UMDF是这样的:

  • UMDF是基于COM思想的,运行于用户模式(RING3)的驱动程序模块。

那么,这种驱动模型带来什么变化呢?

首先基于COM思想,引入接口机制,可以把相关联的函数分门别类进行组织,使得驱动代码清晰明了;其次,运行在RING3的驱动,大幅度降低了驱动程序在稳定性和安全性上面的风险,UMDF驱动崩溃不会导致bugcheck(蓝屏),并且UMDF驱动的宿主进程是在受限的用户身份下运行的,不是受信任的系统内核模块。可以在UMDF里面使用Win32 API。

运行于RING3的UMDF对于程序员开说至少带来两个额外好处:

  • 驱动程序不需要强制数字签名,因为UMDF驱动不是系统信任模块,所以在x64下面的部署更加方便。特别是个人开发者可能无法承受WHQL的费用,或者其他原因暂时无法WQHL的情况下,使用UMDF是一个较好的选择。
  • 调试难度大幅降低,不再需要SoftICE和Syser之类的单机内核调试器或者WinDBG之类的双机调试,我们可以用WinDBG或者VS调试器attach到UMDF宿主进程即可进行调试。可以参考调试UMDF驱动

UMDF的局限

以上简要介绍了UMDF的种种优势,下面来说说UMDF的局限性。UMDF由于是一种较新的驱动程序模型,所以其功能还在不断的演变和增加,但是至少在目前的情况下,UMDF还是受到较大限制的:

  • 无法直接访问硬件,不能直接处理中断,无法DMA。
  • 无中断计时循环,因为RING3代码会随时被系统调度。
  • 无法访问系统内核数据和系统内存空间。
  • 无法作为系统内核驱动栈的一层。

可见受到的限制是很大的,那么什么最适合使用UMDF呢?简单的说,新开发的驱动如果UMDF能满足需要就使用UMDF。目前,使用UMDF最多的是USB驱动。

USB驱动是一类最繁杂的驱动,包括很多个子类,其中HID类由于可能参与系统自举和涉及到安全问题,是不能用UMDF的,和系统内核流接口打交道也不能用UMDF。如果我们只是为了给自己的MP3播放器,手机管理软件,数码相机,数据采集设备等编写驱动,那么就可以采用UMDF。