super9
驱动牛犊
驱动牛犊
  • 注册日期2008-08-06
  • 最后登录2009-04-29
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望99点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1938回复:4

由IoSetCompletionRoutine源代码引出的两点迷惑

楼主#
更多 发布于:2008-08-20 01:34
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了?
游客

返回顶部