EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY Rückruffunktion (ucxcontroller.h)

Die Implementierung des Clienttreibers, um zu bestimmen, 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 bei 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 ausführt, fordert er einen Clear TT-Puffer an, wenn asynchrone Übertragungen mit niedriger Geschwindigkeit/Voller Geschwindigkeit (Massen- oder Steuerungsübertragungen) abgebrochen werden, die an einen TT-Hub gesendet wurden.
Weitere Informationen finden Sie im Abschnitt Hinweise 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 einen Speicherort, der die Adresse des Puffers empfängt. Bestimmte Funktionen müssen UCX in diesem Puffer möglicherweise zusätzliche Informationen bereitstellen.

[out] ResultLength

Ein Speicherort, der bei der Rückgabe die Größe der Informationen in Bytes 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 status Wert zurückgeben, für den NT_SUCCESS(status) gleich TRUE ist. Andernfalls muss ein status Wert zurückgegeben werden, für den NT_SUCCESS(status) gleich FALSE ist.

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 niedriger Geschwindigkeit/Voller Geschwindigkeit (Massen- oder Steuerungsübertragungen) abgebrochen wurden, die an einen TT-Hub gesendet wurden.

Hinweise

Der UCX-Clienttreiber registriert seine EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY Implementierung bei der USB-Hostcontrollererweiterung (UCX), indem er die UcxControllerCreate-Methode aufruft .

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 Windows
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile ucxcontroller.h (ucxclass.h einschließen)
IRQL PASSIVE_LEVEL

Weitere Informationen

UcxControllerErstellen