// ucxcontroller.h
EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY EvtUcxControllerQueryUsbCapability;
NTSTATUS EvtUcxControllerQueryUsbCapability(
[in] UCXCONTROLLER UcxController,
[in] PGUID CapabilityType,
[in] ULONG OutputBufferLength,
[out, optional] PVOID OutputBuffer,
[out] PULONG ResultLength
)
{...}
View the official Windows Driver Kit DDI referenceNo description available.
The client driver's implementation to determine if the controller supports a specific capability.
UcxController [in]A handle to the UCX controller that the client driver received in a previous call to the UcxControllerCreate method.
CapabilityType [in]Pointer to a GUID specifying the requested capability. The possible PGUID values are as follows:
See the Remarks section of USBD_QueryUsbCapability for more information.
OutputBufferLength [in]The length, in bytes, of the request's output buffer, if an output buffer is available.
OutputBuffer [out, optional]A pointer to a location that receives the buffer's address. Certain capabilities may need to provide additional information to UCX in this buffer.
ResultLength [out]A location that, on return, contains the size, in bytes, of the information that the callback function stored in OutputBuffer.
If the operation is successful, the callback function must return STATUS_SUCCESS, or another status value for which NT_SUCCESS(status) equals TRUE. Otherwise it must return a status value for which NT_SUCCESS(status) equals FALSE.
| Return code | Description |
|---|---|
| STATUS_SUCCESS | The requested USB capability is supported. |
| STATUS_NOT_IMPLEMENTED | The requested USB capability is unknown and not supported. |
| STATUS_NOT_SUPPORTED | Controller does not support the requested USB capability. For GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, the controller did not request a Clear TT Buffer when canceling Low Speed/Full Speed asynchronous (Bulk or Control) transfers that were sent to a TT hub. |
The UCX client driver registers its EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY implementation with the USB host controller extension (UCX) by calling the UcxControllerCreate method.
NTSTATUS
Controller_EvtControllerQueryUsbCapability(
UCXCONTROLLER UcxController,
PGUID CapabilityType,
ULONG OutputBufferLength,
PVOID OutputBuffer,
PULONG ResultLength
)
{
NTSTATUS status;
UNREFERENCED_PARAMETER(UcxController);
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(OutputBuffer);
*ResultLength = 0;
if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_CHAINED_MDLS,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_CHAINED_MDLS supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_CHAINED_MDLS not supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_STATIC_STREAMS,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_STATIC_STREAMS supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_STATIC_STREAMS supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_FUNCTION_SUSPEND,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_FUNCTION_SUSPEND supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_FUNCTION_SUSPEND not supported");
status = STATUS_NOT_SUPPORTED;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_SELECTIVE_SUSPEND,
sizeof(GUID)) == sizeof(GUID)) {
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_SELECTIVE_SUSPEND supported");
status = STATUS_SUCCESS;
}
else if (RtlCompareMemory(CapabilityType,
&GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL,
sizeof(GUID)) == sizeof(GUID)) {
//
// TODO: Is GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL supported?
//
DbgTrace(TL_INFO, Controller, "GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL not supported");
status = STATUS_NOT_SUPPORTED;
}
else {
DbgTrace(TL_INFO, Controller, "Unhandled USB capability");
status = STATUS_NOT_IMPLEMENTED;
}
return status;
}