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 方法,向 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;
}
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
最低 KMDF 版本 | 1.0 |
最低UMDF版本 | 2.0 |
標頭 | ucxusbdevice.h (包含 Ucxclass.h) |
IRQL | PASSIVE_LEVEL |