开发WDM型USB设备驱动程序(一)

时间:2021-10-19 19:49:51
摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。

   关键词 WDM;USB设备驱动程序;Driverworks

   导言

  通用串行总线USB是1995年康柏、微软、IBM、DEC等公司推广的一种新型的通信标准,该总线接口具有安装方便、高带宽、易于扩展等优点,已逐渐成为现代数据传输的发展趋势。而在开发USB设备时,设备驱动程序的设计是其中一项重要的技术环节,它直接影响整个设备系统的性能。Windows98及其更高版本的操作系统对USB总线提供了全面的支持,并且用WDM驱动程序模型代替了VxD设备驱动程序。WDM支持USB协议,并为其提供了高效的开发平台。因此WDM已成为开发USB外设驱动程序所必须而有效的技术。

   Windows驱动程序模型(WDM)

  Windows环境下驱动程序共有三类,一类是VxD( Virtual Device Driver,虚拟设备驱动程序),起源于Windows 3.1 时代,用于Windows 95/98/Me操作系统中;一类是KMD( Kernel Mode Driver,内核模式驱动程序),用于Windows NT下;还有一类就是WDM(Win32 Driver Mode,Win32驱动程序模型),是微软从Windows 98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,毫不夸张地讲,WDM算得上是21世纪的驱动程序框架。

  WDM是在NT4.0驱动程序结构上发展起来的,所以它与NT4.0的驱动程序极为相似,但是它却有了本质上的提高,增加了对即插即用(PnP)、高级电源管理(PowerManagement)、Windows管理接口(WMl)的支持。更重要的是,WDM是一种通用的驱动模式,提供了包括USB、IEEEl394和HID等在内的一系列驱动程序类。

  1、WDM驱动程序的分层结构

  WDM体系结构实行分层处理,即设备驱动被分成了若干层,典型地分成:高层驱动程序、中间层驱动程序、底层驱动程序。每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。最底层的驱动程序在收到I/O请求后,通过硬件抽象层,与硬件发生作用,从而完成I/O请求工作。在这样的架构下,上面的驱动层就不需要对每个操作系统都要开发一遍了。如图1所示

  开发WDM型USB设备驱动程序(一)
  WDM还引入了功能设备对象FDO(Functional Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实硬件。一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。驱动程序和设备对象的分层情况如图2所示。

  开发WDM型USB设备驱动程序(一)
  其中总线驱动程序(Bus Driver)位于最底层,控制对总线上所有设备的访问,创建PDO代表发现的设备。功能驱动程序(Function Driver)控制设备的主要功能,分层在总线驱动的上面,负责创建FDO。在USB情况下,功能驱动程序必须使用USB类驱动程序访问设备。

  2、USB驱动程序的WDM结构

  USB驱动程序的构成层次如图3所示。其中USB客户驱动程序通过Windows系统提供的USB类驱动程序接口(USBDI)与下层驱动程序通信。

  开发WDM型USB设备驱动程序(一)
  在USB设备可用之前,必须对其进行配置和接口选择,然后所选择的接口的各个管道才是可用的。在USBDI的基础上进行编程将大大简化,用户不用关心IRP的类型,而只需要在相应的分发例程中通过构造USB块并将其通过USBDI发送下去就可以实现对USB设备的控制了。

   设备的访问

  WDM不是通过驱动程序名称,而是通过一个128位的全局惟一标识符(GUID)实现驱动程序的识别。在应用程序与WDM驱动程序通信方面系统为每一个用户请求打包形成一个I/O请求包(IRP)结构,将其发送至驱动程序,并通过识别IRP中PDO来区别是发送给哪一个设备的。内核通常通过发送IRP来运行驱动程序中的代码。

  WDM驱动程序有一个主要的初始化入口点,即一个必须称为DriverEntry的例程。它有一个标准的函数原型。当WDM驱动程序被装入时,内核调用DriverEntry例程。驱动程序的DriverEntry例程必须设置一系列的回调例程来处理IRP。每个回调例程有一个标准的函数原型。内核会在合适的环境下调用这个例程。

  大多数的WDM设备对象都是在即插即用管理器调用AddDevice例程入口点时被创建的。插入新设备后,当系统找到由安装信息文件所批示的驱动程序时,这个例程被调用。在此之后,一系列即插即用IRP被发送到驱动程序,设备驱动程序可进行相应的功能处理。