读书频道 > 系统 > windows > Windows内核原理与实现
6.5.5 过滤驱动程序的配置和加载
2013-05-20 08:48:12     我来说两句 
收藏    我要投稿   

本文所属图书 > Windows内核原理与实现

本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本...  立即去当当网订购

在一个即插即用设备的设备栈中,PDO和FDO是必需的,它们是确保该设备正常工作的基础。然而,正如图6.12 所示,在设备栈中还可以有多个可选的过滤设备对象,这些过滤设备对象位于FDO的上面或者下面,它们由相应的过滤驱动程序创建。Windows I/O 系统支持三种过滤驱动程序:总线过滤驱动程序、上层过滤驱动程序和下层过滤驱动程序。总线过滤驱动程序针对总线上所有的设备;而上下层过滤驱动程序分别针对特定的设备类或特定的设备实例,所以,它们又分为类过滤驱动程序和设备过滤驱动程序。这一小节我们将通过例子来说明不同类型过滤设备对象的创建过程。

总线过滤驱动程序是一种针对一条总线上所有设备的过滤驱动程序,它所创建的设备对象位于这些设备的设备栈的PDO 之上,但位于FDO 和其他过滤驱动程序之下。Windows和DDK的文档并没有描述如何创建和配置总线过滤驱动程序。作为一个典型的例子,ACPI驱动程序除了是一个总线驱动程序以外,也是一个总线过滤驱动程序。图 6.16 显示了一棵系统设备树的一部分,图中的粗体部分代表了总线过滤驱动程序创建的设备对象。PCI 总线上的设备,凡是支持ACPI的,都通过ACPI过滤驱动程序来执行设备电源策略和处理电源I/O 请求。那么这些ACPI设备对象是如何创建、由谁创建的呢?它们是由PCI总线的PDO ,即ACPI总线驱动程序创建的设备对象,在处理IRP_MJ_PNP 命令(IRP_MN_ QUERY_DEVICE_RELATIONS 子命令)时创建并附载到PCI 设备的设备栈中的。


 

总线过滤驱动程序改变或增强的是总线驱动程序的行为(即设备的PDO 的功能),它们总是位于设备的PDO之上,而且,多个总线过滤设备对象可以附载到同一个PDO上。

如果把toaster 例子中的6 个过滤驱动程序(其代码位于toaster\filter 目录下)编译出来,则可以得到名称不同的过滤驱动程序。若在安装toaster 总线和toaster 设备的驱动程序(通过“添加硬件向导”)时,指定该例子中提供的busf.inf和toasterf.inf 文件,则这些过滤驱动程序也会被安装到系统中。具体的安装步骤参见toaster 例子的 toaster.htm 文件。安装完成以后,我们可以得到图6.17 所示的设备栈,由此可以看到这6 个过滤驱动程序在设备栈中的位置。注意,toaster 例子并没有包含总线过滤驱动程序。在这 6 个过滤驱动程序中,BFdoUpr.sys和devupper.sys 是上层设备过滤驱动程序,clsupper.sys 是上层类过滤驱动程序;BFdoLwr.sys和devlower.sys是下层设备过滤驱动程序,clslower.sys 是下层类过滤驱动程序。


 

在toaster 例子中,toaster 设备的设备栈中包含了上下层的类和设备过滤设备对象,如图6.17(b) 所示。当即插即用管理器为一个 toaster 设备加载驱动程序时,它根据注册表中的信息来确定这些过滤驱动程序,并且调用驱动程序的增加设备例程,以便创建过滤设备对象并将其附载到设备栈中。在Windows Server 2003中,这一过程是在即插即用管理器的PipCallDriverAddDevice函数中完成的。

WRK没有提供PipCallDriverAddDevice函数的代码,该函数的职责是,检查一个设备节点的驱动程序是否已经加载,若有必要,则加载它所依赖的驱动程序。在PipCallDriverAddDevice函数被调用以前,设备节点中的 PDO(以及总线过滤设备对象,若有的话)已经创建完成,但是 FDO尚未创建。PipCallDriverAddDevice函数根据注册表中的信息,构造一个驱动程序列表,包括上下层过滤驱动程序,然后按照顺序逐个调用驱动程序的增加设备例程。在驱动程序的增加设备例程中,标准的做法是,首先调用IoCreateDevice 函数创建一个设备对象,然后通过IoAttachDeviceToDeviceStack 函数,将新建的设备对象加入到设备节点中。由于IoAttachDeviceToDeviceStack 函数总是将设备对象插入到设备栈的顶部,所以,PipCallDriverAddDevice 函数必须按照由下往上的顺序来调用增加设备例程。PipCallDriverAddDevice构造的驱动程序列表的顺序如下所示:

•  首先是设备列举键的LowerFilters值中指定的下层过滤驱动程序。设备的列举键位于注册表的HKLM\System\CurrentControlSet\Enum 下面该设备所对应的子键,例如,序列号为1 的toaster 设备的列举子键为{B85B7C50-6A01-11d2-B841-00C04FAD5171} \MsToaster\1&2d12bed1&1&01,这是该设备节点的实例路径(InstancePath),其结构如6.3.3节所介绍。在这个例子中,此子键中的 LowerFilters值为“devlower ”,所以,devlower.sys 驱动程序首先被找到。

•  接下来是该设备的类键的LowerFilters值中指定的下层过滤驱动程序。设备的类键位于注册表的HKLM\System\CurrentControlSet\Control\Class 下面,例如,toaster 设备的类GUID 为{B85B7C50-6A01-11D2-B841-00C04FAD5171},所以,Class 键下面该GUID 键为toaster 设备的类键。在这个例子中,LowerFilters值为“clslower”,所以,clslower.sys 驱动程序也被加入到列表中。

•  然后是在设备的Service 键中指定的功能驱动程序。设备的 Service 键位于注册表的HKLM\System\CurrentControlSet\Services下面。例如,toaster 设备的 Service键为 oaster子键。于是,功能驱动程序toaster.sys 也被加入到列表中。

•  再接下来是设备列举键的UpperFilters值中指定的上层过滤驱动程序。类似地,在{B85B7C50-6A01-11d2-B841-00C04FAD5171}\MsToaster\1&2d12bed1&1&01 子键中,UpperFilters值为“devupper ”,所以,devupper.sys 被加入到列表中。

•  最后是设备类键的 UpperFilters 值中指定的上层过滤驱动程序。类似地,在toaster 设备类GUID键的 UpperFilters 值为“clsupper”,所以,clsupper.sys 被加入到列表中。经过以上搜索过程,PipCallDriverAddDevice 函数获得了设备节点的所有驱动程序,从而可以构造出该设备的设备栈。图 6.17(b) 正是以上完整搜索步骤的一个例子。而图6.17(a) 中的BFdoLwr.sys 和BFdoUpr.sys 驱动程序则是在 toaster 总线设备的列举键中的LowerFilters和UpperFilters值中指定的,该列举键位于 HKLM\System\CurrentControlSet\ Enum\Root\System\< nnnn> ,这里 nnnn是一个 4 位数字编号,从 0000开始,toaster 总线的具体编号取决于安装其总线驱动程序时已有系统设备(System Device)的编号情况。

以上描述了过滤驱动程序的搜索顺序,由于上面提到的UpperFilters和LowerFilters注册表值是多字符串类型(REG_MULTI_SZ),因此每个值都可以指定多个过滤驱动程序。从设计角度,这些值中指定的过滤驱动程序不应该依赖于它们在这些值中的顺序。譬如,一个下层类过滤驱动程序不应该要求它必须出现在LowerFilters值的某个特定位置上,但是,有一点是可以保证的,即它创建的设备对象一定位于FDO 和上层过滤驱动程序的下面。这些确定的和不确定的顺序关系会影响到I/O 请求在设备栈中的处理顺序。

即插即用管理器从LowerFilters和UpperFilters注册表值中获得的仅仅是过滤驱动程序的服务名,而过滤驱动程序真正的信息位于 HKLM\System\CurrentControlSet\Services下面。所有这些驱动程序,包括功能驱动程序和过滤驱动程序,如果尚未被加载到系统中,则通过IopLoadDriver函数被加载进来。

那么,有关过滤驱动程序的注册表信息如何建立起来呢?这是由过滤驱动程序的相应安装程序来完成,或者随功能驱动程序一起安装的。在安装设备(譬如通过系统的“添加硬件向导”)或软件时,通常有一个.inf 文件描述了驱动程序的相关信息,包括设备的类GUID、厂商信息、注册表路径,以及每个驱动程序单独的注册信息等。在toaster 例子中,我们可以看到多个这样的.inf 文件,包括本节前文提到的 busf.inf和toasterf.inf ,通过这两个文件中描述的信息可以建立起图6.17 中所示的包括过滤设备对象的设备栈。

关于toaster 例子的安装过程以及.inf 文件的内容,请参考 6.5.2节的介绍以及该例子随带的一些说明文件,也可以从Internet 上查看 Windows DDK中关于toaster 例子的联机文档
[TOASTER][TOASTER-DOC]。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.5.4 toaster 设备的设备栈
下一篇:6.5.6 非即插即用驱动程序
相关文章
图文推荐
3.4.4 进程生命期管
3.4.2 Windows应用商
3.4.1 Windows应用商
3.4 进程生命期管理
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站