阅读:1938回复:4
由IoSetCompletionRoutine源代码引出的两点迷惑
1.
#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;} }\ 以上的定义中irpsp=IoGetNextIrpStackLocation((irp));为什么是IoGetNextIrpStackLocation,而不是IoCurrentIrpStackLocation?这是不是表示设置完成历程的驱动的下层驱动调用完成历程了了? 2. 书上说IO管理器给每层驱动都创建一个IRP堆栈,那么对于过滤驱动,也应该对应一层IRP堆栈单元A,在其passthrough中,调用iocalldriver前为什么有时还要调用ioskipcurrentirpstacklocation?IO管理器理应也为过滤驱动下层驱动准备了IRP堆栈单元B,直接iocalldriver,跳到此IRP堆栈单元B不就行了,如果ioskipcurrentirpstacklocation,那么下层驱动接收到的不也是IRP堆栈单元A了? |
|