EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD fungsi panggilan balik (ucxusbdevice.h)

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

Sintaks

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

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] MaxPacketSize

Ukuran paket maksimum untuk transfer pada titik akhir ini.

[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 default baru dan mendaftarkan fungsi panggilan balik objek titik akhir defaultnya.

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

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