Share via


EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD Rückruffunktion (ucxusbdevice.h)

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

Syntax

EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD EvtUcxUsbdeviceDefaultEndpointAdd;

NTSTATUS EvtUcxUsbdeviceDefaultEndpointAdd(
  [in] UCXCONTROLLER UcxController,
  [in] UCXUSBDEVICE UcxUsbDevice,
  [in] ULONG MaxPacketSize,
  [in] PUCXENDPOINT_INIT UcxEndpointInit
)
{...}

Parameter

[in] UcxController

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

[in] UcxUsbDevice

Ein Handle für ein UCX-Objekt, das das USB-Gerät darstellt.

[in] MaxPacketSize

Maximale Paketgröße für Übertragungen auf diesem Endpunkt.

[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 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.

Hinweise

Der UCX-Clienttreiber registriert diese Rückruffunktion bei der USB-Hostcontrollererweiterung (UCX), indem er die UcxUsbDeviceCreate-Methode aufruft .

Die Rückruffunktion ruft UcxEndpointCreate auf, um ein neues Standardendpunktobjekt zu erstellen und dessen Standardmäßige 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_EvtUcxUsbDeviceDefaultEndpointAdd(
    UCXCONTROLLER           UcxController,
    UCXUSBDEVICE            UcxUsbDevice,
    ULONG                   MaxPacketSize,
    PUCXENDPOINT_INIT       EndpointInit
)

{
    NTSTATUS                                status = STATUS_SUCCESS;

    UCX_DEFAULT_ENDPOINT_EVENT_CALLBACKS    ucxDefaultEndpointEventCallbacks;
    WDF_OBJECT_ATTRIBUTES                   objectAttributes;

    PUCX_CONTROLLER_CONTEXT                 ucxControllerContext;

    UCXENDPOINT                             ucxEndpoint;
    PUCX_ENDPOINT_CONTEXT                   ucxEndpointContext;


    WDF_IO_QUEUE_CONFIG                     queueConfig;
    WDFQUEUE                                wdfQueue;


    UCX_DEFAULT_ENDPOINT_EVENT_CALLBACKS_INIT(&ucxDefaultEndpointEventCallbacks,
                                              Endpoint_EvtUcxEndpointPurge,
                                              Endpoint_EvtUcxEndpointStart,
                                              Endpoint_EvtUcxEndpointAbort,
                                              Endpoint_EvtUcxEndpointOkToCancelTransfers,
                                              Endpoint_EvtUcxDefaultEndpointUpdate);

    UcxDefaultEndpointInitSetEventCallbacks(EndpointInit, &ucxDefaultEndpointEventCallbacks);

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&objectAttributes, UCX_ENDPOINT_CONTEXT);

    ucxControllerContext = GetUcxControllerContext(UcxController);

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

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

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

    ucxEndpointContext = GetUcxEndpointContext(ucxEndpoint);

    ucxEndpointContext->IsDefault = TRUE;
    ucxEndpointContext->MaxPacketSize = MaxPacketSize;

    WDF_IO_QUEUE_CONFIG_INIT(&queueConfig, WdfIoQueueDispatchManual);

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

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

    UcxEndpointSetWdfIoQueue(ucxEndpoint, wdfQueue);

EvtUsbDeviceDefaultEndpointAddEnd:

    return status;
}

Anforderungen

Anforderung Wert
Zielplattform Windows
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile ucxusbdevice.h (include Ucxclass.h)
IRQL PASSIVE_LEVEL

Weitere Informationen