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 传递给下一个下一个驱动程序之前,驱动程序调用 IoSkipCurrentIrpStackLocation,则SL_PENDING_RETURNED标志仍会在下一个驱动程序的 I/O 堆栈位置的 Control 成员中设置。 由于下一个驱动程序拥有该堆栈位置并可能对其进行修改,因此它可能会清除挂起的标志。 这种情况可能会导致作系统发出 bug 检查或处理 IRP 永远不会完成。

相反,已插入 IRP 的驱动程序应调用 IoCopyCurrentIrpStackLocationToNext,以便在调用 ioCallDriver之前为下一个下一个驱动程序设置新的堆栈位置。

如果驱动程序调用 IoSkipCurrentIrpStackLocation,请注意不要以无意中影响较低驱动程序或系统针对该驱动程序的行为的方式修改 IO_STACK_LOCATION 结构。 示例包括修改 IO_STACK_LOCATION 结构的 参数 联合或调用 IoMarkIrpPending

要求

要求 价值
最低支持的客户端 Windows 2000
标头 wdm.h
IRQL 任何级别