EVT_UCX_USBDEVICE_ENDPOINT_ADD 콜백 함수(ucxusbdevice.h)

UCX가 USB 디바이스에 대한 새 엔드포인트를 추가하기 위해 호출하는 클라이언트 드라이버의 구현입니다.

구문

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
)
{...}

매개 변수

[in] UcxController

UcxControllerCreate 메서드에 대한 이전 호출에서 클라이언트 드라이버가 받은 UCX 컨트롤러에 대한 핸들입니다.

[in] UcxUsbDevice

USB 디바이스를 나타내는 UCX 개체에 대한 핸들입니다.

[in] UsbEndpointDescriptor

생성되는 엔드포인트에 대한 USB 설명자가 포함된 위치에 대한 포인터입니다.

[in] UsbEndpointDescriptorBufferLength

설명자의 길이(바이트)입니다.

[in, optional] SuperSpeedEndpointCompanionDescriptor

초고속 포트에 대한 추가 설명자입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

[in] UcxEndpointInit

초기화 정보를 포함하는 불투명 구조체에 대한 포인터입니다. 엔드포인트 개체에 대한 콜백은 이 구조체와 연결됩니다. 이 구조체는 UCX에서 관리됩니다.

반환 값

작업이 성공하면 콜백 함수는 STATUS_SUCCESS 반환하거나 NT_SUCCESS(상태)이 TRUE인 다른 상태 값을 반환해야 합니다. 그렇지 않으면 NT_SUCCESS(상태)가 FALSE와 같은 상태 값을 반환해야 합니다.

설명

UCX 클라이언트 드라이버는 UcxUsbDeviceCreate 메서드를 호출하여 이 콜백 함수를 UCX(USB 호스트 컨트롤러 확장)에 등록합니다.

콜백 함수는 UcxEndpointCreate 를 호출하여 새 엔드포인트 개체를 만들고 엔드포인트 개체 콜백 함수를 등록합니다.

그런 다음 콜백 함수는 일반적으로 엔드포인트 개체와 연결된 WDF 큐를 만듭니다. 큐는 클래스 확장이 시작될 때까지 요청을 받지 않습니다.

예제

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

요구 사항

요구 사항
대상 플랫폼 Windows
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
머리글 ucxusbdevice.h(Ucxclass.h 포함)
IRQL PASSIVE_LEVEL

추가 정보

UcxDefaultEndpointInitSetEventCallbacks

UcxEndpointCreate

UcxUsbDeviceCreate

WDF_IO_QUEUE_CONFIG_INIT

WdfIoQueueCreate