共用方式為


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中樞的低速/全速異步(大量或控制)傳輸時,要求清除TT緩衝區。
如需詳細資訊,請參閱 USBD_QueryUsbCapability 的一節。

[in] OutputBufferLength

如果可用的輸出緩衝區,則要求輸出緩衝區的長度,以位元組為單位。

[out, optional] OutputBuffer

接收緩衝區位址之位置的指標。 某些功能可能需要在此緩衝區中將其他資訊提供給UCX。

[out] ResultLength

傳回時的位置包含回呼函式儲存在 outputBuffer 中的資訊大小,以位元組為單位。

傳回值

如果作業成功,回呼函式必須傳回STATUS_SUCCESS,或NT_SUCCESS(status) 等於 TRUE 的另一個狀態值。 否則,它必須傳回狀態值,NT_SUCCESS(status) 等於 FALSE。

傳回碼 描述
STATUS_SUCCESS
支援要求的 USB 功能。
STATUS_NOT_IMPLEMENTED
要求的USB功能未知且不受支援。
STATUS_NOT_SUPPORTED
控制器不支援要求的USB功能。

針對GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL,控制器在取消傳送至 TT 中樞的低速/全速異步(大量或控制)傳輸時,不會要求清除 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;
}

要求

要求 價值
目標平臺 窗戶
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
標頭 ucxcontroller.h (include Ucxclass.h)
IRQL PASSIVE_LEVEL

另請參閱

UcxControllerCreate