在本层驱动内完成历程内调用IoCompleteRequset会首先执行本层的完成历程还是上层的完成历程? 完成历程的回卷是从本层开始吗? 为什么我看wrk觉得是从本层开始。假如是本层,那么在本层的完成历程里调用IocompleteRequest不就在本层里死循环了吗? 说不通了呀
这是在看驱动编程技术详解的21章遇到的困惑。。
上代码:
NTSTATUS CompletionRoutine_32(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context)
{
  if(Irp->PendingReturned)
  {
  IoMarkIrpPending(Irp);
  }
  IoCompleteRequest(Irp,IO_NO_INCREMENT);
  return STATUS_MORE_PROCESSING_REQUIRED;
}

解决方案 »

  1.   

    IRP 会在设备栈一层一层的传下去,IoCompleteRequest 这个函数调用就是结束IRP的向下传递,直接返回了。如果要向下继续传递,得把当前设备栈向下拷贝或者跳过当前栈,并且调用IoCallDriver
      

  2.   

    你可以看下IoSetCompletionRoutine的定义
    #define IoSetCompletionRoutine(irp,routine,completioncontext,success,error,cancel)\
    #{ PIO_STACK_LOCATION irpsp;\
    #ASSERT((success)|(error)|(cancel)?(routine)!=NULL:TRUE);\
    #irpsp=IoGetNextIrpStackLocation((irp));\
    #irpsp->completionroutine=(routine);\
    #irpsp->context=(completioncontext);\
    #irpsp->control=0;\
    #if((success)){irpsp->control=SL_INVOKE_ON_SUCCESS;}\
    #if((error)){irpsp->control  |= SL_INVOKE_ON_ERROR;}\
    #if((cancel)){irpsp->control  |=  SL_INVOKE_ON_CANCEL;}  }\
    它将完成例程,设置到下一层IO_STACK_LOCATION 中,当IoCompleteRequest的时候它检查其返回值代码如果是STATUS_MORE_PROCESSING_REQUIRED回溯停止,IoCompleteRequest将停止前进并返回到调用者!
    因此最底层的驱动不应该有包含完成例程