安装驱动程序(3)--调整过滤驱动位置

    前面写了安装功能驱动,过滤驱动,本篇谈谈调整过滤驱动的位置。设备栈上总线驱动和功能驱动的数量比较固定,但过滤驱动就不一样了,可以不断的往设备栈上叠加。如果仅仅像垒书本一样,往现有堆栈顶添加过滤驱动使得设备栈的深度不断增加,倒也简单。但如果要调整一下过滤驱动的位置,比如从最顶端移到较低的位置,那该怎么做?本篇的写作目的就是回答这个疑问。

    仍然以toaster的过滤驱动为例(不要质问我为什么老拿它开刀,因为其他的我也不会大笑)。我为toaster添加了2个类下层过滤驱动:将clslower.sys一式两份,取名为clslower.sys和clslower1.sys。同时修改clafilter用以添加这对双胞胎:

下列为clslower.sys的inf文件clslower.inf
[Version]
signature = "$Windows NT$"
 
[SourceDisksNames]
1 = %ClasFilt.MediaDesc%

[SourceDisksFiles]
clslower.sys = 1 


[DestinationDirs]
DefaultDestDir = 12	; DIRID_DRIVERS

[DefaultInstall.NT]
CopyFiles = @clslower.sys
AddReg = ClassFilter_AddReg
 
[ClassFilter_AddReg]
HKLM, System\CurrentControlSet\Control\Class\{b85b7c50-6a01-11d2-b841-00c04fad5171}, LowerFilters, 0x00010008, clasfilt0


[DefaultInstall.NT.Services]
AddService = clasfilt0, , clasfilt_Service_Inst

[clasfilt_Service_Inst]
DisplayName    = %ClasFilt.SvcDesc%
ServiceType    = %SERVICE_KERNEL_DRIVER%
StartType      = %SERVICE_DEMAND_START%
ErrorControl   = %SERVICE_ERROR_IGNORE%
ServiceBinary  = %12%\clslower.sys


[Strings]
ClasFilt.SvcDesc	= "Lower Class 0 Filter Driver"
ClasFilt.MediaDesc 	= "Class Filter 0 Driver Disc"

SERVICE_KERNEL_DRIVER = 1
SERVICE_DEMAND_START  = 3
SERVICE_ERROR_IGNORE  = 0
REG_EXPAND_SZ         = 0x00020000
REG_DWORD             = 0x00010001

<pre name="code" class="cpp">下列为clslower1.sys的inf文件clslower1.inf

 
[Version]
signature = "$Windows NT$"

[SourceDisksNames]
1 = %ClasFilt.MediaDesc%

[SourceDisksFiles]
clslower1.sys = 1 


[DestinationDirs]
DefaultDestDir = 12	; DIRID_DRIVERS
 
[DefaultInstall.NT]
CopyFiles = @clslower1.sys
AddReg = ClassFilter_AddReg
 
[ClassFilter_AddReg]
HKLM, System\CurrentControlSet\Control\Class\{b85b7c50-6a01-11d2-b841-00c04fad5171}, LowerFilters, 0x00010008, clasfilt

[DefaultInstall.NT.Services]
AddService = clasfilt, , clasfilt_Service_Inst
[clasfilt_Service_Inst]
DisplayName    = %ClasFilt.SvcDesc%
ServiceType    = %SERVICE_KERNEL_DRIVER%
StartType      = %SERVICE_DEMAND_START%
ErrorControl   = %SERVICE_ERROR_IGNORE%
ServiceBinary  = %12%\clslower1.sys


[Strings]
ClasFilt.SvcDesc	= "Lower Class Filter Driver"

ClasFilt.MediaDesc 	= "Class Filter Driver Disc"

SERVICE_KERNEL_DRIVER = 1
SERVICE_DEMAND_START  = 3
SERVICE_ERROR_IGNORE  = 0
REG_EXPAND_SZ         = 0x00020000
REG_DWORD             = 0x00010001
右键安装这两个类过滤驱动后,可以看到如下结果:

注册表LowerFilter项显示toaster类设备有两个类下层驱动;设备管理器大概也是从注册表读取信息,因此有同样的值。用windbg查看toaster设备栈:

kd> !drvobj toaster  ;参看toaster驱动对象信息
Driver object (fffffa80051dbe70) is for:
 \Driver\toaster
Driver Extension List: (id , addr)

Device Object list:
fffffa8005a56bb0  fffffa80051dccc0
kd> !devstack fffffa8005a56bb0 ;toaster设备对象的设备栈信息
  !DevObj   !DrvObj            !DevExt   ObjectName
> fffffa8005a56bb0  \Driver\toaster    fffffa8005a56d00  -->toaster功能设备
  fffffa80059ce8c0  \Driver\clasfilt0  fffffa80059cea10  -->类过滤驱动
  fffffa8003e7a460  \Driver\clasfilt   fffffa8003e7a5b0  -->类过滤驱动
  fffffa8003dfb080  \Driver\busenum    fffffa8003dfb1d0  000000b6
!DevNode fffffa8004b2e9d0 :
  DeviceInst is "{B85B7C50-6A01-11d2-B841-00C04FAD5171}\MsToaster\1&79f5d87&0&01"
  ServiceName is "toaster"
windbg罗列了toaster设备栈的堆叠情况,从结果来看classfilter0堆叠在clasfilter之上。如果你看过前一篇文章,可能记得 删除驱动时会调用GetFilters,GetFilters通过GetDeviceRegistryProperty函数从注册表中获得过滤驱动的信息,返回的结果是一个字符串数组。对于这里的情况,字符串数组的内容应该包括clasfilt和clasfilt0两个字符串。移除驱动的时候,是把其中一个字符串从字符串数组中移除,然后再调用SetDeviceRegistryProperty把结果写回注册表。受此启发,你可能会想到,可以直接在注册表中调整两个字符串的位置,到达调整驱动位置的目的。为此,我们来验证这个猜想的正确性。

    验证的步骤如下:首先停用设备然后修改注册表LowerFilter,最后启用设备用windbg查看设备栈:


图为修改后注册表的值,重新启用设备,查看设备栈的值:

kd> !drvobj toaster
Driver object (fffffa80051dbe70) is for:
 \Driver\toaster
Driver Extension List: (id , addr)

Device Object list:
fffffa8005a12cc0  fffffa80051dccc0  
kd> !devstack fffffa8005a12cc0
  !DevObj   !DrvObj            !DevExt   ObjectName
> fffffa8005a12cc0  \Driver\toaster    fffffa8005a12e10  
<span style="color:#ff0000;">  fffffa8003fc7600  \Driver\clasfilt   fffffa8003fc7750  
  fffffa800408b040  \Driver\clasfilt0  fffffa800408b190 </span> 
  fffffa8003dfb080  \Driver\busenum    fffffa8003dfb1d0  000000b6
!DevNode fffffa8004b2e9d0 :
  DeviceInst is "{B85B7C50-6A01-11d2-B841-00C04FAD5171}\MsToaster\1&79f5d87&0&01"
  ServiceName is "toaster"
不出所料,设备栈中的过滤驱动果然发生了变化,猜想可行,接下来就是用程序实现调整驱动了。其实winddk已经实现了这部分代码为于src/setup/devcon/Cmds.cpp的cmdClassFilter函数中。这个函数对应于强大的devcon classfilter命令,可以通过devcon help classfilter查看命令帮助文档。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
网上这本书的电子版不好这,这是用money换来的——和大家分享! 由于书太大,我把书分成两部分别上传。 内容简介 本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。 本书内容主要来自作者多年的软件开发和教学、培训经验,通过实例由浅入深地介绍MyEclipse的基本应用,是一本强调实践技能的实用性指导图书。 本书内容丰富、技术全面、案例实用,而且所有的实例都以MyEclipse工程的形式组织,并按章节的顺序组织在附书光盘中,源代码工程都经过精心调试,可以直接导入MyEclipse中运行。 本书内容精练、重点突出、实例丰富,是Java程序开发人员必备的参考书,同时也可作为高等院校计算机及相关专业的教材。 图书目录 第1章 初识MyEclipse 1 1.1 MyEclipse简介 1 1.2 MyEclipse的安装 1 1.2.1 JDK的安装与配置 1 1.2.2 MyEclipse 7.0的安装和运行 4 1.3 获取和阅读MyEclipse帮助文档 5 1.4 本章小结 5 第2章 MyEclipse集成开发环境的使用 6 2.1 MyEclipse集成开发工具界面 6 2.1.1 MyEclipse的菜单栏 7 2.1.2 MyEclipse的工具栏 13 2.1.3 MyEclipse的透视图 14 2.1.4 MyEclipse的视图 17 2.1.5 MyEclipse的编辑器 20 2.1.6 MyEclipse的Tasks视图 22 2.1.7 MyEclipse的Bookmarks视图 24 2.2 MyEclipse中的资源管理 26 2.2.1 MyEclipse中的工作空间 26 2.2.2 MyEclipse中的Navigator视图 27 2.3 定制MyEclipse的工作台 33 2.3.1 定制工作台外观 34 2.3.2 定制快捷键 35 2.3.3 定制编辑器 36 2.3.4 定制工作台公共设置 36 2.4 MyEclipse中常用操作 36 2.4.1 配置JRE 36 2.4.2 设置编译路径 37 2.4.3 设置项目属性 38 2.5 本章小结 39 第3章 Java程序的开发 40 3.1 使用JDT编写Java项目 40 3.2 MyEclipse中的Java代码编辑器 43 3.2.1 Java代码编辑器基本功能 43 3.2.2 自定义Java代码编辑器 45 3.2.3 Java代码编辑器相关视图 50 3.3 MyEclipse中的Java代码编译器 51 3.4 MyEclipse中的Java代码调试器 52 3.4.1 Java项目的运行 52 3.4.2 Java项目的调试 53 3.5 MyEclipse中的Java代码搜索器 57 3.5.1 搜索功能 57 3.5.2 查找功能 58 3.6 MyEclipse中的Java代码重构支持 59 3.6.1 Java元素重命名 59 3.6.2 Java元素移动 60 3.6.3 Java元素复制 61 3.7 本章小结 61 第4章 Java开发的版本控制及SVN 62 4.1 版本控制与SVN 62 4.2 SVN服务器的安装与配置 62 4.3 MyEclipse连接SVN服务器 63 4.3.1 配置MyEclipse连接SVN服务器 63 4.3.2 将SVN服务器中的项目导入到MyEclipse 64 4.3.3 将MyEclipse中的项目提交到SVN服务器 65 4.4 本章小结 67 第5章 Java开发项目的软件测试工具——JUnit 68 5.1 软件测试简介 68 5.2 JUnit简介 68 5.2.1 JUnit的特点 69 5.2.2 JUnit的常用类和接口 69 5.3 在MyEclipse中设置JUnit 71 5.4 JUnit测试 72 5.4.1 JUnit测试用例 72 5.4.2 JUnit测试套件 75 5.5 JUnit应用实例:数据库程序单元测试 77 5.6 本章小结 80 第6章 Java Web应用程序的开发 81 6.1 Java Web应用程序概述 81 6.2 Tomcat服务器的安装和配置 82 6.2.1 Tomcat服务器的下载 82 6.2.2 Tomcat服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值