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 。) 中级或最高级别的驱动程序还可以调用 IoBuildDeviceIoControlRequest、 IoBuildAsynchronousFsdRequest 或 IoBuildSynchronousFsdRequest ,以设置它发送到较低级别驱动程序的请求。 只有最高级别的驱动程序才能调用 IoMakeAssociatedIrp。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 10 (版本 1507 开始提供) |
目标平台 | 通用 |
标头 | wdm.h (包括 wdm.h、ntddk.h、ntifs.h) |
Library | ntoskrnl.lib |
DLL | ntoskrnl.exe |
IRQL | <= DISPATCH_LEVEL |