mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1248回复:1

突然移除设备时IoCancelIrp返回0并出现错误,求助!

楼主#
更多 发布于:2004-11-22 13:42
我用DS开发的一个USB驱动,看起来工作很正常,但是在突然拔出设备的时候,SoftICE弹出Error,提示:BOOL:0 is an invalid return value for IoCancelIrp.

注意IoCancelIrp是BOOLEAN的返回值,返回0就是FALSE无可厚非。

我的USB Interrupt接受使用的是轮询的IRP,即发起一个读请求,然后等待返回。如果没有返回就一直轮询的等下去。如果有数据读回就去处理这些数据。

当我使用设备管理器禁用设备时,会进入到Halt例程,设置一个bHalt的标志,这时正处理轮询等待的IRP们会发现这个标志,在完成例程的一个计数器自减到0,进而设置一个事件通知Halt可以IoCancelIrp了。在Halt里边IoCancelIrp依次Cancel每个未完成的Irp,最后删除这些Irp。以上步骤都会依次实施并正常停用。

但是当我突然移除设备时,跟踪发现每个未完成(Outstanding)的Irp都会在Irp.status()置0xC0000120(是Cancel而不是disconnect)。然后进入了Halt例程,依次IoCancelIrp(每个轮询的Irp)--这时随着cancel每个Irp,都会弹出Error,提示:BOOL:0 is an invalid return value for IoCancelIrp。




[编辑 -  11/22/04 by  mboma]
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-22 23:27
论坛真是宝地啊 每次有问题一发帖自己灵感就来了 问题已经解决!
BoundsChecker在作怪!
游客

返回顶部