Freigeben über


WdfRequestComplete-Funktion (wdfrequest.h)

[Gilt für KMDF und UMDF]

Die WdfRequestComplete-Methode schließt eine angegebene E/A-Anforderung ab und stellt einen Abschluss status bereit.

Syntax

void WdfRequestComplete(
  [in] WDFREQUEST Request,
  [in] NTSTATUS   Status
);

Parameter

[in] Request

Ein Handle für das Frameworkanforderungsobjekt, das die E/A-Anforderung darstellt, die abgeschlossen wird.

[in] Status

Ein NTSTATUS-Wert, der den Abschluss status der Anforderung darstellt. Gültige status-Werte umfassen unter anderem Folgendes:

STATUS_SUCCESS

Der Treiber führt die Anforderung erfolgreich aus.

STATUS_CANCELLED

Der Treiber bricht die Anforderung ab.

STATUS_UNSUCCESSFUL

Beim Treiber ist bei der Verarbeitung der Anforderung ein Fehler aufgetreten.

Rückgabewert

Keine

Bemerkungen

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Nachdem ein Treiber WdfRequestComplete aufgerufen hat, können Treiber auf höherer Ebene im Treiberstapel WdfRequestGetStatus aufrufen, um den abschluss status Wert abzurufen, der für den Status-Parameter angegeben wurde. In der Regel rufen Treiber WdfRequestGetStatus aus einer CompletionRoutine-Rückruffunktion auf.

Nachdem ein Aufruf von WdfRequestComplete zurückgegeben wurde, ist das Anforderungshandle nicht mehr gültig, es sei denn, der Treiber hat WdfObjectReference aufgerufen, um dem Anforderungsobjekt eine oder mehrere zusätzliche Verweisanzahlen hinzuzufügen. Beachten Sie, dass der Treiber nach der Rückgabe von WdfRequestComplete nicht versuchen darf, auf die zugeordnete WDM-IRP-Struktur zuzugreifen, auch wenn er WdfObjectReference aufgerufen hat. Diese Anforderung erstreckt sich auf den Zugriff auf die zugeordnete WDM-IRP-Struktur, indem Methoden für WDFREQUEST aufgerufen werden, z. B. WdfRequestRetrieveOutputBuffer oder WdfRequestRetrieveInputBuffer.

Nachdem ein Treiber WdfRequestComplete aufgerufen hat, ruft das Framework die EvtCleanupCallback-Funktion des Treibers für die Anforderung auf, sofern der Treiber eine bereitgestellt hat.

Anstatt WdfRequestComplete aufzurufen, kann der Treiber WdfRequestCompleteWithInformation oder WdfRequestCompleteWithPriorityBoost aufrufen. Weitere Informationen finden Sie in den Hinweisen zu WdfRequestCompleteWithInformation .

Wenn Ihr Treiber WdfRequestComplete aufruft, stellt das Framework einen Standardwert bereit, den das System verwendet, um die Laufzeitpriorität des Threads zu erhöhen, der den E/A-Vorgang angefordert hat. Informationen zu standardbasierten Prioritätserhöhungswerten finden Sie unter Angeben von Prioritätserhöhungen beim Abschließen von E/A-Anforderungen. Ihr Treiber kann WdfRequestCompleteWithPriorityBoost aufrufen, um den Standardwert der Prioritätserhöhung zu überschreiben.

Weitere Informationen zum Aufrufen von WdfRequestComplete finden Sie unter Abschließen von E/A-Anforderungen.

Beispiele

Das folgende Codebeispiel ist ein Abschnitt eines Anforderungshandlers. Der Anforderungshandler akzeptiert nur Lese- und Schreibanforderungen und schließt jede Anforderung mit einem Fehler ab, status, wenn der Anforderungstyp nicht gelesen oder geschrieben ist.

VOID
MyEvtIoDefault(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request
    )
{
    WDF_REQUEST_PARAMETERS  params;
    WDF_DMA_DIRECTION  direction;

...
    WDF_REQUEST_PARAMETERS_INIT(&params);

    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    //
    // Validate and gather parameters.
    //
    switch (params.Type) {
        case WdfRequestTypeRead:
            length = params.Parameters.Read.Length;
            direction = WdfDmaDirectionReadFromDevice;
            break;
        case WdfRequestTypeWrite:
            length = params.Parameters.Write.Length;
            direction = WdfDmaDirectionWriteToDevice;
            break;
        default:
            WdfRequestComplete(
                               Request,
                               STATUS_INVALID_DEVICE_REQUEST
                               );
            return;
    }
...
}

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile wdfrequest.h (include Wdf.h)
Bibliothek Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedReadA(kmdf), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), CompleteCanceledReq(kmdf), DeferredRequestCompleted(kmdf), DoubleCompletion(kmdf), DoubleCompletionLocal(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf), EvtSurpriseRemoveNoRequestComplete(kmdf), InvalidReqAccess(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MarkCancOnCancReqLocal(kmdf), MdlAfterReqCompletedIntIoctl(kmdf), MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctl(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedRead(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWrite(kmdf), MdlAfterReqCompletedWriteA(kmdf), MemAfterReqCompletedIntIoctl(kmdf), MemAfterReqCompletedIntIoctlA(kmdf), MemAfterReqCompletedIoctl(kmdf), MemAfterReqCompletedIoctlA(kmdf), MemAfterReqCompletedRead(kmdf), MemAfterReqCompletedReadA(kmdf), MemAfterReqCompletedWrite(kmdf), MemAfterReqCompletedWriteA(kmdf), NoCancelFromEvtSurpriseRemove(kmdf), ReqDelete(kmdf), ReqIsCancOnCancReq(kmdf), ReqNotCanceledLocal(kmdf), ReqSendFail(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf)

Weitere Informationen

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus