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 分配的内存根据当前进程的配额收费。 此参数只能由在发起该驱动程序分配另一个 IRP 的线程上下文中调用的最高级别驱动程序 TRUE。 中间驱动程序应将此参数设置为 FALSE

返回值

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

言论

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

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

要求

要求 价值
最低支持的客户端 从 Windows 10 开始可用(版本 1507)
目标平台 普遍
标头 wdm.h (include wdm.h, ntddk.h, ntifs.h)
ntoskrnl.lib
DLL ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

另请参阅

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompletion

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine