对于刚学驱动的人来说,或许对IRP和IO stack location的关系还有点不清楚。这里就说说他们之间的关系。具体IRP 和IO stack location相关知识,会在以后文章中说明。下面先放上IRP和IO stack location结构的定义。可惜的是IRP是半透明的。
IO manager每次构造一个IRP数据包时都会分配一个或多个IO stack location,具体的数量依赖于相应设备栈的多少。在IRP结构中有保存了当前IO stack location的索引。其实IO stack location的位置其实紧接着IRP之后的。或许IRP的最后一个域应该是IO_STACK_LOCATION IoStackLocation[1],这只是我个人的猜测。这样做就可以很方便的得到指定的IoStackLocation了。既然是一个数组,可能有人会想到数组第一个应该就是在设备栈最顶端的设备了,其实不然,数组第一其实是最后一个。为什么这么做呢,我有在一本书上看到是说为了检测IoStackLocation的位置,在最后一个是预留使用,当检查到最后一个是0的时候,可以说已经到了能出来这个IRP的最低端了。这种做法可能防止访问异常的问题。集合看一下wrk中的代码,就会清晰一点了。IO stack Location中才保存了当前需要进行的操作类型,参数等信息。需要做文件系统驱动的人,肯定是更为的要熟悉这一结构了。
简单的说,IRP总是和IO stack Location在一起的,不管从位置布局上,还是从功能使用上。
本文详细阐述了IRP(I/O请求包)与IO堆栈位置(IO_STACK_LOCATION)之间的关系及其在驱动程序中的作用。介绍了这两种结构的定义,并解释了IO堆栈位置如何与IRP关联,以及它在设备栈中的排列方式。

被折叠的 条评论
为什么被折叠?



