阅读:2926回复:3
请教有关IRP和IRP栈的问题。
irp是I/O管理器发出的I/O请求,定义为一个结构,里面包含了IoStatus等属性,而Irp堆栈是由谁建立的呢?也是I/O管理器么?
关于这两者之间在使用上有什么区别呢? 好像在具体使用的过程中,主要都是在使用Irp堆栈的东西, 他们之间应该如何区别,有什么不同的地方呢? 在具体用的时候又要注意些什么呢〉 谢谢各位大虾的指点:) |
|
|
沙发#
发布于:2002-04-06 15:30
irp是I/O管理器发出的I/O请求,定义为一个结构,里面包含了IoStatus等属性,而Irp堆栈是由谁建立的呢?也是I/O管理器么? Win2000 WDM驱动程序是包驱动的,IRP是其中一个非常重要的数据结构。 一个IRP是从非分页内存中分配的可变大小的结构,它包括两部分:IRP首部(也称为头部)和I/O堆栈位置(IrpStackLocation)。这两部分都是由I/O Manager(I/O管理器)建立的。IRP结构中的内容并不固定,随着请求类型的不同而有较大不同。 IrpStackLocation的主要目的是,保存一个I/O请求的函数代码和参数。通过检查堆栈位置的MajorFunction字段,驱动程序能够确定执行什么操作及如何解释Parameters共用体(union)字段的内容。 对于一个直接发送到最低级驱动程序的请求,其相应的IRP只有一个I/O堆栈位置。对于发送到较高级驱动程序的请求,I/O 管理器建立一个在每个驱动程序层有不同I/O堆栈位置的IRP。换句话说,I/O StackLocation的数量实际上是参与I/O 请求的I/O 层的数量,或者是设备栈的深度(depth).只允许层次结构中的每个驱动程序接触它自己的I/O Stack Location.如果它想调用一个更低级的驱动程序,它必须保证新的I/O StackLocation在它的下面的位置被正确地建立。这可以使用如IoCopyCurrentIrpStackLocationToText,IoAllcateIrp等例程来设置。 Best regards ! |
|
|
板凳#
发布于:2002-04-06 20:36
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2002-04-07 16:26
谢谢两位的解释,我会继续努力学习的;0
|
|
|