首页
社区
课程
招聘
[旧帖] [求助]关于完成例程的调用源头 0.00雪花
发表于: 2010-5-28 17:45 1692

[旧帖] [求助]关于完成例程的调用源头 0.00雪花

2010-5-28 17:45
1692
一般在分发例程中设定的完成例程是由谁调用的?是一个系统线程还是中断例程还是都有可能?
磁盘驱动过滤中读例程设定的完成例程的调用源头是哪里?
谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 21
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人回答

2010-5-28 19:26
0
雪    币: 6790
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
3
IO完成例程的源头是IofCompleteRequest()函数,再通过IoSetCompletionRoutine设置完成例程时,完成例程被保存在了下一层IRP的irpstack中的CompletionRoutine成员里。以下是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; } }

当IofCompleteRequest()被调用时,它会自下而上地扫描IRP中的各层IO_STACK_LOCATION数据结构,如果相应标志位所表示的条件得到满足就加以调用。你可以去看看wrk或者ReactOS的源码。
2010-9-25 11:34
0
游客
登录 | 注册 方可回帖
返回
//