Windows 2000

  • 格式:pdf
  • 大小:251.51 KB
  • 文档页数:6

第l4卷・第3期 重庆邮电学院学报 2002年9月 !!!:! . o:.3 Journal of Chongqing University of Posts and Telecommunications Sep.2002 

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

李平,张云麟 (重庆邮电学院,重庆400065) 

摘要:介绍了Windows 2000驱动程序模型的基本结构、设计和开发的基本问题。并以PC[接口的ATM 信令接口卡开发的驱动程序部分为例,简单介绍了驱动程序开发的方法和步骤.并介绍了驱动程序开发环 境的设置及编译方法。这种内核模式驱动程序设计的开发过程得到了简化,并降低了其复杂性。 关键词:Windows 2000;驱动程序模型;ATM信令接口 中图分类号:TP3l1.1 文献标识码:A 文章编号:1004 Design For Windows 2000 Drive Program Module IA Ping,ZHANG Yun—lin (Chongqing , ersity of Posts and Tele ̄ommunications,Chongqing 400065。China) Abstract:In this paper.the basic structure of Windows 2000 drive program module is introduced. and the fundamental principle-design and exploitation of WDM are discussed.Taking developing drive program ATM signaling interface in PCI interface as an example,the authors briefly introduce the steps of design and the debug of driver program.and present the environment for developing the drive program,the way of programming and the simplified developing process of the drive program design. Key words:Windows 2000;drive program module;ATM signaling interface 

0 引 言 设备驱动程序是直接同硬件打交道的软件模 块。在Windows 2000中,微软公司在Windows NT 4.0的驱动程序结构基础上,同时引入了Windows 9X的即插即入特性,推出了新的驱动程序结构模式 (WDM)。WDM通过提供一种灵活的方式来简化驱 动程序的开发,在实现对新硬件支持的基础上减少 并降低所必须开发的驱动程序的数量和复杂性。在 Windows 2000中的驱动程序可以分为2大类:用户 模式驱动程序和内核模式的驱动程序。用户模式驱 动程序是与子系统特定相关的,它包含了Win32多 媒体驱动程序、支持MS—DOS应用程序的虚拟设备 驱动程序VDD(Virtual Device Driver)。内核模式 驱动程序有3种基本类型,每一种都有稍微不同的 结构和完全不同的功能,即最高层驱动程序(如文件 系统驱动程序(FSD))、中间层驱动程序(例如虚拟 磁盘、镜像或设备类型特定的外围设备)、底层驱动 程序(例如PnP硬件总线驱动程序)。在Windows 2000操作系统下的驱动程序开发分为3个主要的 领域:WDM驱动程序、文件系统驱动程序和小端口 驱动程序,见图1。其中小端口驱动程序针对的是显 示设备、SCSI和网络设备等特定领域;文件系统驱 动程序针对的是存储设备;WDM驱动程序针对的 

收稿日期:2002—03—06 基金项目:邮电部98年重点科技基金资助项目(部98065) 作者简介:李平(1972一),男.山东昌乐人,硕士研究生.研究方向为通信网与信令接口技术;张云麟・男,教授。 ・34・

 维普资讯 http://www.cqvip.com 李平.等:Windows 2000内核模式驱动程序设计 则是计算机应用系统开发所面对的大多数情况。本 文我们讨论了WDM内核模式的驱动程序设计的 一般问题,虽然其他类型驱动程序与WDM内核模 式驱动程序开发有所不同,但只要掌握了WDM内 核模式驱动程序开发的基础,结合2种基本类型的 本身特点,就能够很快掌握设计方法。 l虚拟设备驱l I内核模式I l动程序(VDD)I I驱动程序{ 丽丽厂 厂 l驱动程序I I驱动程序l }驱动程序l {驱动程序; 厂——_L] ;WDM驱动程序l 一[二=————— ] , I类驱动程序} 【微驱动程序}图l Windows2000中的设备驱动程序种类 Fig.1 Types of drivers in Windows2000 1 WDM的基本原理 WDM是一个模块化的、分层次类型的微型驱 动程序结构,层次结构如图2所示,其中左边是一个 设备对象堆栈,右边为驱动程序的分层结构。在 WDM驱动程序模型中,每个硬件至少要包含功能 驱动程序和总线驱动程序2个层。总线驱动程序为 总线上发现的每个设备创建物理设备对象PDO,每 个功能设备驱动程序创建自己的功能设备对象 FDO。在驱动程序中不是直接操作硬件,而是操作 相应的PDO与FD()。来自用户模式API的I/O请 

图2 wDM中设备对象和驱动程序的层次结构 Fig.2 The layer structure of device objects and driving prograllk ̄ill WDM 求包(IRP)送到设备堆栈的最上层驱动程序,然后 逐渐过滤到下层的驱动程序。每一层驱动程序都可 以决定如何处理IRP。内核模式的WDM驱动程序 有着可移植性、可配置性、基于对象、包驱动等共有 的属性。 用户态程序和内核通过设备对象访问设备驱动 程序的设备。WDM驱动程序有2种方法提供 Win32程序可用的名称,旧的方法是在驱动程序的 设备创建时,通过函数IoCreate—SymbolicI ink创建 一个符号链接名,新的方法是使用128位的设备接 口标识(GUID)。在驱动程序编写中,该GUID可以 通过Windows提供的guidgen.exe工具生成。 2 WDM驱动程序的结构及设计 内核模式的驱动程序不同于常规的应用程序, 可以把一个完整的驱动程序看作是一个容器,它包 含许多例程,当操作系统遇到一个IRP时,它就调 用这个容器中的例程来执行该IRP的各种操作。图 3表示了这一概念。在每一个WDM驱动程序中,都 必须拥有DriverEntry、AddDevice、DispatchPnP、 DispatchPower和DispatchWmi这5个例程,其他 的例程则是可选的。需要对IRP排队的驱动程序一 般都有一个StartIo例程,执行DMA传输的驱动程 序应有一个AdapterControl例程。大部分能生成硬 件中断的设备,其驱动程序都有一个中断服务例程 (ISR)和一个延迟过程调用(DpcForIsr)例程。驱动 程序一般都有几个支持不同类型IRP的分发例程。 WDM驱动程序开发者的主要任务就是为如图3所 示的容器选择,并完成所需要的例程。 基本驱动铡程 I/O控制倒程 派遣例程 l DriverEntry『 [1l t】 .一 I 丽 L————————__J卜■0 ■■ ÷—■ 壁 J 羼 莓 L J DispatehPnp DispatehPower DispatchWmi —I)iS 曲Re硝 一 . p∞ hW 口必须的驱动程序例裎口赴理请求队 需要包含startIo例程 口设备产生中断需要调用中断处理及延迟过程调用例程 口DMA设备需要包含Adapter(3ontrol 程 口可选的IRI’分发例程(DispatchRead,DispatchWrite等) 图3 wDM驱动程序容器及内容 Fig.3 Driving programs container and content of WDM 当I/O管理器装入驱动程序时,它调用每个驱 动程序必须有的DriverEntry例程,以用来初始化 驱动程序范围的数据结构和资源。一般来说,在 DriverEntry例程中通常完成以下功能:①找到所 要控制的硬件;②在驱动程序对象中设置驱动程序 的Dispatch一,AddDevice,Slartio(如果有)和UN— I OAD(如果有)等分发例程的程序的人口点;⑧建 立所有驱动程序对象或其他系统资源;④返回的 ・35・

 维普资讯 http://www.cqvip.com 2002年第3期 重庆邮电学院学报 CUPT NTSTATUS表明驱动程序是否成功装入,并能接 收和处理来自PnP管理器的配置、增加 (AddDevice)及启动其设备的请求。对于功能驱动 程序,AddDevice函数的基本职责是创建一个设备 对象并把它联接到以PDO为底的设备堆栈中。分发 (Dispatch)例程是设备驱动程序提供的主要函数。 当被调用去执行一个I/0操作时,Windows 2000 通过实现Dispatch例程来处理来自用户模式应用 程序的请求或来自系统的其他地方的请求。 一个完整的驱动程序要完成以下工作:初始化; 创建与删除设备;处理应用层程序的打开和关闭句 柄的请求;处理应用层程序的输入/输出请求;串行 化对设备的访问;访问硬件;调用其他驱动程序;取 消I/O请求;处理可热插拔设备的加入和删除事 件;电源管理和WMI;对能够产生中断的设备进行 中断处理。 操作系统使用I/O请求包(IRP)的数据结构与 内核模式驱动程序通信。IRP是一个内核对象,它是 一个预先定义的数据结构,带有一组对它进行操作 的I/O管理器例程。I/O管理器接收一个I/O请求 后分配并初始化一个IRP。一个IRP有一个固定的 首部和可变数目的IRP堆栈单元块,每个堆栈单元 块都对应一个将处理该IRP的驱动程序,因此这些 堆栈块至少应与驱动程序堆栈中将要处理这一请求 的驱动程序数目一样多。每个I/O请求有一个主功 能代码(IRP—MJ—XXX),并可能有次功能代码 (IRP—MN—XXX)。主功能代码决定了该I/O请求 调用的分发例程的驱动程序入口点。分发例程接收 到I/O请求后进行如下处理:确认I/O请求的合法 性;尽可能在分发例程中直接完成该I/O请求;如 果该请求不能在驱动程序的分发例程中被处理完, 驱动程序就把这个请求排进队列,以便以后完成处 理。WDM驱动程序提供了2种I/O请求排队的方 法:I/O管理器管理的系统排队和驱动程序自己管 理的驱动程序排队。 在Windows 2000和Windows 98中,通过使用 总线驱动程序,PnP管理器能够自动检测硬件和分 配I/O资源。在WDM驱动程序中PnP管理器使用 主功能代码为IRP—MJ—PNP的I/0请求包与设备 驱动程序交换信息和请求,完成对硬件设备的检测 ・36・ 和配置工作。PnP请求包完成2种功能:指示驱动程 序何时又如何配置和取消硬件及驱动程序本身的设 置;指导驱动程序完成一系列的状态转换。PnP请 求可以包含二十多个次功能代码,部分功能代码(如 IRP—READ—CONFIG,IRP—MN—QUERY—RE— SOURCE—REQUIREMENTS等)只能由总线驱动 程序处理,功能驱动程序和过滤驱动程序只是将该 IRP请求下传到总线驱动程序。对功能驱动程序和 过滤驱动程序中比较重要的IRP—MN—START— DEVICE用来通知功能驱动程序其硬件被赋予了 什么的I/O资源,以及指导功能驱动程序做任何必 要的硬件或软件设置,以便设备能正常工作。IRP— MN—REMOVE—DEVICE告诉功能驱动程序关闭 设备并释放与之关联的设备对象。 驱动程序的ISR和DpcForlsr在设备产生中断 时共同向设备提供服务。当设备产生中断时,驱动程 序的ISR将被调用,ISR通过询问设备硬件收集有 关的硬件设备信息,并尽可能地处理,如果不可能完 全处理该中断请求,就将中断信息传递给Dpc— ForIsr进行处理。ISR是运行在DIRQI 中断请求级 的,在运行时,会阻止在同一处理器上的所有设备发 出的具有更低的DIRQL的中断,因此在驱动程序 的编写时,ISR应尽可能快地返回控制。另外,ISR 可以与驱动程序的其它部分共享数据和硬件资源, 因此需要注意同步问题的处理。 3 WDM驱动程序开发环境及编译 Windows 2000下编写驱动程序的环境被称为 DDK For Microsoft Windows 2000或Windows 2000 DDK,DDK是一个命令行下的工作环境。在安 装DDK前需要先安装Micro—soft Visual C++和 Win32 SDK(可选)。对驱动程序的编译可以通过设 置Vc++的项目设置,在Vc++中直接编译驱动 程序,但改变设置的工作较繁且易出错,因此DDK build.exe编译联接器是构造驱动程序的主要工具。 它从配置文件Sources中读出待编译的程序的配 置,包括源文件、目标文件等,从环境变量Include 中得到引用文件的地址,然后调用Visual C++的 编译联接器Nmake.exe进行实际的编译联接工作。