IoAllocateIrpEx 函数 (wdm.h)

IoAllocateIrpEx 从系统非分页池分配 IRP,可能具有 IRP 扩展。

语法

PIRP IoAllocateIrpEx(
  PDEVICE_OBJECT DeviceObject,
  CCHAR          StackSize,
  BOOLEAN        ChargeQuota
);

参数

DeviceObject

指向设备对象的指针,检查确定是否为 IRP 扩展添加空间。 当 DeviceObject 设置为 DEVICE_WITH_IRP_EXTENSION 时,还会为 IRP 扩展分配空间。

StackSize

要为 IRP 分配的最大堆栈位置数。 StackSize 必须至少等于下一个较低版本的驱动程序的设备对象的 StackSize ,但可以大于此值。 调用驱动程序无需在 IRP 中为自己分配堆栈位置。

ChargeQuota

ChargeQuota 设置为 TRUE 会导致为 IRP 分配的内存按当前进程的配额收费。 此参数只能由最高级别驱动程序设置 TRUE ,这些驱动程序在发起驱动程序为其分配另一个 IRP 的 I/O 请求的线程上下文中调用。 中间驱动程序应将此参数设置为 FALSE

返回值

IoAllocateIrpEx 返回指向已分配和初始化的 IRP 的指针;如果无法分配 IRP,则返回 NULL

注解

IoAllocateIrpEx 分配 StackSize 堆栈位置并初始化 IRP。 它不会将 IRP 与线程关联。 分配驱动程序必须释放 IRP,而不是将其补给 I/O 管理器。

中间或最高级别的驱动程序可以调用 IoAllocateIrpEx ,为它发送到较低级别的驱动程序的请求创建 IRP。 此类驱动程序必须初始化 IRP,并且必须在其创建的 IRP 中设置其 IoCompletion 回调例程,以便调用方可以在较低级别的驱动程序完成请求处理时释放 IRP。 IoAllocateIrp 会自动初始化 IRP 的成员。 请勿在首次使用 IRP 之前使用 IoInitializeIrp 初始化 IRP。 (可以使用 IoInitializeIrp 重复使用在某些特殊情况下已使用的 IRP。有关详细信息,请参阅 重用 IRP 。) 中级或最高级别的驱动程序还可以调用 IoBuildDeviceIoControlRequestIoBuildAsynchronousFsdRequestIoBuildSynchronousFsdRequest ,以设置它发送到较低级别驱动程序的请求。 只有最高级别的驱动程序才能调用 IoMakeAssociatedIrp

要求

要求
最低受支持的客户端 从 Windows 10 (版本 1507 开始提供)
目标平台 通用
标头 wdm.h (包括 wdm.h、ntddk.h、ntifs.h)
Library ntoskrnl.lib
DLL ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

另请参阅

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompletion

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine