Freigeben über


EVT_UCX_USBDEVICE_ENDPOINT_ADD Rückruffunktion (ucxusbdevice.h)

Die Implementierung des Clienttreibers, die UCX aufruft, um einen neuen Endpunkt für ein USB-Gerät hinzuzufügen.

Syntax

EVT_UCX_USBDEVICE_ENDPOINT_ADD EvtUcxUsbdeviceEndpointAdd;

NTSTATUS EvtUcxUsbdeviceEndpointAdd(
  [in]           UCXCONTROLLER UcxController,
  [in]           UCXUSBDEVICE UcxUsbDevice,
  [in]           PUSB_ENDPOINT_DESCRIPTOR UsbEndpointDescriptor,
  [in]           ULONG UsbEndpointDescriptorBufferLength,
  [in, optional] PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR SuperSpeedEndpointCompanionDescriptor,
  [in]           PUCXENDPOINT_INIT UcxEndpointInit
)
{...}

Parameter

[in] UcxController

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

[in] UcxUsbDevice

Ein Handle zu einem UCX-Objekt, das das USB-Gerät darstellt.

[in] UsbEndpointDescriptor

Ein Zeiger auf einen Speicherort, der einen USB-Deskriptor für den zu erstellenden Endpunkt enthält.

[in] UsbEndpointDescriptorBufferLength

Länge in Byte des Deskriptors.

[in, optional] SuperSpeedEndpointCompanionDescriptor

Ein zusätzlicher Deskriptor für einen Supergeschwindigkeitsport. Dieser Parameter ist optional und kann NULL-sein.

[in] UcxEndpointInit

Ein Zeiger auf eine undurchsichtige Struktur, die Initialisierungsinformationen enthält. Rückrufe für das Endpunktobjekt sind dieser Struktur zugeordnet. Diese Struktur wird von UCX verwaltet.

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.

Bemerkungen

Der UCX-Clienttreiber registriert diese Rückruffunktion mit der USB-Hostcontrollererweiterung (UCX), indem die UcxUsbDeviceCreate-Methode aufgerufen wird.

Die Rückruffunktion ruft UcxEndpointCreate auf, um ein neues Endpunktobjekt zu erstellen und Endpunktobjektrückruffunktionen zu registrieren.

Anschließend erstellt die Rückruffunktion in der Regel eine WDF-Warteschlange, die dem Endpunktobjekt zugeordnet ist. Die Warteschlange empfängt keine Anforderungen, bis die Klassenerweiterung sie startet.

Beispiele

NTSTATUS
Endpoint_EvtUcxUsbDeviceEndpointAdd(
    UCXCONTROLLER                                   UcxController,
    UCXUSBDEVICE                                    UcxUsbDevice,
    PUSB_ENDPOINT_DESCRIPTOR                        UsbEndpointDescriptor,
    ULONG                                           UsbEndpointDescriptorBufferLength,
    PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR   SuperSpeedEndpointCompanionDescriptor,
    PUCXENDPOINT_INIT                               UcxEndpointInit
)

{
    NTSTATUS                        status = STATUS_SUCCESS;

    UCX_ENDPOINT_EVENT_CALLBACKS    ucxEndpointEventCallbacks;
    WDF_OBJECT_ATTRIBUTES           objectAttributes;

    PUCX_CONTROLLER_CONTEXT         ucxControllerContext;

    UCXENDPOINT                     ucxEndpoint;
    PUCX_ENDPOINT_CONTEXT           ucxEndpointContext;

    WDF_IO_QUEUE_CONFIG             queueConfig;

    UNREFERENCED_PARAMETER(UsbEndpointDescriptor);
    UNREFERENCED_PARAMETER(UsbEndpointDescriptorBufferLength);
    UNREFERENCED_PARAMETER(SuperSpeedEndpointCompanionDescriptor);

    UCX_ENDPOINT_EVENT_CALLBACKS_INIT(&ucxEndpointEventCallbacks,
                                      Endpoint_EvtUcxEndpointPurge,
                                      Endpoint_EvtUcxEndpointStart,
                                      Endpoint_EvtUcxEndpointAbort,
                                      Endpoint_EvtUcxEndpointReset,
                                      Endpoint_EvtUcxEndpointOkToCancelTransfers,
                                      Endpoint_EvtUcxEndpointStaticStreamsAdd,
                                      Endpoint_EvtUcxEndpointStaticStreamsEnable,
                                      Endpoint_EvtUcxEndpointStaticStreamsDisable,
                                      Endpoint_EvtUcxEndpointEnableForwardProgress);

    UcxEndpointInitSetEventCallbacks(UcxEndpointInit, &ucxEndpointEventCallbacks);

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&objectAttributes, UCX_ENDPOINT_CONTEXT);

    ucxControllerContext = GetUcxControllerContext(UcxController);

    status = UcxEndpointCreate(UcxUsbDevice,
        &UcxEndpointInit,
        &objectAttributes,
        &ucxEndpoint);

    if (!NT_SUCCESS(status)) {
        DbgTrace(TL_ERROR, Endpoint, "UcxEndpoint Failed %!STATUS!", status);
        goto EvtUsbDeviceEndpointAddEnd;
    }

    DbgTrace(TL_INFO, Endpoint, "UcxEndpoint created");

    ucxEndpointContext = GetUcxEndpointContext(ucxEndpoint);

    ucxEndpointContext->IsDefault = FALSE;
    ucxEndpointContext->MaxPacketSize = MAX_PACKET_SIZE;

    WDF_IO_QUEUE_CONFIG_INIT(&queueConfig, WdfIoQueueDispatchManual);

    status = WdfIoQueueCreate(ucxControllerContext->WdfDevice,
        &queueConfig,
        WDF_NO_OBJECT_ATTRIBUTES,
        &ucxEndpointContext->IoQueue);

    if (!NT_SUCCESS(status)) {
        DbgTrace(TL_ERROR, Endpoint, "WdfIoQueueCreate Failed %!STATUS!", status);
        goto EvtUsbDeviceEndpointAddEnd;
    }

    UcxEndpointSetWdfIoQueue(ucxEndpoint, ucxEndpointContext->IoQueue);

EvtUsbDeviceEndpointAddEnd:

    return status;
}

Anforderungen

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

Siehe auch

UcxDefaultEndpointInitSetEventCallbacks

UcxEndpointCreate

UcxUsbDeviceCreate

WDF_IO_QUEUE_CONFIG_INIT

WdfIoQueueCreate