首页
社区
课程
招聘
[求助]IoSetCompletionRoutine设置的完成例程属于哪层io堆栈?
发表于: 2013-11-6 11:25 5807

[求助]IoSetCompletionRoutine设置的完成例程属于哪层io堆栈?

2013-11-6 11:25
5807
不知道张帆的书有无写错或者我理解错,里面的IoSetCompletionRoutine宏解释是得到下层的io堆栈,然后把回调地址写入,可是完成例程里对irp的操作完全像对本层的io堆栈的操作,也同样重复设置了这个完成例程,同样使用IoCallDriver?
要是IoSetCompletionRoutine设置在本层io堆栈就好理解:当irp被完成,irp层层往上回滚,遇到哪层io堆栈有完成回调例程的就调用,这样在例程中重复设置完成例程以及iocalldriver也好理解。问题就在IoSetCompletionRoutine书上的宏解释是:
irpSp=IoGetNextIrpStackLocation((irp));
irpSp->CompletionRoutine=(Routine);





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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
上图是说设置下层的完成例程,下图是例程代码,里面同样设置下层完成例程,然后iocalldriver,这样io堆栈都被耗完了。。应该怎么理解?
2013-11-6 11:48
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在写功能驱动时不是将一个大读写量的irp请求分成多个小读写量的irp吗,他的做法就是在完成例程里这样重复设置本完成例程。。
2013-11-6 11:58
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
完成例程存在的意义在于

捕捉下层驱动完成操作的时机(可以用于释放资源、也可以用于再次把IRP下发)

你把完成例程设置在本层有意义吗?
你处理没处理完自己还不知道???

所以完成例程要设置在下层、让下层完成时调用你的完成例程。
2013-11-6 11:59
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那当我们设置的完成例程被调用时,所操作的io堆栈被操作系统设置成本层吧?
2013-11-6 14:19
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6


我听晕了。。。自己去研究

IRP 和 IO_STACK_LOCATION数组 与 分层驱动结构的关系。。。

不懂就去看代码。。。

看不懂我也没办法。。。
2013-11-6 15:34
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我在看雪看到另一贴在也是这个问题,以及网上搜了下,发现我的猜想大概没错。原来驱动开发如此简单~
2013-11-6 15:37
0
游客
登录 | 注册 方可回帖
返回
//