<<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、