Freigeben über


EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY Rückruffunktion (ucxcontroller.h)

Die Implementierung des Clienttreibers, um festzustellen, ob der Controller eine bestimmte Funktion unterstützt.

Syntax

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
)
{...}

Parameter

[in] UcxController

Ein Handle für den UCX-Controller, den der Clienttreiber in einem vorherigen Aufruf der UcxControllerCreate-Methode empfangen hat.

[in] CapabilityType

Zeiger auf eine GUID, die die angeforderte Funktion angibt. Die möglichen PGUID- Werte sind wie folgt:

  • 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
    • Bei typischen Hostcontrollern muss die Abfrage fehlschlagen (STATUS_NOT_SUPPORTED). Wenn der Controller diese Funktion erfolgreich ausgeführt hat, fordert er einen Clear TT-Puffer an, wenn Asynchrone Übertragungen mit geringer Geschwindigkeit/Vollgeschwindigkeit (Massen- oder Steuerungsübertragungen) abgebrochen werden, die an einen TT-Hub gesendet wurden.
Weitere Informationen finden Sie im Abschnitt "Hinweise" von USBD_QueryUsbCapability.

[in] OutputBufferLength

Die Länge des Ausgabepuffers der Anforderung in Bytes, wenn ein Ausgabepuffer verfügbar ist.

[out, optional] OutputBuffer

Ein Zeiger auf eine Position, die die Adresse des Puffers empfängt. Bestimmte Funktionen müssen in diesem Puffer möglicherweise zusätzliche Informationen für UCX bereitstellen.

[out] ResultLength

Ein Speicherort, der im Gegenzug die Größe der Informationen enthält, die die Rückruffunktion in OutputBuffer gespeichert hat.

Rückgabewert

Wenn der Vorgang erfolgreich ist, muss die Rückruffunktion STATUS_SUCCESS oder einen anderen Statuswert zurückgeben, für den NT_SUCCESS(Status) WAHR ist. Andernfalls muss ein Statuswert zurückgegeben werden, für den NT_SUCCESS(Status) FALSE entspricht.

Rückgabecode Beschreibung
STATUS_SUCCESS
Die angeforderte USB-Funktion wird unterstützt.
STATUS_NOT_IMPLEMENTED
Die angeforderte USB-Funktion ist unbekannt und wird nicht unterstützt.
STATUS_NOT_SUPPORTED
Der Controller unterstützt die angeforderte USB-Funktion nicht.

Für GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL hat der Controller keinen Clear TT-Puffer angefordert, wenn Asynchrone Übertragungen mit geringer Geschwindigkeit/Vollgeschwindigkeit (Massen- oder Steuerelementübertragungen) abgebrochen wurden, die an einen TT-Hub gesendet wurden.

Bemerkungen

Der UCX-Clienttreiber registriert seine EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY Implementierung mit der USB-Hostcontrollererweiterung (UCX), indem die UcxControllerCreate-Methode aufgerufen wird.

Beispiele

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;
}

Anforderungen

Anforderung Wert
Zielplattform- Fenster
Minimale KMDF-Version 1.0
Mindest-UMDF-Version 2.0
Header- ucxcontroller.h (include Ucxclass.h)
IRQL- PASSIVE_LEVEL

Siehe auch

UcxControllerCreate