amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1355回复:9

关于CompletionRoutine,不明白

楼主#
更多 发布于:2003-03-25 10:48
在什么情况下需要使用CompletionRoutine例程,在该例程中都什么工作?
{
PKEVENT             event;   ――》1
event = (PKEVENT) Context;   ――》2
UNREFERENCED_PARAMETER(DeviceObject);  ――》3
 if (Irp->PendingReturned) {          ――》4
        IoMarkIrpPending(Irp);
    }
KeSetEvent(event, 0, FALSE);    ――》5
 return STATUS_MORE_PROCESSING_REQUIRED;
}
希望哪位大下给我解释一下这5句都是作什么的
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-25 11:49
这种摸样的Completion Routine一般是用来做irp同步处理的吧?
1.同步用的内核事件对象。在这里用来通知已经有IRP从下层返回;
2.该Completion Routine的参数。由调用IoSetCompletionRoutine时传入。在这里可以看出,传入的context即是用来做同步的event。
3.没什么用,只是象征性地舔一下DeviceObject,免得build时编译器会吐出warning。
4.这个实在是太复杂了,去看书吧,oney的讲得很详细。一般如果CompletionRoutine返回的status不是STATUS_MORE_PROCESSING_REQUIRED的话,都要加上这个东西。死背下来就行了。
5.激活这个事件,通知已经有IRP从下层返回,在等待该事件的线程应该对该IRP做额外的处理。
kenli79
驱动小牛
驱动小牛
  • 注册日期2002-06-12
  • 最后登录2003-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-25 13:10
本层的驱动可能需要等待下层驱动工作完成,再做进一步的工作。故设置了完成例程,参数(Context)为一个EVENT。调用了下层驱动后就在这个EVENT上等待,COMPLETEROUTINE中Set这个EVENT,表示下层工作完成,等待事件的函数返回。就可以做后续的工作了。
超级菜鸟!!!!!!!!!
godhuntress
驱动小牛
驱动小牛
  • 注册日期2002-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-25 23:07
下发之后,还想要再一次处理的就要设置完成例程。下层驱动处理完之后,设置event,上层发现event后,转到完成例程开始处理。完成例程里写的是想要怎么处理。

1。2是声明、初始化
3不知道
4。如果下层发来的状态是pending,还在等待,那么就要调用IoMarkIrpPending例程,目的是阻止其余的调用。
5。复位event

够详细了吧
武汉新手前来报道! 请不佞赐教!
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-26 01:54
CompletionRoutine例程要做许多事,DDK文档上说得很清楚。
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-26 20:34
大家说得很明白了,你好歹给点分嘛,如果还不懂就得自己慢慢去看书了,哪有那么容易搞定的啊,驱动又不是漫画,呵呵
早起早睡 精神百倍
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-26 22:11
你以为我不想给呀,在站里下了一个东西,点了3次才搞定,分也被扣掉三次,刚换的分还没转过来:(穷穷
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-27 03:05
你以为我不想给呀,在站里下了一个东西,点了3次才搞定,分也被扣掉三次,刚换的分还没转过来:(穷穷


多灌水就来分了。
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-27 11:57
呵呵,大家都是穷人,所以要多来站上逛逛,多发贴,成大牛以后就有钱了哈
早起早睡 精神百倍
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-09 12:34
下发之后,还想要再一次处理的就要设置完成例程。下层驱动处理完之后,设置event,上层发现event后,转到完成例程开始处理。完成例程里写的是想要怎么处理。

1。2是声明、初始化
3不知道
4。如果下层发来的状态是pending,还在等待,那么就要调用IoMarkIrpPending例程,目的是阻止其余的调用。
5。复位event

够详细了吧

这个解释好像不对吧?
pendingreturn的意思,因该是IoComplete的lower device先
调用了IoMarkIrpPending,再调用了iocomplete的情况。
不停学习
游客

返回顶部