版块
论坛
喜欢
话题
应用
搜索
登录
注册
xiaorain的个人空间
访问量
0
新鲜事
帖子
资料
http://bbs3.driverdevelop.com/index.php?m=space&uid=54736
app异常结束的时候,驱动里如何完成已经挂起或尚未完成的irp?
驱动中接受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)
回复
1
2
3
4
下一页 »
xiaorain
加关注
写私信
0
关注
0
粉丝
95
帖子
返回顶部