baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:2211回复:15

在IoCompletionRoutine里需要调用IoCompleteIrp吗?

楼主#
更多 发布于:2005-07-18 11:46
  标准过滤驱动程序里,我想建立一个IoCompletionRoutine来改变返回的数据,
但是在写框架的时候,
NTSTATUS completeirp(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp,IN PVOID Context){
       if(irp->PendingReturned){
              IoMarkIrpPending(irp);
              //IoCompleteIrp(irp);
              return STATUS_PENDING;
       }
       //IoCompleteIrp(irp);
       return STATUS_SUCCESS;
}

不知道这里的IoCompleteIrp是否需要,看了ddk很长时间也是云里雾里的,好像很多样例驱动里都没有,但是好像ddk又说如果下层不IoCompleteIrp,更上层的IoCompletionRoutine得不到调用??晕啊

还有一个问题是本来已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp??一个irp被完成了,状态还是pending?那么什么时候就不pending了?那个时候IoCompletionRoutine还会得到调用吗?

谢谢大家,我真是菜鸟,ddk越看越晕,唉~~

最新喜欢:

hunterforpighunter...
各类后门,木马,Exp,0day
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-18 12:32
实际上就是在IoCompleteIrp内部调用IoCompletionRoutine的,所以你在IoCompletionRoutine里就不要调用IoCompleteIrp了,不然乱套了
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-18 13:24
嗯,谢谢zhaock斑竹。
还有一个问题是本来已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp??一个irp被完成了,状态还是pending?那么什么时候就不pending了?那个时候IoCompletionRoutine还会得到调用吗?
谢谢……
各类后门,木马,Exp,0day
mptchenx
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2010-01-06
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-18 18:04
终于想起密码了 ~

/quote* 还有一个问题是本来已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp??//
不单单是 PendingReturned的irp  只要下层某驱动调用了IoCompleteIrp,就会在你设置的IoCompletionRoutine中收到

/quote* 一个irp被完成了,状态还是pending?那么什么时候就不pending了?那个时候IoCompletionRoutine还会得到调用吗?//

pending 只意味着 告诉上面 可能需要一段时间才complete。。这样上面IOCALLDRIVER就不用傻等了

/quote* 那个时候IoCompletionRoutine还会得到调用吗?//

会, IoCompletionRoutine在IoCompleteIrp上下文中调用 与pend不pending无关。。


                                                               chenx-python
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-18 22:37
chenx-python老兄,你就是救命稻草,呵呵~~
各类后门,木马,Exp,0day
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-18 23:10
但是我觉得“告诉上面 可能需要一段时间才complete。。这样上面IOCALLDRIVER就不用傻等了”可以通过直接return status_pending 但是不调用IoCompleteIrp呀,因为irp并未完成,应该等中断发生,真正完成的时候再调用IoCompleteIrp
各类后门,木马,Exp,0day
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-07-19 09:35
完成历程应该是这样
NTSTATUS CompletionRoutine(PDEVICE_OBJECT device, PIRP Irp, PVOID context)
{
  if (Irp->PendingReturned)
    IoMarkIrpPending(Irp);
  ...
  return STATUS_MORE_PROCESSING_REQUIRED;
}
而且也不能调用IoCompleteIrp 因为这个必须再设置完成历程之后调用,否则完成历程是不会被调用的。
---内核开发合作或提供基础技术服务QQ:22863668 ---
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-07-19 09:45
回答的不准确。这个问题说起来话长,试着解释一下。可以参看一下walter oney的windows driver model一书,有更为详细的解释
>>已经是IoCompletionRoutine了,为什么还会接受到PendingReturned的irp
>>一个irp被完成了,状态还是pending?那么什么时候就不pending了?
先解释一下PendingReturned的含义,这个PendingReturned是IoCompleteRequest循环处理每个
stack的时候附的值,Irp->PendingReturned = stackPointer->Control & SL_PENDING_RETURNED;
stackPointer->Control & SL_PENDING_RETURNED又是什么时候被附的值呢?
就是当你调用IoMarkIrpPending(Irp)的时候附的值。
 if(irp->PendingReturned){
           IoMarkIrpPending(irp);
    
IoMarkIrpPending是个宏,如下
#define IoMarkIrpPending( Irp ) ( \
    IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED )
可见PendingReturned含义是曾经调用过IoMarkIrpPending,并不是现在仍是pending状态,现在已经是完成的irp了。
至于这
 if(irp->PendingReturned)
           IoMarkIrpPending(irp);
 两条语句的含义,最好看walter oney,实在非三言两语可以说明白
mptchenx
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2010-01-06
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-07-19 11:54
to baiyuanfan
 倒了。。我说的就是通过直接return status_pending  不让上面傻等 跟IoCompleteIrp 无关

to zhao版,我只是简单说下pending。 并不是PendingReturned 。 你上面说的对  


if(irp->PendingReturned)
     IoMarkIrpPending(irp);  
存在的目的就是: 如果下层返回pending,让最高级栈IRP   SL_PENDING_RETURNED = 1 .
IoCompleteIrp会根据这个标志决定是否排个APC做些清理工作    


对于6楼的 你return STATUS_MORE_PROCESSING_REQUIRED 后 这时候IRP所有权你自己的了 除非这个IRP是你自己建立的 否则 你应该在另个例层中继续调用IoCompleteIrp完成IRP
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-07-19 13:05
对于楼主的情况,你可以在完成例程,停掉irp的complete处理

yourComplete(...)
{
    // 创建一个event,通过PVOID Context传递
    KeSetEvent(...);

   return STATUS_MORE_PROCESSING_REQUIRED;
}

你在IoCallDriver前,创建event,调用IoCallDriver后,如果返回pending则等待event
修改数据完了,你再完成这个irp

常用的做法
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-07-19 13:44
下面是引用arthurtu于2005-07-19 13:05发表的:
对于楼主的情况,你可以在完成例程,停掉irp的complete处理

yourComplete(...)
{
    // 创建一个event,通过PVOID Context传递
.......



arthurtu老大说的在很多ddk自己带的过滤驱动里都是这样子实现的,但是小弟有个疑问,就是这样会阻塞掉自己的驱动的dispatch的返回,使异步的io失去意义了。为什么不直接在自己驱动的dispatch里立刻返回,在完成例程本身里修改数据呢?

谢谢各位!
各类后门,木马,Exp,0day
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-21 09:48
下面是引用baiyuanfan于2005-07-19 13:44发表的:



arthurtu老大说的在很多ddk自己带的过滤驱动里都是这样子实现的,但是小弟有个疑问,就是这样会阻塞掉自己的驱动的dispatch的返回,使异步的io失去意义了。为什么不直接在自己驱动的dispatch里立刻返回,在完成例程本身里修改数据呢?

.......


just because sometimes u need synch process. and sometimes completion_routine runs at <= dispatch_level
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-07-21 10:44
下面是引用rayyang2000于2005-07-21 09:48发表的:


just because sometimes u need synch process. and sometimes completion_routine runs at <= dispatch_level

好久不见rayyang2000版主了,你的网站打不开了。http://www.ybwork.com/
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-07-21 11:28
就是, completion_routine 可能在passive,也可能在dispatch
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-07-23 21:18
upup
各类后门,木马,Exp,0day
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-07-23 21:22
那我就用普通的异步方式,直接在完成例程例修改数据也可以吧,让dispatch立刻返回
各类后门,木马,Exp,0day
游客

返回顶部