xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2005-02-22 11:25
[quote][quote]或者,用个定时器检测超时,用CustomTimerDpc处理吧


这种方法对于自己创建的irp好像不可行。
我测试过,customerTimerDpc运行在dispatch_level上,在这个中断级上,不能等待。而如果我在customerTimerDpc中用IoCancelIrp取消自己创建的irp,此时立即就会进入此irp地完成例程,这样的话,我在customerTimerDpc中就要等待了,直到完成例程执行完毕。而在dispatch_level上是没法子等待的。
 [/quote]
下次customerTimerDpc中再处理不行吗? [/quote]

能详细说明一下吗?
我今天用了cancelroutine,也是不行,cancelroutine 运行在dispatch_level上。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-02-22 10:58
[quote]或者,用个定时器检测超时,用CustomTimerDpc处理吧


这种方法对于自己创建的irp好像不可行。
我测试过,customerTimerDpc运行在dispatch_level上,在这个中断级上,不能等待。而如果我在customerTimerDpc中用IoCancelIrp取消自己创建的irp,此时立即就会进入此irp地完成例程,这样的话,我在customerTimerDpc中就要等待了,直到完成例程执行完毕。而在dispatch_level上是没法子等待的。
 [/quote]
下次customerTimerDpc中再处理不行吗?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-02-21 11:23
或者,用个定时器检测超时,用CustomTimerDpc处理吧


这种方法对于自己创建的irp好像不可行。
我测试过,customerTimerDpc运行在dispatch_level上,在这个中断级上,不能等待。而如果我在customerTimerDpc中用IoCancelIrp取消自己创建的irp,此时立即就会进入此irp地完成例程,这样的话,我在customerTimerDpc中就要等待了,直到完成例程执行完毕。而在dispatch_level上是没法子等待的。
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-02-21 10:19
驱动中接受app得读请求,然后自己创建irp,注册完成例程,并把它发送给总线驱动,如果此irp尚未完成,此时app被异常结束(如结束任务)了,那我在驱动中应该如何处理irp呢?
如果是用计时器,在dpc例程中取消掉这个irp,然后等待。此时会进入完成例程,等到完成例程处理完毕,在设置事件。现在的问题是:
dpc例程运行在dispatch_level上,在这个irql上不能等待。

告诉我一个可行的方法把,谢谢先了。

异步读写一定会碰到这个问题吧,大家都是怎么解决的呢?

[编辑 -  2/5/05 by  xiaorain]


刚刚看到,如果是自己创建的Irp,那么肯定要自己负责调用IoCancelIrp来cancel这个自己创建的Irp了。
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2005-02-21 10:15
这种情况,我前段时间专门试验过。
当应用层某一个线程发送到驱动的Irp没有返回,就是说驱动IoMarkIrpPending,return STATUS_PENDING,这种情况下,若该线程步进行等待而要直接完成退出,那么该线程结束代码会要求I/O manager调用该Irp的cancel routien(如果有的话)。如果驱动中没有为该Irp设置cancel routine,那么该线程不会结束。
所以对于有可能无限期完成的Irp,最好设置cancel routine。当然如果你驱动中有一个定时器,定时对pending的Irp完成的话,就完全没有必要设置cancel routine.这段话DDK里边详细提过。

现在ddk提供了新的cancel routine的处理方法,CSQ。详细的清参考IoCsqInitialize等函数。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2005-02-21 09:58
或者,用个定时器检测超时,用CustomTimerDpc处理吧
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2005-02-21 09:13
cancelroutine是下层驱动在取消IRP或者应用程序调用CancelIo的时候才会被调用吧。
现在如果应用程序被结束任务了,应用程序不会调用cancelIo了,要想取消IRP,只能是下层驱动取消irp,然后上层驱动的cancelroutine才会被调用了。
下层驱动如何知道要取消Irp呢?我在驱动中设置了cancelroutine,在应用程序被结束任务的时候,cancelroutine没有被调用。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2005-02-07 09:59
驱动中接受app得读请求,然后自己创建irp,注册完成例程,并把它发送给总线驱动,如果此irp尚未完成,此时app被异常结束(如结束任务)了,那我在驱动中应该如何处理irp呢?
如果是用计时器,在dpc例程中取消掉这个irp,然后等待。此时会进入完成例程,等到完成例程处理完毕,在设置事件。现在的问题是:
dpc例程运行在dispatch_level上,在这个irql上不能等待。

告诉我一个可行的方法把,谢谢先了。

异步读写一定会碰到这个问题吧,大家都是怎么解决的呢?

[编辑 -  2/5/05 by  xiaorain]

在DPC中创建一个核心线程专门处理此事就可以了。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xuzheng318
驱动牛犊
驱动牛犊
  • 注册日期2005-01-24
  • 最后登录2005-03-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2005-02-06 15:03
怎么个注册法!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
29楼#
发布于:2005-02-06 09:41
[quote]注册CancelRountion

好像比较麻烦的 [/quote]
为什么???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2005-02-05 17:43
注册CancelRountion

好像比较麻烦的
在交流中学习。。。
HONGLIN
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2005-02-05 17:15
注册CancelRountion
不再困惑
上一页 下一页
游客

返回顶部