重复使用 IRP

在某些情况下,驱动程序可以 重复使用 IRP。 驱动程序可以分配用于保存 IRP 的内存缓冲区池,因为需要创建它们。

驱动程序不得尝试重复使用 I/O 管理器颁发的 IRP。 具体而言,驱动程序不应尝试重用由 IoMakeAssociatedIrpIoBuildSynchronousFsdRequestIoBuildAsynchronousFsdRequestIoBuildDeviceIoControlRequest 例程创建的 IRP。

驱动程序可以安全地重用已创建的 IRP,如下所示:

  1. 例如,如果驱动程序将 IRP 分配为原始内存 (,方法是调用 ExAllocatePoolWithTag) ,然后使用 IoInitializeIrp 对其进行初始化,则可以安全地调用 IoInitializeIrpIoReuseIrp 以重新初始化内存缓冲区。

  2. 在 Microsoft Windows 2000 及更高版本的操作系统上,使用 IoAllocateIrp 创建 IRP 的驱动程序可以通过调用 IoReuseIrp 来重复使用 IRP

  3. 如果驱动程序在 ChargeQuota 参数设置为 FALSE 的情况下通过调用 IoAllocateIrp 来分配 IRP,则可以安全地使用 IoInitializeIrp 重新初始化 IRP。 必须在 Windows 98/Me 上运行的驱动程序可以使用此方法作为解决方法。 严格针对 Windows 2000 及更高版本操作系统设计的驱动程序应使用以前的方法。