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(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
//
// 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
Voir aussi
WdfRequestCompleteWithInformation