Freigeben über


IoMarkIrpPending-Funktion (wdm.h)

Die IoMarkIrpPending-Routine markiert den angegebenen IRP, was angibt, dass die Dispatchroutine eines Treibers anschließend STATUS_PENDING zurückgegeben hat, da von anderen Treiberroutinen eine weitere Verarbeitung erforderlich ist.

Syntax

void IoMarkIrpPending(
  [in, out] PIRP Irp
);

Parameter

[in, out] Irp

Zeiger auf den IRP, der als ausstehend markiert werden soll.

Rückgabewert

Keine

Bemerkungen

Es sei denn, die Dispatchroutine des Treibers schließt das IRP (durch Aufrufen von IoCompleteRequest) ab oder übergibt das IRP an niedrigere Treiber, muss ioMarkIrpPending mit dem IRP aufrufen. Andernfalls versucht der E/A-Manager, die IRP abzuschließen, sobald die Dispatchroutine die Kontrolle zurückgibt.

Nach dem Aufruf von IoMarkIrpPending muss die Dispatchroutine STATUS_PENDING zurückgeben, auch wenn eine Routine das IRP (durch Aufrufen von IoCompleteRequest) abgeschlossen hat, bevor die Dispatchroutine mit dem Namen IoMarkIrpPending zurückgegeben wird.

Wenn ein Treiber eingehende IRPs in die Warteschlange stellt, sollte er IoMarkIrpPending aufrufen, bevor er die einzelnen IRP in die Warteschlange stellt. Andernfalls könnte ein IRP entfernt, von einer anderen Treiberroutine abgeschlossen und vom System freigegeben werden, bevor der Aufruf von IoMarkIrpPending erfolgt, wodurch ein Absturz verursacht wird.

Wenn ein Treiber eine IoCompletion-Routine für ein IRP festlegt und dann den IRP an einen niedrigeren Treiber übergibt, sollte die IoCompletion-Routine das IRP-PendingReturned-Flag> überprüfen. Wenn das Flag festgelegt ist, muss die IoCompletion-RoutineIoMarkIrpPending mit dem IRP aufrufen. IoCompletion-Routinen geben keine STATUS_PENDING zurück. Weitere Informationen finden Sie unter Implementieren einer IoCompletion-Routine.

Treiber, die das IRP erstellen und an einen anderen Stapel senden, dürfen IoMarkIrpPending in ihrer Abschlussroutine nicht aufrufen. Dieser Aufruf beschädigt den Poolheader der nächsten Zuordnung, da für diese Treiber kein Stapelspeicherort vorhanden ist.

Ein Treiber, der den IRP übergibt und dann auf ein Ereignis wartet, sollte das IRP nicht als ausstehend markieren. Stattdessen sollte die IoCompletion-Routine das Ereignis signalisieren und STATUS_MORE_PROCESSING_REQUIRED zurückgeben.

Wenn Ihr Treiber IoSkipCurrentIrpStackLocation aufruft, sollten Sie darauf achten, die IO_STACK_LOCATION-Struktur nicht so zu ändern, dass sich unbeabsichtigt auf den niedrigeren Treiber oder das Systemverhalten in Bezug auf diesen Treiber auswirken könnte. Insbesondere sollte Ihr Treiber die Parameterunion der IO_STACK_LOCATION-Struktur nicht ändern und IoMarkIrpPending nicht aufrufen.

Anforderungen

Anforderung Wert
Zielplattform Desktop
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
IRQL Beliebige Ebene
DDI-Complianceregeln CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkingInterlockedQueuedIrps(wdm), MarkingQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm)

Weitere Informationen

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket