xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1104回复:3

在取消主irp的时候如何取消辅助irp?

楼主#
更多 发布于:2004-12-01 20:56
一个usb的驱动,使用异步通信方式,应用中用readfile()来进行读,但是读取数据的长度是随便指定的。我在驱动的dispathread历程中构造很多个irp(携带urb)发送给usb下层驱动,现在我要在从设备读完所有数据后取消没有结束的irp。
是不是可以为irp_mj_read设置取消历程,然后在取消历程中将带urb的irp全部结束掉?
这是不是就是主irp和从irp的取消问题呢?我一直不太明白这个概念,高手们帮我解释一下吧。不胜感激。
还有取消历程是不是只有在显式调用IoCancelIrp的时候才能被调用呢??
分数不是问题。您的回答将拯救我于水深火热之中。谢谢了。
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-01 21:50
1、有个办法可以解决这种取消问题。把你的要发给下层驱动的irps放进一个队列里,然后在每个irp的完成例程里管理这个队列,在取消IRP_MJ_READ的IRP的时候,把这个队列里的正在等待的IRP给cancel掉,其他的就直接删除就可以了,因为同一时间其实只能有一个IRP在pending。
其实还有别的办法可以满足你的要求的,要学会利用完成例程。

2、取消例程就是当IRP被取消的时候被调用啊,不明白你说的显式调用什么意思。

xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-02 09:32
谢谢您的关心:).
显式是指
irp_mj_read这个irp是不是要我在调用了IocancelIrp()后才能进入它的取消历程?还是系统会自动调用呢?
您在应用中指定了要读取得数据的确切长度了吗〉?而不是随便指定一个数值,如1024?
现在就是因为应用中没有指定正确的长度,导致驱动这边很麻烦。
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-02 23:01
只有你自己发出的Irp才可以用IoCancelIrp来取消之,详细说明参考DDK。
在应用里不可能指定固定长度的,因为这个通用驱动要支持那么多的串口软件。
游客

返回顶部