Condividi tramite


Funzione WdfRequestComplete (wdfrequest.h)

[Si applica a KMDF e UMDF]

Il metodo WdfRequestComplete completa una richiesta di I/O specificata e fornisce uno stato di completamento.

Sintassi

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

Parametri

[in] Request

Handle per l'oggetto richiesta framework che rappresenta la richiesta di I/O completata.

[in] Status

Valore NTSTATUS che rappresenta lo stato di completamento della richiesta. I valori di stato validi includono, ma non sono limitati a, quanto segue:

STATUS_SUCCESS

Il driver sta completando correttamente la richiesta.

STATUS_CANCELLED

Il driver annulla la richiesta.

STATUS_UNSUCCESSFUL

Il driver ha rilevato un errore durante l'elaborazione della richiesta.

Valore restituito

nessuno

Osservazioni

Un controllo di bug si verifica se il driver fornisce un handle di oggetti non valido.

Dopo che un driver chiama WdfRequestComplete, i driver di livello superiore nello stack di driver possono chiamare WdfRequestGetStatus per ottenere il valore di stato di completamento specificato per il parametro Status . In genere, i driver chiamano WdfRequestGetStatus dall'interno di una funzione di callback di CompletamentoRoutine .

Dopo aver restituito una chiamata a WdfRequestComplete , l'handle della richiesta non è più valido a meno che il driver non abbia chiamato WdfObjectReference per aggiungere uno o più conteggi di riferimento aggiuntivi all'oggetto request. Si noti che dopo che WdfRequestComplete restituisce , il driver non deve tentare di accedere alla struttura WDM IRP associata, anche se ha chiamato WdfObjectReference. Questo requisito estende l'accesso alla struttura WDM IRP associata chiamando i metodi in WDFREQUEST, ad esempio WdfRequestRetrieveOutputBuffer o WdfRequestRetrieveInputBuffer.

Dopo che un driver chiama WdfRequestComplete, il framework chiama la funzione EvtCleanupCallback del driver per la richiesta, se il driver ne ha fornito uno.

Anziché chiamare WdfRequestComplete, il driver può chiamare WdfRequestCompleteWithInformation o WdfRequestCompleteWithPriorityBoost. Per altre informazioni, vedere le osservazioni di WdfRequestCompleteWithInformation .

Quando il driver chiama WdfRequestComplete, il framework fornisce un valore predefinito usato dal sistema per aumentare la priorità di runtime del thread che ha richiesto l'operazione di I/O. Per informazioni sui valori di aumento della priorità predefinita, vedere Specifica di incrementi di priorità durante il completamento delle richieste di I/O. Il driver può chiamare WdfRequestCompleteWithPriorityBoost per eseguire l'override del valore di boost di priorità predefinito.

Per altre informazioni sulla chiamata a WdfRequestComplete, vedere Completamento delle richieste di I/O.

Esempio

L'esempio di codice seguente è una sezione di un gestore delle richieste. Il gestore della richiesta accetta solo richieste di lettura e scrittura e completa ogni richiesta con stato di errore se il tipo di richiesta non è di lettura o scrittura.

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;
    }
...
}

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1.0
Versione UMDF minima 2,0
Intestazione wdfrequest.h (include Wdf.h)
Libreria Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Regole di conformità DDI 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)

Vedi anche

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus