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) |