IoAllocateIrp-Funktion (wdm.h)
Die IoAllocateIrp- Routine weist ein IRP zu, wobei die Anzahl der I/O-Stapelstandorte für jeden Treiber, der unter dem Aufrufer angeordnet ist, und optional für den Anrufer zugewiesen wird. Siehe auch IoAllocateIrpEx.
Syntax
PIRP IoAllocateIrp(
[in] CCHAR StackSize,
[in] BOOLEAN ChargeQuota
);
Parameter
[in] StackSize
Gibt die Anzahl der I/O-Stapelspeicherorte an, die für das IRP zugewiesen werden sollen. Dieser Wert muss mindestens dem StackSize- des Geräteobjekts des nächsten niedrigeren Treibers entsprechen, kann jedoch einen größer sein als dieser Wert. Der aufrufende Treiber muss keinen Stapelstandort im IRP selbst zuordnen.
[in] ChargeQuota
Wenn Sie diesen Wert auf TRUE festlegen bewirkt, dass der für das IRP zugewiesene Speicher dem Kontingent für den aktuellen Prozess in Rechnung gestellt wird. Sollte auf FALSE- durch Zwischentreiber festgelegt werden. Dies kann auf TRUE- nur durch Treiber der höchsten Ebene festgelegt werden, die im Kontext des Threads aufgerufen werden, der die E/A-Anforderung stammt, für die der Treiber ein anderes IRP angibt.
Rückgabewert
IoAllocateIrp einen Zeiger auf einen IRP zurück, der aus nicht seitenseitigem Systembereich zugewiesen wurde, oder NULL-, wenn ein IRP nicht zugeordnet werden konnte.
Bemerkungen
Die IoAllocateIrp Routine ordnet das IRP keinem Thread zu. Der zugewiesene Treiber muss das IRP freigeben, anstatt ihn wieder an den I/O-Manager zu senden.
Ein Treiber auf mittlerer oder höchster Ebene kann IoAllocateIrp- aufrufen, um IRPs für Anforderungen zu erstellen, die an Treiber niedrigerer Ebene gesendet werden. Ein solcher Treiber muss das IRP initialisieren und seine IoCompletion Routine im IRP festlegen, die er erstellt, damit der Aufrufer das IRP löschen kann, wenn Treiber auf niedrigerer Ebene die Verarbeitung der Anforderung abgeschlossen haben.
IoAllocateIrp initialisiert automatisch die IRP-Mitglieder. Verwenden Sie IoInitializeIrp- nicht, um das IRP vor der 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 Reusing IRPs.)
Ein Treiber auf mittlerer oder höchster Ebene kann auch IoBuildDeviceIoControlRequest, IoBuildAsynchronousFsdRequest oder IoBuildSynchronousFsdRequest- aufrufen, um Anforderungen einzurichten, die an Treiber niedrigerer Ebene gesendet werden. Nur ein Treiber der höchsten Ebene kann IoMakeAssociatedIrpaufrufen.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Ab Windows 2000 verfügbar. |
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | 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), IoAllocateIrpSignalSignal, IoFreeIrp(storport), IoReuseIrp(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), SpNoWait(storport), StorPortStartIo(storport) |