lwglucky
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望129点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1446回复:10

关于分层驱动程序中IoCompleteIrp的问题。

楼主#
更多 发布于:2004-07-08 09:35
假设有分层驱动程序从上到下一次是I、II、III.
现在假设驱动程序II从I上受到一个Irp,这个Irp可能II或者III都会处理,所以,II就自己保留了一份,同时CallNext传递给了III.这时II,III都是排队处理Irp队列.
现在问题是,如果在某个条件下,II需要IoCompleteRequest掉这个Irp了,这是时候,会不会影响到III上(III上排队处理到这个Irp时会不会出问题)??如何使III知道这个Irp已经被II处理了???

---------------------
谢谢大侠

[编辑 -  7/8/04 by  lwglucky]
眼底手高
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-07-08 10:15
好像不可以哦。 IoComplete不能随便调的 :P
lwglucky
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望129点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-08 10:58
但是这个问题经常碰到啊,比如说II、III层都在排队一个Irp,这个时候I将Irp取消了(比如说程序关闭了),这个时候留在II,III队列中的Irp该怎么办呢??
眼底手高
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-08 11:27
不太明白你的意思,
如果II调用了IoComplete,III不知情而继续调用IoComplete,肯定会出错。此时,应该定义个事件或callback通知III吧。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-07-08 12:24
1、自己保留了一份是指什么?把irp的内容copy出来?还是保存这个irp的地址?
2、如果用把irp给下层了,就失去了对这个irp的控制,除非再得到这个irp的控制权(比如,完成例程),否则不要去动它;
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-07-08 13:01
但是这个问题经常碰到啊,比如说II、III层都在排队一个Irp,这个时候I将Irp取消了(比如说程序关闭了),这个时候留在II,III队列中的Irp该怎么办呢??


这些由I/O Manager来处理,我们不用管它 :D  不过到底是怎样处理的,俺也不清楚。

arthurtu:给大家点解点解? :)
jzyhummel
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-07-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-08 13:58
我是初学者,我讲讲我的理解:
从上到下1,2,3层,从1来了个IRP,2收到后,作自己的处理,做完后用IoSkipCurrentIrpStackLocation()拷贝IRP堆栈到下层的堆栈里面,然后用IoCallDriver()把IRP传到下层也就是3的那层

不知道我理解得对吗?
lily311
驱动小牛
驱动小牛
  • 注册日期2002-08-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望26点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-08 15:08
楼主对IRP传递的模型好像理解得不太对喔。
建议看一下这个帖子。
Kernel Mode discussion and Soft Driver -〉IRP 乱杂谈
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-09 00:13
IoCompleteRequest只能由一个driver来调用,否则BSOD,会出来专门的一个Bug Check Code ;)

如果是用system的queue,不用管。如果是用自己的queue,传下去前设completion routine的cancel,在里面把它remove掉
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-27 00:39
irp实际上有2部分组成,一步凤是头,另一部分叫做IO_STACK_LOCATION ,对于每一层驱动,都将分配一个。

irp包有上层驱动调用calldriver传到下层驱动,一次创下,当某个驱动觉得它可以处理这个irp包时,他将调用IoCompleteRequest,这样,这个irp包就完成了,下层驱动根本不会知道曾经有这么一个irp包。
值得注意的是,在某一层调用IoCompleteRequest后,他的上层驱动如果注册了完成历程,那么,他将获得机会做再次的处理,当然,完成历程只能饭后某个状态,而不能再次调用IoCompleteRequest了,否则,就有问题了
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
lwglucky
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望129点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-27 18:16
IoCompleteRequest只能由一个driver来调用,否则BSOD,会出来专门的一个Bug Check Code ;)

如果是用system的queue,不用管。如果是用自己的queue,传下去前设completion routine的cancel,在里面把它remove掉

------------
这个答案就是我想要的,但是我想明白的是这个irp下去后,上层驱动是否可以主动调用IocanelIrp触发completion routine的cancel呢??  否则这个cancel routine在哪里/什么时候被触发呢??
眼底手高
游客

返回顶部