IoAllocateIrp 函数 (wdm.h)

IoAllocateIrp 例程分配 IRP,给定调用方下分层的每个驱动程序的 I/O 堆栈位置数,以及调用方(可选)的 I/O 堆栈位置数。 另请参阅 IoAllocateIrpEx

语法

PIRP IoAllocateIrp(
  [in] CCHAR   StackSize,
  [in] BOOLEAN ChargeQuota
);

参数

[in] StackSize

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

[in] ChargeQuota

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

返回值

IoAllocateIrp 返回指向从非分页系统空间分配的 IRP 的指针;如果无法分配 IRP,则返回 NULL

注解

IoAllocateIrp 例程不会将 IRP 与线程相关联。 分配驱动程序必须释放 IRP,而不是将其补给 I/O 管理器。

中间或最高级别的驱动程序可以调用 IoAllocateIrp 来创建 IRP,以便为它发送到较低级别的驱动程序的请求创建 IRP。 此类驱动程序必须初始化 IRP,并且必须在其创建的 IRP 中设置其 IoCompletion 例程,以便调用方可以在较低级别的驱动程序完成请求处理时释放 IRP。

IoAllocateIrp 会自动初始化 IRP 的成员。 请勿在首次使用 IRP 之前使用 IoInitializeIrp 初始化 IRP。 (可以使用 IoInitializeIrp 重复使用在某些特殊情况下已使用的 IRP。有关详细信息 ,请参阅重用 IRP 。)

中间或最高级别的驱动程序还可以调用 IoBuildDeviceIoControlRequestIoBuildAsynchronousFsdRequestIoBuildSynchronousFsdRequest 来设置它发送到较低级别驱动程序的请求。 只有最高级别的驱动程序才能调用 IoMakeAssociatedIrp

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 ForwardedAtBadIrqlAllocate (wdm) HwStorPortProhibitedDDI (storport) IoAllocateComplete (wdm) IoAllocateForward (wdm) IoAllocateFree (wdm) IoAllocateIrpSignalEventInCompletion (wdm) IoAllocateIrpSignalEventInCompletion2 (wdm) IoAllocateIrpSignalEventInCompletion3 (wdm) IoAllocateIrpSignalEventInCompletionTimeout (wdm) IoFreeIrp (storport) IoReuseIrp (wdm) MarkPower (wdm) MarkPowerDown (wdm) MarkQueryRel (wdm) MarkStartDevice (wdm) SpNoWait (storport) StorPortStartIo (storport)

另请参阅

IO_STACK_LOCATION

IRP

IoAllocateIrpEx

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine