我做了一个usb转虚拟串口的驱动,现在准备提供异步读写方式,因为同步的话,会导致应用在readfile的时候占用cpu时间太多。现在应用中使用readfile()来进行读取,由于他没有指定readfile中要读的数据的长度(总是指定为1024),所以在我的驱动中要构造很多的irp...
全文
回复(13) 2004-12-01 11:50 来自版块 - 内核编程
表情
AllenZh0000000a(00000386,2,0,23Ad45f9 ),感觉取消逻辑太复杂了,allenzh帮我讲一下好吗? 主irp和辅助irp的取消到底是如何进行的呢? 应该在辅助irp的完成历程中取消主irp吗? 主irp是自己主动取消(调用iocancelirp)还是由下...(2004-12-06 12:04)
lejianzShentu说得对,我前一段时间也遇到相似的情况。我在DISPATHC LEVEL层读USB数据,只有数据读到,该IRP才返回,没有读到,此IRP一直在等待。因此,在卸载时,总有一个IRP才等待。因此,我只有在REMOVE例程中取消才解决问题。 BTW,我用什么工具才能检查...(2004-12-05 13:55)
Shentu 对那些还在排队的 IRPs 直接用 STATUS_CANCELLED 完成就可以了。只有对那个正在 Pending 的 IRP 要用 IoCancelIrp()。(2004-12-03 17:30)
xiaorain感谢大家。:) tooflat你说的对,因为是usb设备,所以一个读irp下来,readfile()制定了长度,我要将这些长度分成64的长度,组成带urb的irp,然后发给下层驱动,但是因为readfile中的长度时胡乱制定的,比如说一直是1024,但是设备没有那末多的数据,于...(2004-12-03 10:19)
sean198148说说我的看法,IoCancelIrp好象通常都是系统调用的吧,用户线程结束irp没有完成时,系统调用IoCancelIrp,然后调用程序中提供的取消例程,或者用户显示调用win32 CancelIo引起你的取消例程被调用。 所以我感觉没有必要自己调用IocancelIrp吧。为...(2004-12-03 10:00)
tooflat我对楼主的方法是这样理解的: 应用层通过readfile来读取usb设备中的数据,但是因为数据对齐和长度的关系,需要多个(自己分配的)irp才能完成(为什么???),现在楼主因为某种原因要取消这些自己分配的irp(又是为什么????) 我的解决办法是不要取消irp,在处理...(2004-12-03 09:10)
Shentu我是在自己分配的irp的完成历程里取消自己分配的多余的irp。 我尝试了一下,在cancel的时候,有pagefault,错误是0000000A,driver_irql_not_less_or_equal, 再问一个问题阿,是不是一定要完成历程返回了才能说irp被彻底完成了?...(2004-12-02 22:41)
xiaorainIofreeIrp()好像不行把,如果只是把irp free掉了,可是并没有完成他们阿,那样的话,是不是这些irp会一直在等待?下层驱动可能在满足条件的时候完成他们的话,就会出现操作空内存了,不知道是不是这样? 下层驱动都会开辟自己的内存区来保存上层传下来的irp堆栈吗?? ...(2004-12-02 19:51)
xiaorain0000000a(00000386,2,0,23Ad45f9 ),感觉取消逻辑太复杂了,allenzh帮我讲一下好吗? 主irp和辅助irp的取消到底是如何进行的呢? 应该在辅助irp的完成历程中取消主irp吗? 主irp是自己主动取消(调用iocancelirp)还是由下...(2004-12-02 19:44)
AllenZh我是在自己分配的irp的完成历程里取消自己分配的多余的irp。 我尝试了一下,在cancel的时候,有pagefault,错误是0000000A,driver_irql_not_less_or_equal, 再问一个问题阿,是不是一定要完成历程返回了才能说irp被彻底完成了?...(2004-12-02 17:11)

返回顶部