EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD 콜백 함수(ucxusbdevice.h)

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

구문

EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD EvtUcxUsbdeviceDefaultEndpointAdd;

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

매개 변수

[in] UcxController

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

[in] UcxUsbDevice

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

[in] MaxPacketSize

이 엔드포인트의 전송에 대한 최대 패킷 크기입니다.

[in] UcxEndpointInit

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

반환 값

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

설명

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

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

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

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

요구 사항

   
대상 플랫폼 Windows
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
헤더 ucxusbdevice.h(Ucxclass.h 포함)
IRQL PASSIVE_LEVEL

참고 항목