EVT_UFX_DEVICE_ENDPOINT_ADD função de retorno de chamada (ufxclient.h)
A implementação do driver cliente para criar um objeto de ponto de extremidade padrão.
Sintaxe
EVT_UFX_DEVICE_ENDPOINT_ADD EvtUfxDeviceEndpointAdd;
NTSTATUS EvtUfxDeviceEndpointAdd(
[in] UFXDEVICE unnamedParam1,
[in] const PUSB_ENDPOINT_DESCRIPTOR unnamedParam2,
[in, out] PUFXENDPOINT_INIT unnamedParam3
)
{...}
Parâmetros
[in] unnamedParam1
O identificador para um objeto de dispositivo USB que o driver cliente recebeu em uma chamada anterior para o UfxDeviceCreate.
[in] unnamedParam2
Um ponteiro para uma estrutura USB_ENDPOINT_DESCRIPTOR que contém dados do descritor.
[in, out] unnamedParam3
Um ponteiro para um UFXENDPOINT_INIT estrutura opaca que contém o descritor de ponto de extremidade necessário para criar um objeto de ponto de extremidade.
Retornar valor
Se a operação for bem-sucedida, a função de retorno de chamada deverá retornar STATUS_SUCCESS ou outro valor status para o qual NT_SUCCESS(status) é igual a TRUE. Caso contrário, ele deverá retornar um valor status para o qual NT_SUCCESS(status) é igual a FALSE.
Comentários
O driver do cliente para o controlador de host de função registra sua implementação de EVT_UFX_DEVICE_ENDPOINT_ADD com a extensão de classe de função USB (UFX) chamando o método UfxDeviceCreate .
Para criar o ponto de extremidade, espera-se que o driver cliente inicialize os atributos das filas de comando e transferência do ponto de extremidade e, em seguida, chame UfxEndpointCreate para criar o ponto de extremidade.
O driver do cliente indica a conclusão desse evento chamando o método UfxDeviceEventComplete .
Exemplos
EVT_UFX_DEVICE_ENDPOINT_ADD UfxDevice_EvtDeviceEndpointAdd;
NTSTATUS
UfxDevice_EvtDeviceEndpointAdd (
_In_ UFXDEVICE UfxDevice,
_In_ const PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor,
_Inout_ PUFXENDPOINT_INIT EndpointInit
)
/*++
Routine Description:
EvtDeviceEndpointAdd handler for the UFXDEVICE object.
Creates UFXENDPOINT object corresponding to the newly reported endpoint.
Arguments:
UfxDevice - UFXDEVICE object representing the device.
EndpointDescriptor - Constant Pointer to Endpoint descriptor for the
newly reported endpoint.
EndpointInit - Pointer to the Opaque UFXENDPOINT_INIT object
Return Value:
STATUS_SUCCESS on success, or an appropriate NTSTATUS message on failure.
--*/
{
NTSTATUS Status;
WDF_OBJECT_ATTRIBUTES Attributes;
WDF_IO_QUEUE_CONFIG TransferQueueConfig;
WDF_OBJECT_ATTRIBUTES TransferQueueAttributes;
WDF_IO_QUEUE_CONFIG CommandQueueConfig;
WDF_OBJECT_ATTRIBUTES CommandQueueAttributes;
UFXENDPOINT Endpoint;
PUFXENDPOINT_CONTEXT EpContext;
PUFXDEVICE_CONTEXT DeviceContext;
UFX_ENDPOINT_CALLBACKS Callbacks;
PENDPOINT_QUEUE_CONTEXT QueueContext;
WDFQUEUE Queue;
TraceEntry();
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&Attributes, UFXENDPOINT_CONTEXT);
Attributes.ExecutionLevel = WdfExecutionLevelPassive;
Attributes.EvtCleanupCallback = UfxEndpoint_Cleanup;
//
// Note: Execution level needs to be passive to avoid deadlocks with WdfRequestComplete.
//
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&TransferQueueAttributes, ENDPOINT_QUEUE_CONTEXT);
TransferQueueAttributes.ExecutionLevel = WdfExecutionLevelPassive;
WDF_IO_QUEUE_CONFIG_INIT(&TransferQueueConfig, WdfIoQueueDispatchManual);
TransferQueueConfig.AllowZeroLengthRequests = TRUE;
TransferQueueConfig.EvtIoStop = EndpointQueue_EvtIoStop;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&CommandQueueAttributes, ENDPOINT_QUEUE_CONTEXT);
CommandQueueAttributes.ExecutionLevel = WdfExecutionLevelPassive;
WDF_IO_QUEUE_CONFIG_INIT(&CommandQueueConfig, WdfIoQueueDispatchSequential);
CommandQueueConfig.EvtIoInternalDeviceControl = EvtEndpointCommandQueue;
UFX_ENDPOINT_CALLBACKS_INIT(&Callbacks);
UfxEndpointInitSetEventCallbacks(EndpointInit, &Callbacks);
Status = UfxEndpointCreate(
Device,
EndpointInit,
&Attributes,
&TransferQueueConfig,
&TransferQueueAttributes,
&CommandQueueConfig,
&CommandQueueAttributes,
&Endpoint);
Status = WdfCollectionAdd(DeviceContext->Endpoints, Endpoint);
EpContext = UfxEndpointGetContext(Endpoint);
EpContext->UfxDevice = Device;
EpContext->WdfDevice = DeviceContext->FdoWdfDevice;
RtlCopyMemory(&EpContext->Descriptor, Descriptor, sizeof(*Descriptor));
Queue = UfxEndpointGetTransferQueue(Endpoint);
QueueContext = EndpointQueueGetContext(Queue);
QueueContext->Endpoint = Endpoint;
Queue = UfxEndpointGetCommandQueue(Endpoint);
QueueContext = EndpointQueueGetContext(Queue);
QueueContext->Endpoint = Endpoint;
//
// This can happen if we're handling a SetInterface command.
//
if (DeviceContext->UsbState == UsbfnDeviceStateConfigured) {
UfxEndpointConfigure(Endpoint);
}
Status = WdfIoQueueReadyNotify(
UfxEndpointGetTransferQueue(Endpoint),
TransferReadyNotify,
Endpoint);
End:
TraceExit();
return Status;
}
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Windows |
Versão mínima do KMDF | 1.0 |
Versão mínima do UMDF | 2,0 |
Cabeçalho | ufxclient.h |
IRQL | PASSIVE_LEVEL |