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(status) 等于 TRUE 的另一个状态值。 否则,它必须返回NT_SUCCESS(status)等于 FALSE 的状态值。
言论
UCX 客户端驱动程序通过调用 UcxUsbDeviceCreate 方法,将此回调函数注册到 USB 主机控制器扩展 (UCX)。
回调函数调用 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;
}
要求
要求 | 价值 |
---|---|
目标平台 | 窗户 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | ucxusbdevice.h (include Ucxclass.h) |
IRQL | PASSIVE_LEVEL |