-
-
[求助]过滤驱动 中碰上的 蹊跷问题!
-
发表于:
2008-9-22 15:49
4291
-
近来弄个过滤驱动碰上个问题,百思不得其解,查遍相关资料都想不出问题出在哪里,只好来看雪请求各位大虾指点了;
有个设备,Device\0,我要在这个设备上挂一层过滤驱动;于是我弄了个驱动A,在驱动A里挂载这个Device\0,挂载后:
Device\0
ATT:Device\A
毫无疑问地,这是成功的,Device\A一切功能都是正常的,所有发往Device\0的IRP都将会首先发往Device\A;
我想再挂一层,于是我再写了个驱动B,挂载后:
Device\0
ATT:Device\A
ATT:Device\B
这也是没有问题的,IRP首先发往了 B , 再经过 A , 最后到达 Device\0;
但是,我有个要求,就是Device\A 无论何种情况下都要刚刚好处于Device\0的上一层,例,如果 B 先挂载了,再挂载 A,就会变成这样:
Device\0
ATT:Device\B
ATT:Device\A
这不是我想要的; 那么在无法控制这两个驱动进行挂载的先后顺序的时候,如何保证 A 刚好处于 Device\0 的上一层,方法一定有很多,不过我想到的方法一定是笨方法(当然是由于自己的技术不足):
A 在进行挂载之前,首先去查找 Device\0 的上一层驱动,如果有,记录下这个设备的指针,然后再 IoDetachDevice 摘除掉; 清干净后,接着就挂载 A , 然后再挂载刚才记录下来的设备; - 这样,保证了 A 刚好处于 Device\0 的上一层;
设 驱动程序A 在执行之前,B 就已经先行挂载了:
Device\0
ATT:Device\B
按照上面的那个方法, A执行后,很顺利地,变成了这样:
Device\0
ATT:Device\A
ATT:Device\B
可以看到,Device\A 插进去了,刚好处于 Device\0的上一层,这正是我想要的;
--------------------------------------------------------------------------------------------
看来很完美,一切都没有问题,但是!!! 却出现了一个致命问题:
所有发往Device\0的IRP都不会经过 Device\A ! 而只会发往 Device\B 然后直接到达 Device\0 ! Device\A 对于这个设备栈来说好象根本就不曾存在一样 ! 也可以这样说,B 可以正常工作,而 A 却几乎等于是废掉了,因为 IRP 没有经过 A;
无论从逻辑层面还是从技术层面来分析,我都不明白为什么会这样,我十分希望在看雪能得到答案,或者提示,感谢了!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课