Partager via


WdfRequestComplete, fonction (wdfrequest.h)

[S’applique à KMDF et UMDF]

La méthode WdfRequestComplete termine une demande d’E/S spécifiée et fournit une status d’achèvement.

Syntaxe

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

Paramètres

[in] Request

Handle de l’objet de demande d’infrastructure qui représente la demande d’E/S en cours d’exécution.

[in] Status

Valeur NTSTATUS qui représente l’achèvement status de la requête. Les valeurs status valides incluent, sans s’y limiter, les éléments suivants :

STATUS_SUCCESS

Le pilote termine correctement la demande.

STATUS_CANCELLED

Le pilote annule la demande.

STATUS_UNSUCCESSFUL

Le pilote a rencontré une erreur lors du traitement de la demande.

Valeur de retour

None

Remarques

Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.

Une fois qu’un pilote a appelé WdfRequestComplete, les pilotes de niveau supérieur sur la pile de pilotes peuvent appeler WdfRequestGetStatus pour obtenir la valeur d’achèvement status qui a été spécifiée pour le paramètre Status. En règle générale, les pilotes appellent WdfRequestGetStatus à partir d’une fonction de rappel CompletionRoutine .

Une fois qu’un appel à WdfRequestComplete est retourné, le handle de requête n’est plus valide, sauf si le pilote a appelé WdfObjectReference pour ajouter un ou plusieurs nombres de références supplémentaires à l’objet de requête. Notez qu’après le retour de WdfRequestComplete , le pilote ne doit pas tenter d’accéder à la structure IRP WDM associée, même s’il a appelé WdfObjectReference. Cette exigence s’étend à l’accès à la structure IRP WDM associée en appelant des méthodes sur wdFREQUEST, comme WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveInputBuffer.

Après qu’un pilote a appelé WdfRequestComplete, le framework appelle la fonction EvtCleanupCallback du pilote pour la requête, si le pilote en a fourni une.

Au lieu d’appeler WdfRequestComplete, le pilote peut appeler WdfRequestCompleteWithInformation ou WdfRequestCompleteWithPriorityBoost. Pour plus d’informations, consultez les remarques de WdfRequestCompleteWithInformation .

Lorsque votre pilote appelle WdfRequestComplete, l’infrastructure fournit une valeur par défaut que le système utilise pour augmenter la priorité d’exécution du thread qui a demandé l’opération d’E/S. Pour plus d’informations sur les valeurs d’augmentation de priorité par défaut, consultez Spécification des augmentations de priorité lors de l’exécution des demandes d’E/S. Votre pilote peut appeler WdfRequestCompleteWithPriorityBoost pour remplacer la valeur d’augmentation de priorité par défaut.

Pour plus d’informations sur l’appel de WdfRequestComplete, consultez Achèvement des demandes d’E/S.

Exemples

L’exemple de code suivant est une section d’un gestionnaire de requêtes. Le gestionnaire de requêtes accepte uniquement les demandes de lecture et d’écriture, et il termine chaque requête avec une erreur status si le type de requête n’est pas en lecture ou en écriture.

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

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2.0
En-tête wdfrequest.h (inclure Wdf.h)
Bibliothèque Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Règles de 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)

Voir aussi

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus