驱动中接受app得读请求,然后自己创建irp,注册完成例程,并把它发送给总线驱动,如果此irp尚未完成,此时app被异常结束(如结束任务)了,那我在驱动中应该如何处理irp呢?如果是用计时器,在dpc例程中取消掉这个irp,然后等待。此时会进入完成例程,等到完成例程处理完毕,在设...
全文
回复(31) 2005-02-05 12:18 来自版块 - 内核编程
表情
xiaorain是我在完成历程里又访问了已经释放的内存导致了错误。现在修改已经可以了,谢谢大家的帮助,尤其感谢acidfish与bmyyyud的帮助。(2005-03-02 10:16)
xiaorain我用的是IOAllocateIrp. 我看了DDK的例子。都是在IoCancelIrp后等待完成历程执行完毕再继续执行下去。不等待的我没有尝试,现在不作这个了。 创建自己的irp队列也是一样的,照样要在cancelroutine中把没有做的free掉或者cancel掉。 ...(2005-02-28 21:14)
bmyyyud既然你设置不管IRP正常完成、失败、取消都要调用完成例程,在完成例程中取消你自己创建的IRP应该是最好的地方 即为你自己的每个新创建IRP的完成例程释放掉自己(2005-02-28 09:15)
lejianz我曾经也遇到相似的情况,我的做法是: 用一个列表结构,存储自己构造的IRP指针,当IRP正常完成时,删除掉它,如果异常退出,从列表中找到所有的IRP,Cancel它。不知这种方法对你是否可行。(2005-02-27 17:18)
bmyyyud既然你设置不管IRP正常完成、失败、取消都要调用完成例程,在完成例程中取消你自己创建的IRP应该是最好的地方(2005-02-26 08:52)
tooflat 谢谢你的关注:) 现在的问题是我结束应用程序发来的IRP的时候,对自己构造的irp没有影响,此时这个irp没有被完成,取消或者失败,也就是不会进入完成历程。 这几天作试验发现应用异常结束后,应用发来的IRP的取消历程立即被调用,但是几分钟后系统才调用dispatchCle...(2005-02-25 11:59)
acidfish这个话题,讨论了这么多,还没有解决方案吗? 我觉得大家提的方案都比较可行。选择其中一个就可以了。 还有我在提醒一下: 1、你自己创建发向底层的Irp用的是什么函数?用IoAllocateIrp要简单一些。要是用IoBuildDeviceIoControl的话,系统给你做了很...(2005-02-25 10:16)
xiaorain[quote][quote]简单的方法 这里有两个irp,一个是应用层发给驱动的irp,一个是驱动自己构造发给下层的irp 在应用程序退出的时候(异常退出或正常退出都可以),以失败状态完成应用层发的irp,然后在完成例程里直接free掉自己构造的irp 如何检测...(2005-02-24 21:18)
tooflat[quote]简单的方法 这里有两个irp,一个是应用层发给驱动的irp,一个是驱动自己构造发给下层的irp 在应用程序退出的时候(异常退出或正常退出都可以),以失败状态完成应用层发的irp,然后在完成例程里直接free掉自己构造的irp 如何检测应用程序(异常...(2005-02-24 17:33)
xiaorain简单的方法 这里有两个irp,一个是应用层发给驱动的irp,一个是驱动自己构造发给下层的irp 在应用程序退出的时候(异常退出或正常退出都可以),以失败状态完成应用层发的irp,然后在完成例程里直接free掉自己构造的irp 如何检测应用程序(异常)退出,简单的...(2005-02-24 12:56)

返回顶部