Windows 2000内核模式驱动程序设计

文章介绍了Windows2000下的WDM驱动程序结构及其设计原理。WDM是一种简化驱动程序开发的模型,支持即插即用特性。文章详细阐述了WDM的层次结构、关键组件与开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来源:重庆邮电学院学报


设备驱动程序是直接同硬件打交道的软件模块。在Windows 2000中,微软公司在Windows NT40的驱动程序结构基础上,同时引入了Windows9X的即插即入特性,推出了新的驱动程序结构模式(WDM)。WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。在Windows 2000中的驱动程序可以分为2大类:用户模式驱动程序和内核模式的驱动程序。用户模式驱动程序是与子系统特定相关的,它包含了Win32多媒体驱动程序、支持MSDOS应用程序的虚拟设备驱动程序VDDVirtual Device Driver)。内核模式驱动程序有3种基本类型,每一种都有稍微不同的结构和完全不同的功能,即最高层驱动程序(如文件系统驱动程序(FSD))、中间层驱动程序(例如虚拟磁盘、镜像或设备类型特定的外围设备)、底层驱动程序(例如PnP硬件总线驱动程序)。在Windows2000操作系统下的驱动程序开发分为3个主要的领域:WDM驱动程序、文件系统驱动程序和小端口驱动程序,见图1。其中小端口驱动程序针对的是显示设备、SCSI和网络设备等特定领域;文件系统驱动程序针对的是存储设备;WDM驱动程序针对的则是计算机应用系统开发所面对的大多数情况。本文我们讨论了WDM内核模式的驱动程序设计的一般问题,虽然其他类型驱动程序与WDM内核模式驱动程序开发有所不同,但只要掌握了WDM内核模式驱动程序开发的基础,结合2种基本类型的本身特点,就能够很快掌握设计方法。


1
 WDM的基本原理
  WDM是一个模块化的、分层次类型的微型驱动程序结构,层次结构如图2所示,其中左边是一个设备对象堆栈,右边为驱动程序的分层结构。在WDM驱动程序模型中,每个硬件至少要包含功能驱动程序和总线驱动程序2个层。总线驱动程序为总线上发现的每个设备创建物理设备对象PDO,每个功能设备驱动程序创建自己的功能设备对象FDO。在驱动程序中不是直接操作硬件,而是操作相应的PDOFDO。来自用户模式APIIO请求包(IRP)送到设备堆栈的最上层驱动程序,然后逐渐过滤到下层的驱动程序。每一层驱动程序都可以决定如何处理IRP。内核模式的WDM驱动程序有着可移植性、可配置性、基于对象、包驱动等共有的属性。


  用户态程序和内核通过设备对象访问设备驱动程序的设备。WDM驱动程序有2种方法提供
Win32
程序可用的名称,旧的方法是在驱动程序的设备创建时,通过函数IoCreateSymbolicLink创建一个符号链接名,新的方法是使用128位的设备接口标识(GUID)。在驱动程序编写中,该GUID可以通过Windows提供的guidgenexe工具生成。
2
 WDM驱动程序的结构及设计
  内核模式的驱动程序不同于常规的应用程序,可以把一个完整的驱动程序看作是一个容器,它包含许多例程,当操作系统遇到一个IRP时,它就调用这个容器中的例程来执行该IRP的各种操作。图3表示了这一概念。在每一个WDM驱动程序中,都必须拥有DriverEntryAddDeviceDispatchPnPDispatchPowerDispatchWmi5个例程,其他的例程则是可选的。需要对IRP排队的驱动程序一般都有一个StartIo例程,执行DMA传输的驱动程序应有一个AdapterControl例程。大部分能生成硬件中断的设备,其驱动程序都有一个中断服务例程(ISR)和一个延迟过程调用(DpcForIsr)例程。驱动程序一般都有几个支持不同类型IRP的分发例程。WDM驱动程序开发者的主要任务就是为如图3所示的容器选择,并完成所需要的例程。


  当IO管理器装入驱动程序时,它调用每个驱动程序必须有的DriverEntry例程,以用来初始化驱动程序范围的数据结构和资源。一般来说,在DriverEntry例程中通常完成以下功能:找到所要控制的硬件;在驱动程序对象中设置驱动程序的Dispatch-,AddDeviceStartio(如果有)和UNLOAD(如果有)等分发例程的程序的入口点;建立所有驱动程序对象或其他系统资源;返回的NTSTATUS表明驱动程序是否成功装入,并能接收和处理来自PnP管理器的配置、增加(AddDevice)及启动其设备的请求。对于功能驱动程序,AddDevice函数的基本职责是创建一个设备对象并把它联接到以PDO为底的设备堆栈中。分发(Dispatch)例程是设备驱动程序提供的主要函数。当被调用去执行一个IO操作时,Windows 2000通过实现Dispatch例程来处理来自用户模式应用程序的请求或来自系统的其他地方的请求。
  一个完整的驱动程序要完成以下工作:初始化;创建与删除设备;处理应用层程序的打开和关闭句柄的请求;处理应用层程序的输入/输出请求;串行化对设备的访问;访问硬件;调用其他驱动程序;取消IO请求;处理可热插拔设备的加入和删除事件;电源管理和WMI;对能够产生中断的设备进行中断处理。
  操作系统使用IO请求包(IRP)的数据结构与内核模式驱动程序通信。IRP是一个内核对象,它是一个预先定义的数据结构,带有一组对它进行操作的IO管理器例程。IO管理器接收一个IO请求后分配并初始化一个IRP。一个IRP有一个固定的首部和可变数目的IRP堆栈单元块,每个堆栈单元块都对应一个将处理该IRP的驱动程序,因此这些堆栈块至少应与驱动程序堆栈中将要处理这一请求的驱动程序数目一样多。每个IO请求有一个主功能代码(IRP_MJ_XXX),并可能有次功能代码(IRP_MN_XXX)。主功能代码决定了该IO请求调用的分发例程的驱动程序入口点。分发例程接收到IO请求后进行如下处理:确认IO请求的合法性;尽可能在分发例程中直接完成该IO请求;如果该请求不能在驱动程序的分发例程中被处理完,驱动程序就把这个请求排进队列,以便以后完成处理。WDM驱动程序提供了2IO请求排队的方法:IO管理器管理的系统排队和驱动程序自己管理的驱动程序排队。
  在Windows 2000Windows 98中,通过使用总线驱动程序,PnP管理器能够自动检测硬件和分配IO资源。在WDM驱动程序中PnP管理器使用主功能代码为IRPMJPNPIO请求包与设备驱动程序交换信息和请求,完成对硬件设备的检测和配置工作。PnP请求包完成2种功能:指示驱动程序何时又如何配置和取消硬件及驱动程序本身的设置;指导驱动程序完成一系列的状态转换。PnP请求可以包含二十多个次功能代码,部分功能代码(如IRPREADCONFIGIRPMNQUERYRESOURCEREQUIREMENTS等)只能由总线驱动程序处理,功能驱动程序和过滤驱动程序只是将该IRP请求下传到总线驱动程序。对功能驱动程序和过滤驱动程序中比较重要的IRPMNSTARTDEVICE用来通知功能驱动程序其硬件被赋予了什么的IO资源,以及指导功能驱动程序做任何必要的硬件或软件设置,以便设备能正常工作。IRPMNREMOVEDEVICE告诉功能驱动程序关闭设备并释放与之关联的设备对象。
  驱动程序的ISRDpcForIsr在设备产生中断时共同向设备提供服务。当设备产生中断时,驱动程序的ISR将被调用,ISR通过询问设备硬件收集有关的硬件设备信息,并尽可能地处理,如果不可能完全处理该中断请求,就将中断信息传递给DpcForIsr进行处理。ISR是运行在DIRQL中断请求级的,在运行时,会阻止在同一处理器上的所有设备发出的具有更低的DIRQL的中断,因此在驱动程序的编写时,ISR应尽可能快地返回控制。另外,ISR可以与驱动程序的其它部分共享数据和硬件资源,因此需要注意同步问题的处理。
3
 WDM驱动程序开发环境及编译
  Windows 2000下编写驱动程序的环境被称为DDK For Microsoft Windows 2000Windows2000 DDKDDK是一个命令行下的工作环境。在安装DDK前需要先安装Microsoft VisualC++和Win32 SDK(可选)。对驱动程序的编译可以通过设置VC++的项目设置,在VC++中直接编译驱动程序,但改变设置的工作较繁且易出错,因此DDKbuildexe编译联接器是构造驱动程序的主要工具。它从配置文件Sources中读出待编译的程序的配置,包括源文件、目标文件等,从环境变量Include中得到引用文件的地址,然后调用VisualC++的编译联接器Nmakeexe进行实际的编译联接工作。
   
另外,build编译联接器还可以通过查看DIRS文件中的伪指令,确定要编译的驱动程序目录列表。日志文件buildlogbuildwrnbuilderr中分别记录了编译联接中执行的命令行、遇到的错误和警告。编译完成后的文件后缀为.sys
  驱动程序的调试是在原代码级进行的,可以用微软公司提供的WinDbg调试工具,但需要在两台以串口联接的计算机上进行。而NUMEGA公司的SOFTICE比较方便地在一台计算机上进行核心代码的调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值