Повторное использовать IRP

При определенных обстоятельствах водители могут повторно использовать IRP. Драйвер может выделить пул буферов памяти, который он использует для хранения IRP по мере их создания.

Драйверы не должны пытаться повторно использовать IRP, выданные диспетчером ввода-вывода. В частности, драйверы не должны пытаться повторно использовать irP, созданные подпрограммами IoMakeAssociatedIrp, IoBuildSynchronousFsdRequest, IoBuildAsynchronousFsdRequest или IoBuildDeviceIoControlRequest .

Драйверы могут безопасно повторно использовать созданные ИРП, как показано ниже.

  1. Если драйвер выделяет IRP в качестве необработанной памяти (например, путем вызова ExAllocatePoolWithTag), а затем инициализирует его с помощью IoInitializeIrp, он может безопасно вызвать IoInitializeIrp или IoReuseIrp для повторной инициализации буфера памяти.

  2. В операционных системах Microsoft Windows 2000 и более поздних версий драйверы, создающие IRP с помощью IoAllocateIrp , могут повторно использовать IRP, вызвав IoReuseIrp.

  3. Если драйвер выделяет IRP путем вызова IoAllocateIrp с параметром ChargeQuota , равным FALSE, он может безопасно использовать IoInitializeIrp для повторной инициализации IRP. Драйверы, которые должны работать в Windows 98/Me, могут использовать этот метод в качестве обходного решения. Драйверы, разработанные исключительно для операционных систем Windows 2000 и более поздних версий, должны использовать предыдущий метод.