IoMarkIrpPending-Funktion (wdm.h)
Die IoMarkIrpPending Routine kennzeichnet das angegebene IRP, was darauf hinweist, dass die Verteilerroutine eines Treibers anschließend STATUS_PENDING zurückgegeben wird, da eine weitere Verarbeitung von anderen Treiberroutinen erforderlich ist.
Syntax
void IoMarkIrpPending(
[in, out] PIRP Irp
);
Parameter
[in, out] Irp
Zeiger auf das IRP, das als ausstehend markiert werden soll.
Rückgabewert
Nichts
Bemerkungen
Wenn die Verteilerroutine des Treibers die IRP nicht abgeschlossen hat (durch Aufrufen von IoCompleteRequest) oder das IRP an niedrigere Treiber weitergibt, muss er IoMarkIrpPending mit dem IRP aufrufen. Andernfalls versucht der E/A-Manager, das IRP abzuschließen, sobald die Verteilerroutine die Steuerung zurückgibt.
Nach dem Aufrufen IoMarkIrpPendingmuss die Dispatch-Routine STATUS_PENDING zurückgeben, auch wenn eine Routine das IRP (durch Aufrufen von IoCompleteRequest) vor der Verteilerroutine zurückgibt, die IoMarkIrpPending zurückgegeben wird.
Wenn ein Treiber eingehende IRPs in die Warteschlange stellt, sollte er IoMarkIrpPending aufrufen, bevor jedes IRP in die Warteschlange gestellt wird. Andernfalls könnte ein IRP dequeuiert, von einer anderen Treiberroutine abgeschlossen und vom System freigegeben werden, bevor der Aufruf von IoMarkIrpPending auftritt, wodurch ein Absturz verursacht wird.
Wenn ein Treiber eine IoCompletion- Routine für ein IRP festlegt und dann das IRP an einen niedrigeren Treiber übergibt, sollte die IoCompletion--Routine die IRP->PendingReturned Flag überprüfen. Wenn das Flag festgelegt ist, muss die IoCompletion- Routine IoMarkIrpPending mit dem IRP aufrufen. IoCompletion Routinen geben STATUS_PENDING nicht zurück. Weitere Informationen finden Sie unter Implementieren einer IoCompletion Routine.
Treiber, die das IRP erstellen und an einen anderen Stapel senden, dürfen nicht IoMarkIrpPending in ihrer Abschlussroutine aufrufen. Dieser Aufruf beschädigt den Poolheader der nächsten Zuordnung, da für diese Treiber kein Stapelspeicherort vorhanden ist.
Ein Treiber, der das IRP übergibt und dann auf ein Ereignis wartet, sollte das ausstehende IRP nicht markieren. Stattdessen sollte die IoCompletion- Routine das Ereignis signalisieren und STATUS_MORE_PROCESSING_REQUIRED zurückgeben.
Wenn Ihr Treiber IoSkipCurrentIrpStackLocation-aufruft, achten Sie darauf, die IO_STACK_LOCATION Struktur nicht auf eine Weise zu ändern, die unbeabsichtigt den unteren Treiber oder das Verhalten des Systems in Bezug auf diesen Treiber beeinflussen könnte. Insbesondere sollte Ihr Treiber die Parameter Union der IO_STACK_LOCATION Struktur nicht ändern und nicht IoMarkIrpPendingaufrufen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Desktop |
Header- | wdm.h (include 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) |