EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY回呼函式 (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
)
{...}
參數
[in] UcxController
用戶端驅動程式在先前呼叫 UcxControllerCreate 方法時收到的UCX控制器句柄。
[in] CapabilityType
指定所要求功能的 GUID 指標。 可能的 PGUID 值如下所示:
- GUID_USB_CAPABILITY_CHAINED_MDLS
- GUID_USB_CAPABILITY_STATIC_STREAMS
- GUID_USB_CAPABILITY_SELECTIVE_SUSPEND
- GUID_USB_CAPABILITY_FUNCTION_SUSPEND
- GUID_USB_CAPABILITY_DEVICE_CONNECTION_HIGH_SPEED_COMPATIBLE
- GUID_USB_CAPABILITY_DEVICE_CONNECTION_SUPER_SPEED_COMPATIBLE
- GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL
- 針對一般主機控制器,查詢必須失敗 (STATUS_NOT_SUPPORTED) 。 如果控制器成功這項功能,則會在取消低速/全速異步 (大量或控制) 傳送至 TT 中樞的傳輸時要求 Clear TT 緩衝區。
[in] OutputBufferLength
如果輸出緩衝區可用,則為要求的輸出緩衝區長度,以位元組為單位。
[out, optional] OutputBuffer
接收緩衝區位址之位置的指標。 某些功能可能需要為此緩衝區中的UCX提供其他資訊。
[out] ResultLength
傳回時的位置包含回呼函式儲存在 OutputBuffer 中之資訊的大小,以位元組為單位。
傳回值
如果作業成功,回呼函式必須傳回STATUS_SUCCESS,或NT_SUCCESS (状态) 等於 TRUE 的另一個狀態值。 否則,它必須傳回狀態值,NT_SUCCESS (状态) 等於 FALSE。
傳回碼 | Description |
---|---|
|
支援要求的 USB 功能。 |
|
要求的USB功能未知且不受支援。 |
|
控制器不支援要求的USB功能。
針對GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL,控制器在取消低速/全速異步 (大量或控制) 傳送至 TT 中樞的傳輸時,不會要求 Clear TT 緩衝區。 |
備註
UCX 用戶端驅動程式會呼叫 UcxControllerCreate 方法,向 USB 主控制器擴充功能 (UCX) 註冊其EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY實作。
範例
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;
}
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
最低 KMDF 版本 | 1.0 |
最低UMDF版本 | 2.0 |
標頭 | ucxcontroller.h (包含 Ucxclass.h) |
IRQL | PASSIVE_LEVEL |