WDM驱动中的设备对象种类

WDM驱动中对象的概念

本来,所谓”对象”的定义应该是这样:一个(或一组)数据结构以及定义于其上的操作。按这样的定义,”驱动对象”其实不成其为”对象”,而只是设备对象的一部分,只不过这里面的信息是同种设备对象所公共的部分,所以将其抽取出来,放在一个独立的数据结构中而已。正因为这样,驱动对象与设备对象之间通常是一对多的关系,实际处理的目标可以有多个,但是处理的方法却都一样。所以,驱动对象和设备对象其实是同一事物的两面,驱动对象是其中抽象的一面,而设备对象是其中具体的一面。

一个驱动程序为它所控制的每个设备产生设备对象,设备对象代表驱动程序的设备。从PnP的角度看有三种设备对象:

  • 物理设备对象(PDO)—代表一个总线驱动程序的总线上的设备
  • 功能设备对象(FDO)—代表一个功能驱动程序的设备
  • 过滤程序设备对象(Filter DO)—代表一个过滤器驱动程序的设备

这三种设备对象都是DEVICE_OBJECT类型,但是使用方式不同并有不同的设备扩展。

通过产生一设备对象(IoCreateDevice)并将其附着到设备堆栈(IoAttachDeviceToDevice_Stack),驱动程序将其本身添加到处理设备的I/O驱动程序堆栈,IoAttachDeviceToDeviceStack决定设备堆栈当前的顶层和附着新的设备对象到设备堆栈的顶层。

图1.7给出了设备对象的可能种类,该设备对象可附着于设备堆栈里,表示处理一个设备的I/O请求的驱动程序。

这一部分描述了每一类的设备对象并注意到何时产生该类。参看第2章获得关于在必要的PnP驱动程序例程里产生设备对象的细节信息,要获得PnP设备枚举的更多信息,参见第2部分。

开始于图1.7的底部:

总线驱动

端口驱动本来是直接与设备打交道的,所以又称为”物理驱动”,而代表着物理驱动模块的”对象”就称为PDO,即”Physical Device Object”。而且,由于物理的接口总是在某个总线(如PCI总线、ISA总线)上,所以又有可能被称为”总线驱动”。上层那些”中间驱动”中的”类驱动”,则又称为”功能驱动”,相应的对象则称为FDO,即”Functional Device Object”。至于”中间驱动”中的”过滤驱动”,倒没有别的称呼,相应的对象就称为FiDO,即”Filter Device Object”,但是按过滤驱动的安装位置在类驱动的上面或下面又有”上过滤”和”下过滤”之分。可想而知,”老式”设备驱动模块一定是PDO。

总线驱动程序为总线上它所枚举的每个设备产生PDO。

当总线驱动程序枚举其设备时,它为每个子设备产生PDO。总线驱动程序枚举一设备为PnP管理器的BusRelations响应一个IRP_MN_QUERY_DEVICE_RELATIONS请求。如果自从最近一次总线驱动程序响应BusRelations的查询关系请求以来(或者这是机器被引导以来第一次查询关系)设备已经添加到总线上,则总线驱动程序为每个子设备产生一个PDO。

PDO表示了总线驱动程序的设备,其他内核模式系统组件也和它一样,如电源管理器、PnP管理器和I/O管理器。

一个设备其他的驱动程序附着于PDO顶端的设备对象,但是PDO一直在设备堆栈的底端。

可选择的总线过滤器驱动程序为它们过滤的每个设备产生过滤程序DO。

当PnP管理器在BusRelations列表里发现一个新设备时,它决定是否有该设备的任何总线过滤器驱动程序。如果是这样的话,对每个这样的驱动程序PnP管理器确保它们被装载(如果需要调用DriverEntry)并调用驱动程序AddDevice例程。如果总线过滤器驱动程序为这个设备过滤操作,过滤器驱动程序产生一个设备对象并附着它到AddDevice例程里的设备堆栈上。如果不止一个总线过滤器驱动程序存在,且与这个设备相关,每个这样的过滤器驱动程序产生并附着于它自己的设备对象。

可选择的,低层过滤器驱动程序为它们过滤的每个设备产生过滤程序DO。

如果一可选择的低层过滤器驱动程序由于这个设备的原因而存在,PnP管理器确信在总线驱动程序和任何总线过滤器驱动程序之后装载了这样的驱动程序。PnP管理器调用过滤器驱动程序的AddDevice例程,在它的AddDevice例程里,低层的过滤器驱动程序为设备产生一个过滤程序DO且附着它到设备堆栈里。如果不止一个低层过滤器驱动程序存在,每个这样的驱动程序将产生并附着它自己的过滤程序DO。

功能驱动程序为设备产生一个FDO。(上层那些”中间驱动”中的”类驱动”,则又称为”功能驱动”,相应的对象则称为FDO,即”Functional Device Object”。至于”中间驱动”中的”过滤驱动”,倒没有别的称呼,相应的对象就称为FiDO,即”Filter Device Object”,但是按过滤驱动的安装位置在类驱动的上面或下面又有”上过滤”和”下过滤”之分。)

PnP管理器确信已安装了设备的功能驱动程序并调用功能驱动程序的AddDevice例程,功能驱动程序产生一个FDO并附着它到设备堆栈里。

可选择的,顶层过滤器驱动程序为它们过滤的每个设备产生过滤程序DO。(过滤驱动,则依附于类驱动或端口驱动,目的在于拦截类设备驱动与端口设备驱动之间的信息,以实现某些统计、监视、修改乃至重定向的操作。)

如果任何可选择的,顶层过滤器驱动程序为设备而存在,PnP管理器确信在功能驱动程序调用它们的AddDevice例程之后被安装,每个这样的过滤器驱动程序附着它的设备对象到设备堆栈。

总之,设备堆栈包括每一驱动程序的设备对象,该驱动程序参与了特定设备的I/O处理。父总线驱动程序有一个PDO,功能驱动程序有一个FDO,每一个可选择的过滤器驱动程序有一个过滤程序DO。

注意到所有的设备—总线适配器/控制器设备和非总线设备—在它们的设备堆栈里有一个PDO和FDO。总线适配器/控制器的PDO由父总线的总线驱动程序产生。例如,如果一个SCSI适配器插入一个PCI总线,PCI总线驱动程序为SCSI适配器产生一个PDO。

如果一个设备正以原始模式使用,则没有功能驱动程序或过滤器驱动程序(没有FDO或过滤程序DO)。此时还有父总线驱动程序的一个PDO和零个或更多总线过滤程序DO。

要获取哪一个驱动程序例程负责产生和附着设备对象的信息,参看第2章。

设备堆栈和一些额外信息构成了一个devnode设备。在一个设备的devnode里,PnP管理器保留诸如是否设备已经启动和哪一个驱动程序,如有,登记通知设备上的改变。内核调试程序devnode命令显示了关于一个devnode的信息。

 

此条目发表在 windows驱动开发 分类目录,贴了 , , , , , 标签。将固定链接加入收藏夹。

发表评论