WdfUsbTargetDeviceSendControlTransferSynchronously, fonction (wdfusb.h)
[S’applique à KMDF et UMDF]
La méthode WdfUsbTargetDeviceSendControlTransferSynchronously génère une demande de transfert de contrôle USB et l’envoie de manière synchrone à une cible d’E/S.
Syntaxe
NTSTATUS WdfUsbTargetDeviceSendControlTransferSynchronously(
[in] WDFUSBDEVICE UsbDevice,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[in] PWDF_USB_CONTROL_SETUP_PACKET SetupPacket,
[in, optional] PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
[out, optional] PULONG BytesTransferred
);
Paramètres
[in] UsbDevice
Handle vers un objet de périphérique USB obtenu à partir d’un appel précédent à WdfUsbTargetDeviceCreateWithParameters.
[in, optional] Request
Handle vers un objet de requête de framework. Ce paramètre est facultatif et peut être NULL. Pour plus d’informations, consultez la section Remarques suivante.
[in, optional] RequestOptions
Pointeur vers une structure WDF_REQUEST_SEND_OPTIONS allouée par l’appelant qui spécifie les options de la requête. Ce pointeur est facultatif et peut être NULL. Pour plus d’informations, consultez la section Remarques suivante.
[in] SetupPacket
Pointeur vers une structure WDF_USB_CONTROL_SETUP_PACKET allouée par l’appelant qui décrit le transfert de contrôle.
[in, optional] MemoryDescriptor
Pointeur vers une structure WDF_MEMORY_DESCRIPTOR allouée par l’appelant qui décrit une entrée ou une mémoire tampon de sortie, en fonction de la commande spécifique à l’appareil. Ce pointeur est facultatif et peut être NULL. Pour plus d’informations, consultez la section Remarques suivante.
[out, optional] BytesTransferred
Pointeur vers un emplacement qui reçoit le nombre d’octets transférés. Ce paramètre est facultatif et peut être NULL.
Valeur de retour
WdfUsbTargetDeviceSendControlTransferSynchronously retourne la valeur d’état d’achèvement de la cible d’E/S si l’opération réussit. Sinon, cette méthode peut retourner l’une des valeurs suivantes :
Retourner le code | Description |
---|---|
|
Un paramètre non valide a été détecté. |
|
Mémoire insuffisante disponible. |
|
Un descripteur de mémoire non valide a été spécifié ou la requête d’E/S spécifiée a déjà été mise en file d’attente vers une cible d’E/S. |
|
Le pilote a fourni une valeur de délai d’attente et la demande n’a pas terminé dans le délai imparti. |
Cette méthode peut également retourner d’autres valeurs NTSTATUS .
Une vérification de bogue se produit si le pilote fournit un handle d’objet non valide.
Remarques
Utilisez la méthode WdfUsbTargetDeviceSendControlTransferSynchronously pour envoyer une demande de transfert de contrôle USB de manière synchrone. Pour envoyer ces requêtes de façon asynchrone, utilisez WdfUsbTargetDeviceFormatRequestForControlTransfer, suivie de WdfRequestSend.
La méthode
Vous pouvez transférer une demande d’E/S reçue par votre pilote dans une file d’attente d’E/S, ou vous pouvez créer et envoyer une nouvelle demande. Dans les deux cas, l’infrastructure nécessite un objet de requête et, selon le type de transfert de contrôle, éventuellement un espace tampon.
Pour transférer une demande d’E/S reçue par votre pilote dans une file d’attente d’E/S :
-
Spécifiez le handle de la demande reçue pour le paramètre de demande de
. -
Utilisez la mémoire tampon d’entrée ou de sortie de la requête reçue pour le paramètre MemoryDescriptor
. Le pilote peut appeler WdfRequestRetrieveInputMemory ou WdfRequestRetrieveOutputMemory pour obtenir un handle vers un objet mémoire de framework qui représente la mémoire tampon d’entrée ou de sortie de la requête, puis placer ce handle dans la structure WDF_MEMORY_DESCRIPTOR que le pilote fournit pour le paramètre MemoryDescriptor.
-
Fournissez un handle de requête NULL
dans le paramètre de requête de , ou créez un objet de requête et fournissez son handle : - Si vous fournissez un handle de requête NULL
, l’infrastructure utilise un objet de requête interne. Cette technique est simple à utiliser, mais le pilote ne peut pas annuler la demande. - Si vous appelez WdfRequestCreate pour créer un ou plusieurs objets de requête, vous pouvez réutiliser ces objets de requête en appelant WdfRequestReuse. Cette technique permet aux EvtDriverDeviceAdd fonction de rappel de préallouer les objets de requête d’un appareil. En outre, un autre thread de pilote peut appeler WdfRequestCancelSentRequest pour annuler la requête, si nécessaire.
Votre pilote peut spécifier un paramètre RequestOptions non
NULL ou une NULL Demander paramètre. Vous pouvez, par exemple, utiliser le paramètre RequestOptions pour spécifier une valeur de délai d’attente. - Si vous fournissez un handle de requête NULL
-
Fournissez de l’espace tampon pour le paramètre
MemoryDescriptor de la méthodeWdfUsbTargetDeviceSendControlTransferSynchronous ly.Votre pilote peut spécifier cet espace tampon en tant que mémoire tampon allouée localement, en tant que handle WDFMEMORY ou en tant que MDL. Vous pouvez utiliser la méthode la plus pratique.
Si nécessaire, l’infrastructure convertit la description de la mémoire tampon en une qui est correcte pour la méthode de de la cible d’E/S pour accéder aux mémoires tampons de données.
Les techniques suivantes sont disponibles :
-
Fournir une mémoire tampon locale
Étant donné que WdfUsbTargetDeviceSendControlTransferSynchronously gère les requêtes d’E/S de manière synchrone, le pilote peut créer des tampons de requête locaux à la routine appelante, comme illustré dans l’exemple de code suivant.
WDF_MEMORY_DESCRIPTOR memoryDescriptor; MY_BUFFER_TYPE myBuffer; WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&memoryDescriptor, (PVOID) &myBuffer, sizeof(myBuffer));
-
Fournir un handle WDFMEMORY
Appelez WdfMemoryCreate ou WdfMemoryCreatePreallocated pour obtenir un handle de mémoire gérée par l’infrastructure, comme illustré dans l’exemple de code suivant.
WDF_MEMORY_DESCRIPTOR memoryDescriptor; WDFMEMORY memoryHandle = NULL; status = WdfMemoryCreate(NULL, NonPagedPool, POOL_TAG, MY_BUFFER_SIZE, &memoryHandle, NULL); WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&memoryDescriptor, memoryHandle, NULL);
Sinon, le pilote peut appeler WdfRequestRetrieveInputMemory ou WdfRequestRetrieveOutputMemory pour obtenir un handle à un objet mémoire de framework qui représente la mémoire tampon d’une requête d’E/S reçue, si vous souhaitez que le pilote passe le contenu de cette mémoire tampon à la cible d’E/S. Le pilote ne doit pas terminer la demande d’E/S reçue tant que la nouvelle requête WdfUsbTargetDeviceSendControlTransferSynchronously envoyées à la cible d’E/S a été supprimée, réutilisée ou reformattée. (WdfUsbTargetDeviceSendControlTransferSynchronously incrémente le nombre de références de l’objet mémoire. La suppression, la réutilisation ou la reformatage d’un objet de requête décrémente le nombre de références de l’objet mémoire.)
-
Fournir un MDL
Les pilotes peuvent obtenir des DLL associées à une requête d’E/S reçue en appelant WdfRequestRetrieveInputWdmMdl ou WdfRequestRetrieveOutputWdmMdl.
-
Fournir une mémoire tampon locale
Pour plus d’informations sur l’obtention des informations d’état une fois qu’une demande d’E/S est terminée, consultez Obtention des informations d’achèvement.
Pour plus d’informations sur la méthode WdfUsbTargetDeviceSendControlTransferSynchronously et les cibles d’E/S USB, consultez cibles d’E/S USB.
Exemples
L’exemple de code suivant initialise une structure WDF_USB_CONTROL_SETUP_PACKET, puis appelle WdfUsbTargetDeviceSendControlTransferSynchronously pour envoyer un transfert de contrôle spécifique au fournisseur.
WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket;
WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(
&controlSetupPacket,
BmRequestHostToDevice,
BmRequestToDevice,
USBFX2LK_REENUMERATE,
0,
0
);
status = WdfUsbTargetDeviceSendControlTransferSynchronously(
UsbDevice,
WDF_NO_HANDLE,
NULL,
&controlSetupPacket,
NULL,
NULL
);
return status;
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
version minimale de KMDF | 1.0 |
version minimale de UMDF | 2.0 |
d’en-tête | wdfusb.h (include Wdfusb.h) |
bibliothèque | Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
règles de conformité DDI | DriverCreate(kmdf), kmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestForUrbXrb(kmdf), SyncReqSend(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |
Voir aussi
WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR