WdfRequestCompleteWithInformation, fonction (wdfrequest.h)
[S’applique à KMDF et UMDF]
La méthode WdfRequestCompleteWithInformation stocke les informations d’achèvement, puis termine une demande d’E/S spécifiée avec un status d’achèvement fourni.
Syntaxe
void WdfRequestCompleteWithInformation(
[in] WDFREQUEST Request,
[in] NTSTATUS Status,
[in] ULONG_PTR Information
);
Paramètres
[in] Request
Handle de l’objet de requête.
[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 a correctement effectué la demande.
STATUS_CANCELLED
Le pilote a annulé la demande.
STATUS_UNSUCCESSFUL
Le pilote a rencontré une erreur lors du traitement de la demande.
[in] Information
Un ULONG_PTR défini sur une valeur dépendante de la demande. Par exemple, en cas de réussite d’une demande de transfert, ce paramètre est défini sur le nombre d’octets transférés. Ce champ n’est pas extensible par le pilote.
Valeur de retour
None
Remarques
Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.
Pour les demandes de lecture, d’écriture et IOCTL, il est nécessaire que le pilote appelle WdfRequestCompleteWithInformation
Pour une demande non-transfert de données, l’appel de WdfRequestComplete à la place est une option.
Appeler WdfRequestCompleteWithInformation revient à appeler WdfRequestSetInformation , puis à appeler WdfRequestComplete.
Après un appel à WdfRequestCompleteWithInformation 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 WdfRequestCompleteWithInformation , le pilote ne doit pas tenter d’accéder à la structure IRP WDM associée, même s’il a appelé WdfObjectReference.
Lorsque votre pilote appelle WdfRequestCompleteWithInformation, l’infrastructure fournit une valeur par défaut que le système utilise pour améliorer 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 WdfRequestCompleteWithInformation, consultez Achèvement des demandes d’E/S.
Pour obtenir un exemple de code qui montre comment utiliser WdfRequestCompleteWithInformation pour récupérer le nombre d’octets copiés, consultez l’exemple de pilote VirtualSerial2.
Exemples
L’exemple de code suivant montre comment un pilote pour un périphérique USB peut appeler WdfRequestCompleteWithInformation dans une fonction de rappel CompletionRoutine .
VOID
EvtRequestReadCompletionRoutine(
IN WDFREQUEST Request,
IN WDFIOTARGET Target,
PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
IN WDFCONTEXT Context
)
{
NTSTATUS status;
size_t bytesRead = 0;
PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;
UNREFERENCED_PARAMETER(Target);
UNREFERENCED_PARAMETER(Context);
status = CompletionParams->IoStatus.Status;
usbCompletionParams = CompletionParams->Parameters.Usb.Completion;
bytesRead = usbCompletionParams->Parameters.PipeRead.Length;
if (NT_SUCCESS(status)){
TraceEvents(
TRACE_LEVEL_INFORMATION,
DBG_READ,
"Number of bytes read: %I64d\n",
(INT64)bytesRead
);
} else {
TraceEvents(
TRACE_LEVEL_ERROR,
DBG_READ,
"Read failed - request status 0x%x UsbdStatus 0x%x\n",
status,
usbCompletionParams->UsbdStatus
);
}
WdfRequestCompleteWithInformation(
Request,
status,
bytesRead
);
return;
}
Configuration requise
Voir aussi
WDF_USB_REQUEST_COMPLETION_PARAMS