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 reçu par le pilote client 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 de 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 TT claire lors de l’annulation des transferts asynchrones à faible vitesse/vitesse totale (en bloc ou contrôle) 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 avoir besoin de fournir des informations supplémentaires à UCX dans cette mémoire tampon.
[out] ResultLength
Emplacement qui, lors du retour, contient la taille, en octets, des informations stockées par la fonction de rappel dans OutputBuffer.
Valeur de retour
Si l’opération réussit, la fonction de rappel doit retourner STATUS_SUCCESS, ou une autre valeur d’état pour laquelle NT_SUCCESS(status) a la valeur TRUE. Sinon, il doit retourner une valeur d’état pour laquelle NT_SUCCESS(status) a la valeur FALSE.
Retourner le code | 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.
Pour GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, le contrôleur n’a pas demandé de mémoire tampon TT claire lors de l’annulation des transferts asynchrones à faible vitesse/vitesse totale (en bloc ou contrôle) envoyés à un hub TT. |
Remarques
Le pilote client UCX inscrit son implémentation EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY auprès de l’extension UCX (Host Controller Extension) USB 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;
}
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Windows |
version minimale de KMDF | 1.0 |
version minimale de UMDF | 2.0 |
d’en-tête | ucxcontroller.h (include Ucxclass.h) |
IRQL | PASSIVE_LEVEL |