基于Windows2000的过滤器驱动程序设计_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于windows2000的过滤器驱动程序设计wdm(windows driver mode)是微软公司为windows的驱动程序设计的一种通用的驱动程序模型。相比以前的kdm和vxd来说,他的性能更高、系统之间移植越发便利。所以,随着系统的升级,wdm已经成为windows 2000系统下驱动程序开发的主流。作为wdm模型之中一类特别的驱动程序,过滤器驱动程序(filter driver)可以在不更改现有驱动程序的状况下,便利地修改、增强现有驱动程序的功能。特殊是对于windows 2000已经提供了通用驱动程序的硬件设备,通过编写过滤器驱动程序,可以以较小的代价扩展硬件现有的功能。因此具有

2、很强的实际应用价值。1 windows 2000 io哀求处理结构1所示,windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用win32子系统提供的api来同设备交互,当哀求传递到io管理器时,他举行须要的参数匹配和操作平安性检查,然后由这个哀求构造出合适的irp(io request package,io哀求包),并把此irp传递到适当的驱动程序去,并给应用程序一个消息,通知这次io操作还没完成。驱动程序普通通过硬件抽象层来和硬件交互,从而完成io哀求工作。驱动程序完成io操作后,他将调用一个特别的内核

3、服务例程来完成irp。这时,io管理器把数据和结果返回给win32和用户应用程序。2 wdm驱动程序模型体系结构windows驱动程序模型重新定义驱动程序分层用法了2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为协助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象pdo(physical device object),代表了设备和之间的衔接。在设备对象堆栈的中间的对象称为功能设备对象fdo(functional device object),代表了设备的功能。在fdo的上面和下面还会有一些过滤器设备对象fido(filter

4、 device object)。位于fdo上面的过滤器设备对象称为上层过滤器,位于fdo下面(但仍在pdo之上)的过滤器设备对象称为下层过滤器。总线驱动程序负责枚举他的总线,这意味着发觉总线上的所有设备和检测设备何时被添加或删除并为每个设备创建一个pdo。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的全部设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使io哀求过程越发明白。io管理器发送的

5、irp,先被送到设备堆栈的上层过滤器驱动程序(fido),他可以按照要求打算irp的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以打算如何处理irp。高层的驱动程序可以把哀求划分成更容易的哀求并传递给下层驱动程序。中间层次的驱动程序进一步处理哀求,将一个irp中的哀求划分为若干个小的哀求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些irp在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。3 过滤器驱动程序过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改irp流,在不影响其他驱动程序的前提

6、下提供一些附加的功能。他的功能可分为:(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。(2)上层过滤器驱动程序在功能驱动程序之前看到irp,可以很便利地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送irp时看到irp。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,举行须要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。(4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序彻低自立于总线结构而不挺直与设备对话。针对不同的总线编写不同的下层过滤器

7、,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送irp即可。4 过滤器驱动程序设计过滤器驱动程序设计与功能驱动程序相像。这里限于篇幅主要研究一下过滤器驱动程序设计中与功能驱动程序相区分的几个关键的技术要点。41 driverentry例程driverentry例程是驱动程序的人口点。当io管理器装入驱动程序时,他调用driverentry例程用来初始化驱动程序范围的数据结构和资源,包括输出该驱动程序的其他人口点,初始化该驱动程序用法的特定对象,并设置驱动程序系统资源。与功能驱动程序相区分的是:他必需为每种类型的irp都安装派遣函数,而不仅仅

8、只是其希翼处理的irp。42 adddevice例程adddevice函数的基本职责是创建一个设备对象并把他衔接到以物理设备对象pdo为底的设备堆栈中,并负责设备对象初始化。与功能驱动程序相区分的是:过滤驱动程序创建的设备对象可能是2种,一种是不命名的过滤设备对象,过滤器工作时把这个无名的设备对象衔接到以物理设备对象pdo为底的设备堆栈中。一种是为了和用户程序通信而创建的命名的设备对象并不衔接到以物理设备对象pdo为底的设备堆栈中。命名可以采纳2种办法:第一种办法是采纳可显示的"硬编码"符号链接名,用户态程序必需把设备名硬编码到源代码中;另外一种办法是用法设备接口,每个设备

9、接口是由一个全局惟一标记符guid标记。设备注册为一个特定的设备接口就创建了一个符号链接。相关步骤如下:(1)调用iocreatedevke创建过滤设备对象,并建立一个私有的设备扩展对象。(2)寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号衔接。(3)初始化设备扩展和设备对象的f1ag成员。(4)调用ioattachdevketodevicestack函数把新设备对象放到堆栈上。详细实现程序如下:ntstatus adddevice (pdriver_object driverobject, pdevice_object pdo)pdevice_obje

10、ct fido=null;创建没有设备名的过滤设备对象ntstatus status=iocreatedevice (driverobjeot,sizeof (device-extension),null,file_device_unknown,0,false,&fido);if(!nt_success(status) return status;初始化设备扩展和设备对象的flag成员pdevice_extension pdx = (pdevice_extension)fido-deviceextension;pdx-deviceobject=fido;pdx-pdo=pdo;pdx-

11、edevicetype =fir;把没有设备名的设备对象放到堆栈上pdevice- object fdo =ioattachdevicetodevicestack (fido,pdo);pdx-topdevobj=fdo;fido-flags =pdo-f1ags&(do_direct-io do-buffered-io do_power_pagable do_power_inrush);建立一个命名的设备对象创建符号链接createsymboliclink (driverobject,pdo);return status_success;43 派遣例程派遣例程处理来自应用程序的打开、

12、关闭、读、写等io哀求指令。与功能驱动程序的区分是:过滤器驱动程序不能影响其他驱动程序接受irp。对于未知的irp或不处理的irp过滤驱动程序的原则是必需沿设备栈传递下去。因此他必需为每种类型的irp都安装派遣函数,而不仅仅只是其希翼处理的irp。对于希翼处理的irp必需指定特别的派遣函数,挺直用completeirp来完成接收到的这类irp,不往下层传送。这里由dispatchdevicecontrol处理来自应用程序的全部希翼处理的io操作指令。通常采纳赋予全部自定义的io哀求代码的switch语句,而对于每个指令用法相应的处理函数。下面列出了主要的代码框架:ntstatus dispat

13、chdevicecontrol (pdevice_object fido,pirp irp)ntstatus status;pdevice_extension pdx=(pdevice_extension)fido-deviceextension;plo_stack_location irpstack =iogetcurrentlrpstacklocation(1rp);取io控制指令代码ulong iocontrolcode = irpstack >parametersdevicelocontr01iocontrolcode;switch(iocontrolcode)case ioct

14、l-xxx: 处理io控制指令代码case ioctl-xxx:default:break;完成接收到的irpiocompleterequest(irp,io_no_increment);return status;对于不需要处理的irp则交由dispatchany例程处理,将irp沿着设备栈挺直传递下去:ntstatus dispatchany(pdevice_object fido,pirp irp)pdevice_ extension pdx=(pdevice-extension)fido-deviceextension使堆栈指针少前进一步。ioskipcurrentlrpstacklocation(hp);status=iocalldriver(pdx-lowerdeviceobject,irp);return stat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论