WdfUsbTargetDeviceRetrieveConfigDescriptor, fonction (wdfusb.h)
[S’applique à KMDF et UMDF]
La méthode WdfUsbTargetDeviceRetrieveConfigDescriptor récupère le descripteur de configuration USB pour le périphérique USB associé à un objet de périphérique USB d’infrastructure spécifié.
Syntaxe
NTSTATUS WdfUsbTargetDeviceRetrieveConfigDescriptor(
[in] WDFUSBDEVICE UsbDevice,
[out] PVOID ConfigDescriptor,
[in, out] PUSHORT ConfigDescriptorLength
);
Paramètres
[in] UsbDevice
Handle pour un objet de périphérique USB obtenu à partir d’un appel précédent à WdfUsbTargetDeviceCreateWithParameters.
[out] ConfigDescriptor
Pointeur vers une mémoire tampon allouée à l’appelant qui reçoit une structure USB_CONFIGURATION_DESCRIPTOR , suivie d’une ou plusieurs structures USB_INTERFACE_DESCRIPTOR et USB_ENDPOINT_DESCRIPTOR . Ce paramètre est facultatif et peut être NULL, auquel cas WdfUsbTargetDeviceRetrieveConfigDescriptor retourne la longueur de mémoire tampon requise. Pour plus d'informations, consultez la section Notes qui suit.
[in, out] ConfigDescriptorLength
Pointeur vers un emplacement qui fournit la longueur de la mémoire tampon vers laquelle ConfigDescriptor pointe. Si le pointeur fourni pour ConfigDescriptor est NULL, WdfUsbTargetDeviceRetrieveConfigDescriptor retourne la longueur de mémoire tampon requise à l’emplacement pointé par ConfigDescriptorLength.
Valeur retournée
WdfUsbTargetDeviceRetrieveConfigDescriptor retourne STATUS_SUCCESS si l’opération réussit. Sinon, cette méthode peut retourner l’une des valeurs suivantes :
Code de retour | Description |
---|---|
|
Un descripteur de configuration n’était pas disponible pour la cible spécifiée. |
|
Un paramètre non valide a été détecté. |
|
La taille de mémoire tampon spécifiée était trop petite pour les données, ou l’appelant a fourni NULL pour le paramètre ConfigDescriptor . |
Cette méthode peut également retourner d’autres valeurs NTSTATUS.
Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.
Remarques
La méthode WdfUsbTargetDeviceRetrieveConfigDescriptor récupère toutes les informations de configuration du périphérique USB spécifiés (autrement dit, le descripteur de configuration ainsi que les descripteurs d’interface ou de point de terminaison qui peuvent être présents). Pour en savoir plus sur le format de ces informations, consultez la spécification USB.
Vous pouvez utiliser WdfUsbTargetDeviceSelectConfig pour sélectionner uniquement la première configuration USB répertoriée dans la liste des descripteurs, mais vous pouvez sélectionner plusieurs interfaces dans cette configuration unique.
Les pilotes doivent appeler WdfUsbTargetDeviceRetrieveConfigDescriptor deux fois, comme suit :
- Définissez le pointeur ConfigDescriptor sur NULL, afin que WdfUsbTargetDeviceRetrieveConfigDescriptor retourne la taille de mémoire tampon requise dans l’adresse vers laquelle pointe ConfigDescriptorLength .
- Allouez de l’espace tampon pour contenir les informations de configuration. Par exemple, un pilote peut appeler ExAllocatePoolWithTag pour allouer une mémoire tampon, ou il peut appeler WdfMemoryCreate pour créer un objet de mémoire framework.
- Appelez à nouveau WdfUsbTargetDeviceRetrieveConfigDescriptor , en lui passant un pointeur vers la nouvelle mémoire tampon et la taille de la mémoire tampon.
Pour plus d’informations sur la méthode WdfUsbTargetDeviceRetrieveConfigDescriptor et les cibles d’E/S USB, consultez Cibles d’E/S USB.
Exemples
L’exemple de code suivant appelle WdfUsbTargetDeviceRetrieveConfigDescriptor pour obtenir la taille de mémoire tampon requise, appelle WdfMemoryCreate pour créer un objet mémoire et une mémoire tampon, puis appelle À nouveau WdfUsbTargetDeviceRetrieveConfigDescriptor pour obtenir les informations de configuration d’un appareil.
USHORT size;
NTSTATUS ntStatus;
PMY_DEVICE_CONTEXT myDeviceContext;
PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL;
WDF_OBJECT_ATTRIBUTES objectAttribs;
WDFMEMORY memoryHandle;
myDeviceContext = GetDeviceContext(Device);
ntStatus = WdfUsbTargetDeviceRetrieveConfigDescriptor(
myDeviceContext->WdfUsbTargetDevice,
NULL,
&size
);
if (ntStatus != STATUS_BUFFER_TOO_SMALL) {
return ntStatus;
}
WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs);
objectAttribs.ParentObject = myDeviceContext->WdfUsbTargetDevice;
ntStatus = WdfMemoryCreate(
&objectAttribs,
NonPagedPool,
POOL_TAG,
size,
&memoryHandle,
(PVOID)&configurationDescriptor
);
if (!NT_SUCCESS(ntStatus)) {
return ntStatus;
}
ntStatus = WdfUsbTargetDeviceRetrieveConfigDescriptor(
myDeviceContext->WdfUsbTargetDevice,
configurationDescriptor,
&size
);
if (!NT_SUCCESS(ntStatus)) {
return ntStatus;
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
Version KMDF minimale | 1.0 |
Version UMDF minimale | 2.0 |
En-tête | wdfusb.h (inclure 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), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |