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(상태)이 TRUE인 다른 상태 값을 반환해야 합니다. 그렇지 않으면 NT_SUCCESS(상태)가 FALSE와 같은 상태 값을 반환해야 합니다.
반환 코드 | 설명 |
---|---|
|
요청된 USB 기능이 지원됩니다. |
|
요청된 USB 기능은 알 수 없으며 지원되지 않습니다. |
|
컨트롤러는 요청된 USB 기능을 지원하지 않습니다.
GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL 경우 컨트롤러는 TT 허브로 전송된 저속/최대 속도 비동기(대량 또는 제어) 전송을 취소할 때 TT 버퍼 지우기를 요청하지 않았습니다. |
설명
UCX 클라이언트 드라이버는 UcxControllerCreate 메서드를 호출하여 EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY 구현을 UCX(USB 호스트 컨트롤러 확장)에 등록합니다.
예제
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 |