Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

UfxEndpointCreate function (ufxclient.h)

Creates an endpoint object.

Syntax

NTSTATUS UfxEndpointCreate(
 [in] UFXDEVICE UfxDevice,
 [in, out] PUFXENDPOINT_INIT EndpointInit,
 [in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
 [in] PWDF_IO_QUEUE_CONFIG TransferQueueConfig,
 [in, optional] PWDF_OBJECT_ATTRIBUTES TransferQueueAttributes,
 [in] PWDF_IO_QUEUE_CONFIG CommandQueueConfig,
 [in, optional] PWDF_OBJECT_ATTRIBUTES CommandQueueAttributes,
 [out] UFXENDPOINT *UfxEndpoint
);

Parameters

[in] UfxDevice

A handle to a UFX device object that the driver created by calling UfxDeviceCreate.

[in, out] EndpointInit

Opaque structure passed by UFX in the call to EVT_UFX_DEVICE_ENDPOINT_ADD or EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADD.

[in, optional] Attributes

A pointer to caller-allocated WDF_OBJECT_ATTRIBUTES structure. This structure must be initialized with WDF_OBJECT_ATTRIBUTES_INIT or WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE. This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

[in] TransferQueueConfig

A pointer to a caller allocated WDF_IO_QUEUE_CONFIG structure. This structure must be initialized with WDF_IO_QUEUE_CONFIG_INIT.

[in, optional] TransferQueueAttributes

A pointer to caller-allocated WDF_OBJECT_ATTRIBUTES structure. This structure must be initialized with WDF_OBJECT_ATTRIBUTES_INIT or WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE. This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

[in] CommandQueueConfig

A pointer to a caller allocated WDF_IO_QUEUE_CONFIG structure. This structure must be initialized with WDF_IO_QUEUE_CONFIG_INIT.

[in, optional] CommandQueueAttributes

A pointer to caller-allocated WDF_OBJECT_ATTRIBUTES structure. This structure must be initialized with WDF_OBJECT_ATTRIBUTES_INIT or WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE. This parameter is optional and can be WDF_NO_OBJECT_ATTRIBUTES.

[out] UfxEndpoint

A pointer to a location that receives a handle to a UFXENDPOINT object.

Return value

If the operation is successful, the method returns STATUS_SUCCESS, or another status value for which NT_SUCCESS(status) equals TRUE. Otherwise it returns a status value for which NT_SUCCESS(status) equals FALSE.

Remarks

The transfer queue handles the following IOCTLs related to endpoint transfers:

The command queue will handle the following IOCTLs:

The following example shows how to create a UFXENDPOINT object and initialize its context.
NTSTATUS
UfxEndpointAdd (
 _In_ UFXDEVICE Device,
 _In_ PUSB_ENDPOINT_DESCRIPTOR Descriptor,
 _Inout_ PUFXENDPOINT_INIT EndpointInit
 )
/*++
Routine Description:

 Creates a UFXENDPOINT object, and initializes its contexts.

Parameters Description:

 Device - UFXDEVICE associated with the endpoint.

 Descriptor - Endpoint descriptor for this endpoint.

 EndpointInit - Opaque structure from UFX.

Return Value:

 STATUS_SUCCESS if successful, appropriate NTSTATUS message otherwise.
--*/
{
 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();

 DeviceContext = UfxDeviceGetContext(Device);

 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);
 CHK_NT_MSG(Status, "Failed to create ufxendpoint!");

 Status = WdfCollectionAdd(DeviceContext->Endpoints, Endpoint);
 CHK_NT_MSG(Status, "Failed to add endpoint to collection!");

 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;

 Status = TransferInitialize(Endpoint);
 CHK_NT_MSG(Status, "Failed to initialize endpoint transfers");
 
 //
 // This can happen if we're handling a SetInterface command.
 //
 if (DeviceContext->UsbState == UsbfnDeviceStateConfigured) {
 UfxEndpointConfigure(Endpoint);
 }

 Status = WdfIoQueueReadyNotify(
 UfxEndpointGetTransferQueue(Endpoint),
 TransferReadyNotify,
 Endpoint);
 CHK_NT_MSG(Status, "Failed to register ready notify");

End:
 TraceExit();
 return Status;
}

Requirements

Requirement Value
Minimum supported client Windows 10
Target Platform Windows
Header ufxclient.h
Library ufxstub.lib
IRQL PASSIVE_LEVEL

Feedback

Was this page helpful?

Additional resources