阅读:1355回复:9
关于CompletionRoutine,不明白
在什么情况下需要使用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句都是作什么的 |
|
沙发#
发布于: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做额外的处理。 |
|
板凳#
发布于:2003-03-25 13:10
本层的驱动可能需要等待下层驱动工作完成,再做进一步的工作。故设置了完成例程,参数(Context)为一个EVENT。调用了下层驱动后就在这个EVENT上等待,COMPLETEROUTINE中Set这个EVENT,表示下层工作完成,等待事件的函数返回。就可以做后续的工作了。
|
|
|
地板#
发布于:2003-03-25 23:07
下发之后,还想要再一次处理的就要设置完成例程。下层驱动处理完之后,设置event,上层发现event后,转到完成例程开始处理。完成例程里写的是想要怎么处理。
1。2是声明、初始化 3不知道 4。如果下层发来的状态是pending,还在等待,那么就要调用IoMarkIrpPending例程,目的是阻止其余的调用。 5。复位event 够详细了吧 |
|
|
地下室#
发布于:2003-03-26 01:54
CompletionRoutine例程要做许多事,DDK文档上说得很清楚。
|
|
5楼#
发布于:2003-03-26 20:34
大家说得很明白了,你好歹给点分嘛,如果还不懂就得自己慢慢去看书了,哪有那么容易搞定的啊,驱动又不是漫画,呵呵
|
|
|
6楼#
发布于:2003-03-26 22:11
你以为我不想给呀,在站里下了一个东西,点了3次才搞定,分也被扣掉三次,刚换的分还没转过来:(穷穷
|
|
7楼#
发布于:2003-03-27 03:05
你以为我不想给呀,在站里下了一个东西,点了3次才搞定,分也被扣掉三次,刚换的分还没转过来:(穷穷 多灌水就来分了。 |
|
8楼#
发布于:2003-03-27 11:57
呵呵,大家都是穷人,所以要多来站上逛逛,多发贴,成大牛以后就有钱了哈
|
|
|
9楼#
发布于:2004-07-09 12:34
下发之后,还想要再一次处理的就要设置完成例程。下层驱动处理完之后,设置event,上层发现event后,转到完成例程开始处理。完成例程里写的是想要怎么处理。 这个解释好像不对吧? pendingreturn的意思,因该是IoComplete的lower device先 调用了IoMarkIrpPending,再调用了iocomplete的情况。 |
|
|