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 バッファーが要求されます。
[in] OutputBufferLength
出力バッファーが使用可能な場合は、要求の出力バッファーの長さ (バイト単位)。
[out, optional] OutputBuffer
バッファーのアドレスを受け取る場所へのポインター。 特定の機能では、このバッファー内の UCX に追加情報を提供する必要がある場合があります。
[out] ResultLength
戻り値として、コールバック関数が OutputBuffer に格納した情報のサイズをバイト単位で格納する場所。
戻り値
操作が成功した場合、コールバック関数は STATUS_SUCCESS、またはNT_SUCCESS(status) が TRUE と等しい別の状態値を返す必要があります。 それ以外の場合は、NT_SUCCESS(status) が FALSE の状態値を返す必要があります。
リターン コード | 説明 |
---|---|
|
要求された USB 機能がサポートされています。 |
|
要求された USB 機能は不明であり、サポートされていません。 |
|
コントローラーは、要求された USB 機能をサポートしていません。
GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCELの場合、コントローラーは、TT ハブに送信された低速/フル スピード非同期 (一括または制御) 転送を取り消すときに CLEAR TT バッファーを要求しませんでした。 |
注釈
UCX クライアント ドライバーは、UcxControllerCreate メソッドを呼び出して、そのEVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY実装を USB ホスト コントローラー拡張機能 (UCX) に登録します。
例
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 |
Header | ucxcontroller.h (Ucxclass.h を含む) |
IRQL | PASSIVE_LEVEL |