IoAllocateIrp-Funktion (wdm.h)

Die IoAllocateIrp-Routine ordnet einen IRP zu, wobei die Anzahl der E/A-Stapelspeicherorte für jeden Treiber, der sich unter dem Aufrufer befindet, und optional für den Aufrufer angegeben wird. Siehe auch IoAllocateIrpEx.

Syntax

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

Parameter

[in] StackSize

Gibt die Anzahl der E/A-Stapelspeicherorte an, die dem IRP zugeordnet werden sollen. Dieser Wert muss mindestens gleich dem StackSize des Geräteobjekts des nächstniedrigen Treibers sein, kann jedoch größer als dieser Wert sein. Der aufrufende Treiber muss keinen Stapelspeicherort im IRP für sich selbst zuordnen.

[in] ChargeQuota

Wenn Sie dies auf TRUE festlegen, wird der für den IRP zugewiesene Arbeitsspeicher mit dem Kontingent für den aktuellen Prozess in Rechnung gestellt. Sollte von Zwischentreibern auf FALSE festgelegt werden. Dies kann nur von Treibern der obersten Ebene auf TRUE festgelegt werden, die im Kontext des Threads aufgerufen werden, der die E/A-Anforderung entspringt, für die der Treiber eine andere IRP zuzuweisen hat.

Rückgabewert

IoAllocateIrp gibt einen Zeiger auf einen IRP zurück, der aus dem nicht auslagerten Systemspeicher zugeordnet wurde, oder NULL , wenn ein IRP nicht zugeordnet werden konnte.

Hinweise

Die IoAllocateIrp-Routine ordnet die IRP nicht einem Thread zu. Der Zuweisungstreiber muss die IRP freigeben, anstatt sie an den E/A-Manager zurückzustellen.

Ein Treiber auf mittlerer oder höchster Ebene kann IoAllocateIrp aufrufen, um IRPs für Anforderungen zu erstellen, die er an Treiber auf niedrigerer Ebene sendet. Ein solcher Treiber muss den IRP initialisieren und seine IoCompletion-Routine in dem von ihm erstellten IRP festlegen, damit der Aufrufer den IRP verwerfen kann, wenn Treiber auf niedrigerer Ebene die Verarbeitung der Anforderung abgeschlossen haben.

IoAllocateIrp initialisiert automatisch die Member des IRP. Verwenden Sie ioInitializeIrp nicht, um den IRP vor seiner ersten Verwendung zu initialisieren. (Sie können IoInitializeIrp verwenden, um ein IRP wiederzuverwenden, das Sie unter bestimmten besonderen Umständen bereits verwendet haben. Weitere Informationen finden Sie unter Wiederverwendung von IRPs .)

Ein Treiber auf mittlerer oder oberster Ebene kann auch IoBuildDeviceIoControlRequest, IoBuildAsynchronousFsdRequest oder IoBuildSynchronousFsdRequest aufrufen, um Anforderungen einzurichten, die an Treiber niedrigerer Ebene gesendet werden. Nur ein Treiber der obersten Ebene kann IoMakeAssociatedIrp aufrufen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI-Complianceregeln ForwardedAtBadIrqlAllocate(wdm), HwStorPortProhibitedDIs(storport), IoAllocateComplete(wdm), IoAllocateForward(wdm), IoAllocateFree(wdm), IoAllocateIrpSignalEventInCompletion(wdm), IoAllocateIrpSignalEventInCompletion2(wdm), IoAllocateIrpSignalEventInCompletion3(wdm), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoFreeIrp(storport), IoReuseIrp(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), SpNoWait(storport), StorPortStartIo(storport)

Weitere Informationen

IO_STACK_LOCATION

IRP

IoAllocateIrpEx

IoBuildAsynchronfsdRequest

IoBuildDeviceIoControlRequest

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine