基于Windows2000的过滤器驱动程序设计
发布时间:2008/6/3 0:00:00 访问次数:439
1 windows 2000 i/o请求处理结构
如图1所示,windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用win32子系统提供的api来同设备交互,当请求传递到i/o管理器时,他进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的irp(io request package,i/o请求包),并把此irp传递到适当的驱动程序去,并给应用程序一个消息,通知这次i/o操作还没完成。驱动程序一般通过硬件抽象层来和硬件交互,从而完成i/o请求工作。驱动程序完成i/o操作后,他将调用一个特殊的内核服务例程来完成irp。这时,i/o管理器把数据和结果返回给win32和用户应用程序。
2 wdm驱动程序模型体系结构
windows驱动程序模型重新定义驱动程序分层使用了如图2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象pdo(physical device object),代表了设备和总线之间的连接。在设备对象堆栈的中间的对象称为功能设备对象fdo(functional device object),代表了设备的功能。在fdo的上面和下面还会有一些过滤器设备对象fido(filter device object)。位于fdo上面的过滤器设备对象称为上层过滤器,位于fdo下面(但仍在pdo之上)的过滤器设备对象称为下层过滤器。
总线驱动程序负责枚举他的总线,这意味着发现总线上的全部设备和检测设备何时被添加或删除并为每个设备创建一个pdo。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使i/o请求过程更加明了。i/o管理器发送的irp,先被送到设备堆栈的上层过滤器驱动程序(fido),他可以根据要求决定irp的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以决定如何处理irp。高层的驱动程序可以把请求划分成更简单的请求并传递给下层驱动程序。中间层次的驱动程序进一步处理请求,将一个irp中的请求划分为若干个小的请求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些irp在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。 3 过滤器驱动程序
过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改irp流,在不影响其他驱动程序的前提下提供一些附加的功能。他的功能可分为:
(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。
(2)上层过滤器驱动程序在功能驱动程序之前看到irp,可以很方便地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。
(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送irp时看到irp。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,进行必要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。 (4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序完全独立于总线结构而不直接与设备对话。针对不同的总线编写不同的下层过滤器,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送irp即可。
4 过滤器驱动程序设计
过滤器驱动程序设计与功能驱动程序相似。这里限于篇幅主要讨论一下过滤器驱动程序设计中与功能驱动程序相区别的几个关键的技术要
1 windows 2000 i/o请求处理结构
如图1所示,windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用win32子系统提供的api来同设备交互,当请求传递到i/o管理器时,他进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的irp(io request package,i/o请求包),并把此irp传递到适当的驱动程序去,并给应用程序一个消息,通知这次i/o操作还没完成。驱动程序一般通过硬件抽象层来和硬件交互,从而完成i/o请求工作。驱动程序完成i/o操作后,他将调用一个特殊的内核服务例程来完成irp。这时,i/o管理器把数据和结果返回给win32和用户应用程序。
2 wdm驱动程序模型体系结构
windows驱动程序模型重新定义驱动程序分层使用了如图2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象pdo(physical device object),代表了设备和总线之间的连接。在设备对象堆栈的中间的对象称为功能设备对象fdo(functional device object),代表了设备的功能。在fdo的上面和下面还会有一些过滤器设备对象fido(filter device object)。位于fdo上面的过滤器设备对象称为上层过滤器,位于fdo下面(但仍在pdo之上)的过滤器设备对象称为下层过滤器。
总线驱动程序负责枚举他的总线,这意味着发现总线上的全部设备和检测设备何时被添加或删除并为每个设备创建一个pdo。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使i/o请求过程更加明了。i/o管理器发送的irp,先被送到设备堆栈的上层过滤器驱动程序(fido),他可以根据要求决定irp的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以决定如何处理irp。高层的驱动程序可以把请求划分成更简单的请求并传递给下层驱动程序。中间层次的驱动程序进一步处理请求,将一个irp中的请求划分为若干个小的请求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些irp在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。 3 过滤器驱动程序
过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改irp流,在不影响其他驱动程序的前提下提供一些附加的功能。他的功能可分为:
(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。
(2)上层过滤器驱动程序在功能驱动程序之前看到irp,可以很方便地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。
(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送irp时看到irp。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,进行必要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。 (4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序完全独立于总线结构而不直接与设备对话。针对不同的总线编写不同的下层过滤器,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送irp即可。
4 过滤器驱动程序设计
过滤器驱动程序设计与功能驱动程序相似。这里限于篇幅主要讨论一下过滤器驱动程序设计中与功能驱动程序相区别的几个关键的技术要