IRP是一个内核“对象”,它是一个预定义的数据结构,带有一组对它进行操作的I/O管理器例程。I/O管理器接收一个I/O请求,然后在把它传递到合适的驱动程序栈中的最高驱动程序之前,分配并初始化一个IRP。
一个IRP有一个固定的首部和可变数目的IRP栈单元块。 IRP栈为向下生长的栈,具有先进后出的特点。
IoGetCurrentIrpStackLocation获取指向当前栈单元的指针。 在许多情况下,使用IoCopyCurrentIrpStackLocationToNext或者IoSkipCurrentIrpStackLocation函数把当前栈单元复制到下一个栈单元,如需要更改下一个栈单元,则使用IoGetNextIrpStackLocation得到指向这个栈单元的指针。
在IRP沿栈向上传递时,栈中每个驱动程序有机会再次处理它。要这样做,驱动程序必须使用IoSetCompletionRoutine函数挂接一个完成例程。 该完成例程信息存储在每个驱动程序的IRP栈单元中。
一个IRP有一个固定的首部和可变数目的IRP栈单元块。 IRP栈为向下生长的栈,具有先进后出的特点。
IoGetCurrentIrpStackLocation获取指向当前栈单元的指针。 在许多情况下,使用IoCopyCurrentIrpStackLocationToNext或者IoSkipCurrentIrpStackLocation函数把当前栈单元复制到下一个栈单元,如需要更改下一个栈单元,则使用IoGetNextIrpStackLocation得到指向这个栈单元的指针。
在IRP沿栈向上传递时,栈中每个驱动程序有机会再次处理它。要这样做,驱动程序必须使用IoSetCompletionRoutine函数挂接一个完成例程。 该完成例程信息存储在每个驱动程序的IRP栈单元中。