Share via


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.
Pour plus d’informations, consultez la section Remarques de USBD_QueryUsbCapability .

[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
STATUS_SUCCESS
La fonctionnalité USB demandée est prise en charge.
STATUS_NOT_IMPLEMENTED
La fonctionnalité USB demandée est inconnue et non prise en charge.
STATUS_NOT_SUPPORTED
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

Voir aussi

UcxControllerCreate