IoSkipCurrentIrpStackLocation 函数 (wdm.h)
IoSkipCurrentIrpStackLocation 宏修改系统的 IO_STACK_LOCATION 数组指针,以便在当前驱动程序调用下一个较低级别的驱动程序时,该驱动程序接收与当前驱动程序收到的相同IO_STACK_LOCATION结构。
语法
void IoSkipCurrentIrpStackLocation(
[in, out] PIRP Irp
);
参数
[in, out] Irp
指向 IRP 的指针。
返回值
无
备注
当你的驱动程序向下一个较低级别的驱动程序发送 IRP 时,如果你不打算提供 IoCompletion 例程(存储在驱动程序的 IO_STACK_LOCATION 结构中的地址),则你的驱动程序可以调用 IoSkipCurrentIrpStackLocation。 如果在调用 IoCallDriver 之前先调用 IoSkipCurrentIrpStackLocation,则下一个较低级别的驱动程序会收到你的驱动程序所收到的相同 IO_STACK_LOCATION。
如果你打算为 IRP 提供 IoCompletion 例程,则你的驱动程序应调用 IoCopyCurrentIrpStackLocationToNext 而不是 IoSkipCurrentIrpStackLocation。 如果编写错误的驱动程序错误地调用 IoSkipCurrentIrpStackLocation ,然后设置完成例程,则此驱动程序可能会覆盖其上方驱动程序设置的完成例程。
如果该驱动程序挂起了某个 IRP,则该驱动程序在将该 IRP 传递给下一个较低级别的驱动程序之前,不应调用 IoSkipCurrentIrpStackLocation。 如果该驱动程序在将挂起的 IRP 传递给下一个较低级别的驱动程序之前对该 IRP 调用 IoSkipCurrentIrpStackLocation,仍会在下一个驱动程序的 I/O 堆栈位置的 Control 成员中设置 SL_PENDING_RETURNED 标志。 由于下一个驱动程序拥有该堆栈位置并可对其进行修改,因此它可能会清除挂起标志。 这种情况可能导致操作系统发出 bug 检查,或者 IRP 处理永远无法完成。
挂起 IRP 的驱动程序应在调用 IoCallDriver 之前先调用 IoCopyCurrentIrpStackLocationToNext,以便为下一个较低级别的驱动程序设置新的堆栈位置。
如果驱动程序调用 IoSkipCurrentIrpStackLocation,请注意修改 IO_STACK_LOCATION 结构的方式不能无意中影响较低级别的驱动程序,或运行该驱动器时的系统行为。 示例包括修改 IO_STACK_LOCATION 结构的 Parameters 并集或调用 IoMarkIrpPending。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 |
标头 | wdm.h |
IRQL | 任何级别 |