EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY fonction de rappel (ucxcontroller.h)
Implémentation du pilote client pour déterminer si le contrôleur prend en charge une fonctionnalité spécifique.
Syntaxe
EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY EvtUcxControllerQueryUsbCapability;
NTSTATUS EvtUcxControllerQueryUsbCapability(
[in] UCXCONTROLLER UcxController,
[in] PGUID CapabilityType,
[in] ULONG OutputBufferLength,
[out, optional] PVOID OutputBuffer,
[out] PULONG ResultLength
)
{...}
Paramètres
[in] UcxController
Handle du contrôleur UCX que le pilote client a reçu lors d’un appel précédent à la méthode UcxControllerCreate .
[in] CapabilityType
Pointeur vers un GUID spécifiant la fonctionnalité demandée. Les valeurs PGUID possibles sont les suivantes :
- GUID_USB_CAPABILITY_CHAINED_MDLS
- GUID_USB_CAPABILITY_STATIC_STREAMS
- GUID_USB_CAPABILITY_SELECTIVE_SUSPEND
- GUID_USB_CAPABILITY_FUNCTION_SUSPEND
- GUID_USB_CAPABILITY_DEVICE_CONNECTION_HIGH_SPEED_COMPATIBLE
- GUID_USB_CAPABILITY_DEVICE_CONNECTION_SUPER_SPEED_COMPATIBLE
- GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL
- Pour les contrôleurs hôtes classiques, la requête doit échouer (STATUS_NOT_SUPPORTED). Si le contrôleur réussit cette fonctionnalité, il demande une mémoire tampon Clear TT lors de l’annulation des transferts asynchrones basse vitesse/pleine vitesse (en bloc ou contrôle) qui ont été envoyés à un hub TT.
[in] OutputBufferLength
Longueur, en octets, de la mémoire tampon de sortie de la requête, si une mémoire tampon de sortie est disponible.
[out, optional] OutputBuffer
Pointeur vers un emplacement qui reçoit l’adresse de la mémoire tampon. Certaines fonctionnalités peuvent devoir fournir des informations supplémentaires à UCX dans cette mémoire tampon.
[out] ResultLength
Emplacement qui, au retour, contient la taille, en octets, des informations stockées par la fonction de rappel dans OutputBuffer.
Valeur retournée
Si l’opération réussit, la fonction de rappel doit retourner STATUS_SUCCESS ou une autre valeur status pour laquelle NT_SUCCESS(status) est égal à TRUE. Sinon, il doit retourner une valeur status pour laquelle NT_SUCCESS(status) est false.
Code de retour | Description |
---|---|
|
La fonctionnalité USB demandée est prise en charge. |
|
La fonctionnalité USB demandée est inconnue et non prise en charge. |
|
Le contrôleur ne prend pas en charge la fonctionnalité USB demandée.
Par GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, le contrôleur n’a pas demandé de mémoire tampon Clear TT lors de l’annulation des transferts asynchrones basse vitesse/pleine vitesse (en bloc ou contrôle) qui ont été envoyés à un hub TT. |
Remarques
Le pilote client UCX inscrit son implémentation EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY avec l’extension du contrôleur hôte USB (UCX) en appelant la méthode UcxControllerCreate .
Exemples
NTSTATUS
Controller_EvtControllerQueryUsbCapability(
UCXCONTROLLER UcxController,
PGUID CapabilityType,
ULONG OutputBufferLength,
PVOID OutputBuffer,
PULONG ResultLength
)
{
NTSTATUS status;
UNREFERENCED_PARAMETER(UcxController);
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(OutputBuffer);
*ResultLength = 0;
if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_CHAINED_MDLS,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_CHAINED_MDLS supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_CHAINED_MDLS not supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_STATIC_STREAMS,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_STATIC_STREAMS supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_STATIC_STREAMS supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_FUNCTION_SUSPEND,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_FUNCTION_SUSPEND supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_FUNCTION_SUSPEND not supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_SELECTIVE_SUSPEND,
sizeof(GUID)) == sizeof(GUID)) {
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_SELECTIVE_SUSPEND supported");
status = STATUS_SUCCESS;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL not supported");
status = STATUS_NOT_SUPPORTED;
}
else {
DbgTrace(TL_INFO, Controller, "Unhandled USB capability");
status = STATUS_NOT_IMPLEMENTED;
}
return status;
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Windows |
Version KMDF minimale | 1.0 |
Version UMDF minimale | 2.0 |
En-tête | ucxcontroller.h (inclure Ucxclass.h) |
IRQL | PASSIVE_LEVEL |