阅读:1997回复:19
对IRP的栈单元大家是怎么理解的
as title
每一个IRP请求是搁在栈中把,如果不是需要串行处理IRP,那么栈中就一个IRP? :( |
|
|
沙发#
发布于:2002-11-04 14:52
还是说一个IRP栈对应一个设备栈,当把IRP在设备栈中下传时把IRP复制到下一个IRP栈
|
|
|
板凳#
发布于:2002-11-04 14:54
好像第二种思路是对的 :D
|
|
|
地板#
发布于:2002-11-04 14:56
原因是当下层IRP完成后IRP往上传时,上层设备栈可能还要处理IRP,这样需要每层的IRP环境都要保留,呵呵。不知道想的对不对
|
|
|
地下室#
发布于:2002-11-04 15:12
老大自得其乐。我也来凑个热闹!!
任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序,另外还有一个堆栈单元供IRP的创建者使用。堆栈单元中包含该IRP的类型代码和参数信息以及完成函数的地址。 |
|
|
5楼#
发布于:2002-11-04 15:14
在完成IRP的过程中,这两个栈的数据是如何变化的? :D
|
|
|
6楼#
发布于:2002-11-04 15:20
向下传递IRP时,需要初始化一个IO_STACK_LOCATION结构,下一层驱动程序将使用该结构获取它的参数。一种方法是执行物理拷贝,象这样:
... IoCopyCurrentIrpStackLocationToNext(Irp); status = IoCallDriver(pdx->LowerDeviceObject, Irp); ... IoCopyCurrentIrpStackLocationToNext是WDM.H中的一个宏,它把当前堆栈单元的所有域,除了一个属于I/O完成例程的域,都复制到下一个堆栈单元。 |
|
|
7楼#
发布于:2002-11-04 15:24
一层的IRP对应一层的驱动,对把
|
|
|
8楼#
发布于:2002-11-04 15:35
好象不是!
WDM使用分层设备对象结构的目的就是使IRP能方便地从一层驱动程序传递到下一层驱动程序 层次结构可以使I/O请求过程更加明了每个影响到设备的操作都使用I/O请求包。通常IRP先被送到设备堆栈的最上层驱动程序,然后逐渐过滤到下面的驱动程序。每一层驱动程序都可以决定如何处理IRP。有时,驱动程序不做任何事,仅仅是向下层传递该IRP。有时,驱动程序直接处理完该IRP,不再向下传递。还有时,驱动程序既处理了IRP,又把IRP传递下去。这取决于设备以及IRP所携带的内容。 |
|
|
9楼#
发布于:2002-11-04 15:39
是啊,但是怎么把IRP传到下层驱动呢?不是通过拷贝到下一个IRP栈吗?上层的环境应该保留把,这种保留是保存在IRP栈中还是在设备栈中保存了到达该层的IRP信息?
|
|
|
10楼#
发布于:2002-11-04 15:42
讨论好
看看 :D |
|
|
11楼#
发布于:2002-11-04 15:44
都来了还不发表一下高见???
kick |
|
|
12楼#
发布于:2002-11-04 15:46
但是也可以不复制。刚才说了第一种方法,下面是另一种:
如果你的驱动程序不用关心IRP传递到下层驱动程序之后的事情,你可以利用一个捷径来避免复制堆栈单元。 没有必要花费处理器时间去把你的堆栈单元内容复制到下一个堆栈单元,因为那个堆栈单元已经含有下一层驱动程序要得到的参数,以及自己上一层驱动程序可能给出的任何完成例程指针。因此,你可以使用下面捷径方法: NTSTATUS ForwardAndForget(PDEVICE_OBJECT fdo, PIRP Irp) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(pdx->LowerDeviceObject, Irp); } 这个捷径存在于IoSkipCurrentIrpStackLocation函数(它实际上是一个宏,名字有些另人误解)中。这个宏的作用就是使堆栈指针少前进一步,而IoCallDriver函数会使堆栈指针向前一步,中和的结果就是堆栈指针不变。当下一个驱动程序的派遣例程调用IoGetCurrentIrpStackLocation时,它将收到与我们正使用的完全相同的IO_STACK_LOCATION指针,因此,它所处理的将是同一个请求(相同的主副功能代码)以及相同的参数。 可见堆栈还是哪个堆栈!! |
|
|
13楼#
发布于:2002-11-04 15:53
是啊,这是上层不关心低层驱动的情况,而这种做法只是效率上的问题,其实也可以看成是上层把该IRP一点不动的复制到下层,对把。现在问题是正常的情况下IRP栈的变化情况,可以看成一层IRP对应一层驱动,然后如果相邻的IRP相同的话可以用你的第二种方法简化?可以这么理解吗? :D
|
|
|
14楼#
发布于:2002-11-04 15:57
好像第二种思路是对的 :D nod |
|
|
15楼#
发布于:2002-11-04 15:58
一层的IRP对应一层的驱动,对把 欧认为是这样 |
|
|
16楼#
发布于:2002-11-04 15:59
我认为每层驱动有相应的IRP,而不是一层IRP对应一层驱动(这样何必传呢)。
|
|
|
17楼#
发布于:2002-11-04 16:01
但怎么看了那么多的资料都没点到这点,搞得我现在还是晕。 :D :D :D
|
|
|
18楼#
发布于:2002-11-04 16:06
我认为每层驱动有相应的IRP,而不是一层IRP对应一层驱动(这样何必传呢)。 我说的每一层IRP是需要下层驱动处理时才被复制,如果不需要往下传,就不需要复制IRP了。 |
|
|
19楼#
发布于:2002-11-04 16:07
不过不管怎么说我这思路还是理清楚了,散分散分 :D
|
|
|