2656|4

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

过滤驱动问题:确保过滤驱动刚刚好处于设备驱动的上一层; [复制链接]

当一个设备栈是这样:

Device\0
  ATT: Device\B

你再挂个 驱动A 上去,正常操作下会是这样:

Device\0
  ATT: Device\B
    ATT: Device\A

那么,IRP 发往 A->B->0 ,0 完成了IRP后再'回卷': 0->B->A ,就是说,当一个IRP被完成后在返回的途中,B 是可以修改这个IRP的,那么,A 就要受到 B 的限制,有可能 B 在IRP完成后返回的途中修改了IRP中携带的信息,致使 A 无法正确获得相关信息;

逻辑思维上很简单,把这两个过滤驱动的位置调换一下,变成 IRP(开始发送) -> B -> A ->0(完成IRP)-> A -> B ;

只要确保 驱动A 刚刚好处于 Device\0 的上一层;

我想了个笨办法:驱动A 先去查找 0 的上一层驱动(AttachedDevice),如果存在,记录这个设备的指针,再摘除掉(IoDetachDevice),然后才开始挂载 A ,接着,再挂载刚才记录下的设备 - 这样,保证了 A 刚刚好处于 0 的上一层;变成:

Device\0
  ATT: Device\A
    ATT: Device\B

-----> 看似问题已经解决了,但是没有: (再看看IRP的发送过程)

IRP(开始发送) -> B -> .... 发送到哪里了呢?会是 A 吗? 不是!!!  而会是这样:
IRP(开始发送) -> B -> 0    没有发送到 A , 而是直接发送到了 0 ;

因为在驱动A加载之前,B 就获得了下一层驱动( Device\0 )的指针,B 进行了 IoCallDriver( "Device\0的指针", Irp );
所以,当 B 接收到IRP后,把IRP直接传递到了  Device\0 , 没有传递给 A ;

看来要使 A 获得IRP,要么修改 B 原来就已经储存好了的 "Device\0的指针" 为 A 的指针,以使 B 能把IRP传递给 A ;
要么,把 Device\0 '移走', 让 A 去占据'位置', 以使 B中的 "Device\0的指针" 指向 A , 那 Device\0 本身又往哪里去呢?

要么....
要么....

希望能给出办法,详细一点,感激不尽啊!

最新回复

FortheC ,你可能没理解透驱动程序模型,忽略啦加载顺序的重要性。因为不管是fdo还是fido,它们附加在设备堆栈树的方法都是通过调用IoAttachDeviceToDeviceStack(xdo,pdo),x代表f或者fi,pdo代表物理设备对象。函数返回值是设备堆栈树没附加之前的最顶层的xdo.所以你的问题解决办法就是如Kenny_Glacier说的方法。  详情 回复 发表于 2008-10-11 17:11
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以说这种要求是做不到的,我能想到的方法是设法让你的驱动比其它同类驱动先加载,可以试试改一下驱动服务的名称和其它与加载顺序有关的注册表键值。
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1.可以通过修改注册表等方法修改加载顺序
2.A在AddDevice的时候就获得过Device0的DeviceObject pointer,所以A可以直接向Devie0发irp而不经过B,B是看不到这个IRP的
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
FortheC ,你可能没理解透驱动程序模型,忽略啦加载顺序的重要性。因为不管是fdo还是fido,它们附加在设备堆栈树的方法都是通过调用IoAttachDeviceToDeviceStack(xdo,pdo),x代表f或者fi,pdo代表物理设备对象。函数返回值是设备堆栈树没附加之前的最顶层的xdo.所以你的问题解决办法就是如Kenny_Glacier说的方法。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
FortheC ,你可能没理解透驱动程序模型,忽略啦加载顺序的重要性。因为不管是fdo还是fido,它们附加在设备堆栈树的方法都是通过调用IoAttachDeviceToDeviceStack(xdo,pdo),x代表f或者fi,pdo代表物理设备对象。函数返回值是设备堆栈树没附加之前的最顶层的xdo.所以你的问题解决办法就是如Kenny_Glacier说的方法。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表