Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25782
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-30 15:29
文章分类

全部博文(11)

文章存档

2015年(11)

我的朋友
最近访客

分类: Windows平台

2015-02-26 13:34:18

IoSkipCurrentIrpStackLocation

分类: 编程 1453人阅读 评论(1)  举报

当驱动被分层以后,他们被注册到一个chain中,IRP会在这个chain中传递,从最上面,到最下面,再回到最上面 
为适应这种体制,IRP的结构的大小是不固定的,大体结构如下: 
-------------------- 
| IRP header | 
-------------------- 
|IO_STACK_LOCATION |<-----lowest driver stack location #index1 
-------------------- 
|IO_STACK_LOCATION |<-----next higher stack location #index2 
-------------------- 
|IO_STACK_LOCATION |<-----topmost driver stack location #index3 
-------------------- 
也就是说,chain的最顶层的驱动,对应的IO_STACK_LOCATION是在最下面 
IRP头中存放着当前驱动对应的IO_STACK_LOCATION的索引,是从1开始的,不是从0开始 
同时,也保存着当前驱动对应的IO_STACK_LOCATION的地址 
最上面的驱动处理完这个IRP后,调用IoCallDriver,这会使索引减1,地址也修正为下一个IO_STACK_LOCATION的地址, 
然后IRP被交给下一个Driver处理, 
而IoSkipCurrentIrpStackLocation宏的作用就是使IO_STACK_LOCATION指针少前进一步 
而IoCallDriver函数会使IO_STACK_LOCATION指针向前一步,中和的结果就是IO_STACK_LOCATION2006-11-20指针不变 
当下一个驱动程序的派遣例程调用IoGetCurrentIrpStackLocation时,它将收到与我们正使 
用的完全相同的IO_STACK_LOCATION指针,因此,它所处理的将是同一个请求(相同的主副功 
能代码)以及相同的参数。

阅读(967) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~