博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
W驱开技详.过滤驱动测试
阅读量:5796 次
发布时间:2019-06-18

本文共 1720 字,大约阅读时间需要 5 分钟。

<<Windows驱动开发技术详解>>

  对应 测试代码:"E:\Project_Keil\__Filter_ZC\_ZC_FilterDriver"(还未 弄完)

 

1、使用 第3章的 最简单的 WMD驱动做测试

 1.1、之前就有疑问,第3章的驱动能够 动态的卸载,但是 第12章的驱动却不能 动态卸载

  ZC:现在,有一些 感触,记录下来先:(第12章的驱动 应该算是 NT式驱动,下面的记录 应该也可以算是 NT式驱动和WDM驱动 的一些 区别感想)

   代码中的区别现象:(1)、没有 函数AddDevice(...) (2)、没有 IRP_MJ_PNP的处理

  ZC:我是这么理解的:WDM驱动 会在 AddDevice(...)中绑定底层的驱动的设备对象(一般是 PnP管理器),于是 可以将 PNP的处理 发给底层的驱动去做,这样就可以 即插即用了。 而NT驱动一般 没有AddDevice(...) 于是默认没有方便的PNP的处理 于是没有即插即用。 而个人理解:NT驱动 和 WDM驱动 没有 鸿沟,一个 NT驱动 在它添加了 AddDevice(...)+绑定了底层驱动+处理了IRP_MJ_PNP  之后,它也就变成了 一个WDM驱动了

 1.2、疑问:过滤驱动是什么时候加载的?是在底层驱动加载之后 再加载吗?

  底层驱动不加载的话,过滤驱动就不加载?底层驱动删掉的话,它的 注册表里面的LowerFilters表项 也没了吧,它所在的节点也应该被删掉了吧?

  1.2.1、第12章 Test1 里面的 过滤驱动 加载的方式 应该算是 硬挂上去的(代码中直接通过DriverA的驱动名找驱动对象,然后挂载)。看代码里面的情况,如果 在驱动DriverB未卸载的时候,驱动DriverA就卸载掉的话,不知会怎么样?如果此时 OS重启的话 DriverB就会变成 普通的NT驱动?? 未测试,待测试...

   ZC:可能 第12章 Test1 主要是为了演示 分层驱动

  1.2.2、圈圈 里面的 过滤驱动的安装方式 应该 算是动态的方式(配置注册表是关键)

   第22章 才是 真正的 过滤驱动讲解,有2种加载 过滤驱动的方式:(1)、对 硬件子键 设置 LowerFilters (缺点就是 特定,不通用) (2)、对 类子健 设置 LowerFilters (特点是 对一类设备进行过滤)(缺点:需要代码中判断 是IDE 还是USB 还是别的磁盘)

    圈圈 里面 也有 代码判断特定设备的东西,应该是 在安装时 通过注册表信息 判断 是 哪个类的哪个硬件,然后 对那个 硬件子健 进行 LowerFilters的设置

   ZC:其实 安装 过滤驱动 很简单,复制驱动程序到 系统指定目录 然后 设置注册表 LowerFilters 即可。麻烦的是 确定具体的 硬件子健,或者 代码中对某一类设备的 区分(更细化的话 就是能够 判断出 某一类设备里面的某一个设备)

2、IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, PDEVICE_OBJECT TargetDevice)

  MSDN:The IoAttachDeviceToDeviceStack routine attaches the caller's device object to the highest device object in the chain and returns a pointer to the previously highest device object.

  ZC:个人理解:该函数是将 SourceDevice 挂载到 TargetDevice所在设备堆栈的最高位置,至于TargetDevice是不是位于原本设备堆栈的最高位置 是无所谓的,该函数返回的就是 原本设备堆栈的最高位置的那个设备对象

3、

4、

5、

 

转载于:https://www.cnblogs.com/DriverSkill/p/10195763.html

你可能感兴趣的文章
HTTP权威指南----缓存
查看>>
State Pattern(状态模式)
查看>>
PHP setcookie() 首次存储不上值
查看>>
【转载】犀利的 oracle 注入技术
查看>>
统计英文文章中单词出现次数
查看>>
PriorityQueue详解
查看>>
cogs2060 除法表达式
查看>>
Bzoj2095 [Poi2010]Bridges
查看>>
剑指offer :跳台阶
查看>>
a href=#与 a href=javascript:void(0) 的区别(转)
查看>>
一步一步学Silverlight 2系列(10):使用用户控件
查看>>
一、Linux 安装
查看>>
类型转换和格式化
查看>>
bash arithmatic
查看>>
Visual Studio禁用IntelliSense
查看>>
VisualStudio自动编码插件(Autocode——devprojects.net)
查看>>
socket通信模块
查看>>
mongodb
查看>>
关于sql语句中加 1=1 的条件
查看>>
Android基本控件之GridView
查看>>