Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Implementierung des Clienttreibers, die UCX aufruft, um einen neuen Standardendpunkt für ein USB-Gerät hinzuzufügen.
Syntax
EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD EvtUcxUsbdeviceDefaultEndpointAdd;
NTSTATUS EvtUcxUsbdeviceDefaultEndpointAdd(
[in] UCXCONTROLLER UcxController,
[in] UCXUSBDEVICE UcxUsbDevice,
[in] ULONG MaxPacketSize,
[in] PUCXENDPOINT_INIT UcxEndpointInit
)
{...}
Parameter
[in] UcxController
Ein Handle für den UCX-Controller, den der Clienttreiber in einem vorherigen Aufruf der UcxControllerCreate-Methode empfangen hat.
[in] UcxUsbDevice
Ein Handle zu einem UCX-Objekt, das das USB-Gerät darstellt.
[in] MaxPacketSize
Maximale Paketgröße für Übertragungen auf diesem Endpunkt.
[in] UcxEndpointInit
Ein Zeiger auf eine undurchsichtige Struktur, die Initialisierungsinformationen enthält. Rückrufe für das Endpunktobjekt sind dieser Struktur zugeordnet. Diese Struktur wird von UCX verwaltet.
Rückgabewert
Wenn der Vorgang erfolgreich ist, muss die Rückruffunktion STATUS_SUCCESS oder einen anderen Statuswert zurückgeben, für den NT_SUCCESS(Status) WAHR ist. Andernfalls muss ein Statuswert zurückgegeben werden, für den NT_SUCCESS(Status) FALSE entspricht.
Bemerkungen
Der UCX-Clienttreiber registriert diese Rückruffunktion mit der USB-Hostcontrollererweiterung (UCX), indem die UcxUsbDeviceCreate-Methode aufgerufen wird.
Die Rückruffunktion ruft UcxEndpointCreate auf, um ein neues Standardendpunktobjekt zu erstellen und die Standardmäßigen Endpunktobjektrückruffunktionen zu registrieren.
Anschließend erstellt die Rückruffunktion in der Regel eine WDF-Warteschlange, die dem Endpunktobjekt zugeordnet ist. Die Warteschlange empfängt keine Anforderungen, bis die Klassenerweiterung sie startet.
Beispiele
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;
}
Anforderungen
| Anforderung | Wert |
|---|---|
| Zielplattform- | Fenster |
| Minimale KMDF-Version | 1.0 |
| Mindest-UMDF-Version | 2.0 |
| Header- | ucxusbdevice.h (include Ucxclass.h) |
| IRQL- | PASSIVE_LEVEL |