EVT_UCX_USBDEVICE_ENDPOINT_ADD fungsi panggilan balik (ucxusbdevice.h)

Implementasi driver klien yang dipanggil UCX untuk menambahkan titik akhir baru untuk perangkat USB.

Sintaks

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

Handel ke pengontrol UCX yang diterima driver klien dalam panggilan sebelumnya ke metode UcxControllerCreate .

[in] UcxUsbDevice

Handel ke objek UCX yang mewakili perangkat USB.

[in] UsbEndpointDescriptor

Pointer ke lokasi yang berisi deskriptor USB untuk titik akhir yang sedang dibuat.

[in] UsbEndpointDescriptorBufferLength

Panjang dalam byte deskriptor.

[in, optional] SuperSpeedEndpointCompanionDescriptor

Deskriptor tambahan untuk port kecepatan super. Parameter ini bersifat opsional dan mungkin NULL.

[in] UcxEndpointInit

Penunjuk ke struktur buram yang berisi informasi inisialisasi. Panggilan balik untuk objek titik akhir dikaitkan dengan struktur ini. Struktur ini dikelola oleh UCX.

Nilai kembali

Jika operasi berhasil, fungsi panggilan balik harus mengembalikan STATUS_SUCCESS, atau nilai status lain yang NT_SUCCESS(status) sama dengan TRUE. Jika tidak, itu harus mengembalikan nilai status yang NT_SUCCESS(status) sama dengan FALSE.

Keterangan

Driver klien UCX mendaftarkan fungsi panggilan balik ini dengan ekstensi pengontrol host USB (UCX) dengan memanggil metode UcxUsbDeviceCreate .

Fungsi panggilan balik memanggil UcxEndpointCreate untuk membuat objek titik akhir baru dan mendaftarkan fungsi panggilan balik objek titik akhir.

Kemudian, fungsi panggilan balik biasanya membuat antrean WDF yang terkait dengan objek titik akhir. Antrean tidak menerima permintaan apa pun sampai ekstensi kelas memulainya.

Contoh

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

Persyaratan

Persyaratan Nilai
Target Platform Windows
Versi KMDF minimum 1,0
Versi UMDF minimum 2.0
Header ucxusbdevice.h (termasuk Ucxclass.h)
IRQL PASSIVE_LEVEL

Lihat juga

UcxDefaultEndpointInitSetEventCallbacks

UcxEndpointBuat

UcxUsbDeviceBuat

WDF_IO_QUEUE_CONFIG_INIT

WdfIoQueueBuat