15#define UCX_DRIVER_TRACKING_CODE 4
16#define UCX_REPORTED_USBDI_VERSION 0x600
19#define UCX_BUS_BANDWIDTH (7000 * 8 * 8)
21#define UCX_PASS_THRU_MAX_LENGTH 0x10000
22#define UCX_LEGACY_NAME_ATTEMPTS 5
23#define UCX_SYNTHETIC_FRAME_MASK 0x7FF
26#define UCX_USER_HEADER_SIZE sizeof(USBUSER_REQUEST_HEADER)
27#define UCX_USER_NAME_MIN sizeof(USB_UNICODE_NAME)
52 PUSBUSER_REQUEST_HEADER
80 DPRINT1(
"USBUSER request 0x%lx needs %lu bytes, got %lu\n",
103 return (WDMUSB_POWER_STATE)(WdmUsbPowerDeviceUnspecified +
State);
105 return WdmUsbPowerNotMapped;
116 return (WDMUSB_POWER_STATE)(WdmUsbPowerSystemUnspecified +
State);
118 return WdmUsbPowerNotMapped;
130 PUSB_CONTROLLER_INFO_0
Info =
User.Payload<USB_CONTROLLER_INFO_0>();
134 Info->PciDeviceId = Pci->DeviceId;
135 Info->PciRevision = Pci->RevisionId;
138 Info->NumberOfRootPorts =
Controller->m_RootHub->m_NumberOf20Ports;
140 Info->HcFeatureFlags = 0;
142 User.SetStatus(UsbUserSuccess);
150UcxUserGetDriverKeyName(
154 PUSB_UNICODE_NAME
Name =
User.Payload<USB_UNICODE_NAME>();
161 User.SetStatus(UsbUserBufferTooSmall);
171 User.SetStatus(UsbUserSuccess);
176 User.SetStatus(UsbUserBufferTooSmall);
181 User.SetStatus(UsbUserInvalidParameter);
192UcxGetStrippedRootHubName(
255UcxUserGetRootHubName(
259 PUSB_UNICODE_NAME
Name =
User.Payload<USB_UNICODE_NAME>();
267 User.SetStatus(UsbUserBufferTooSmall);
276 User.SetStatus(UsbUserInvalidParameter);
292 User.SetStatus(UsbUserBufferTooSmall);
296 User.SetStatus(UsbUserSuccess);
315 DPRINT1(
"Pass through parameter length %lu is too large\n",
Length);
316 User.SetStatus(UsbUserInvalidParameter);
319 User.Header()->RequestBufferLength)
321 DPRINT1(
"Pass through buffer too small for %lu parameter bytes\n",
Length);
322 User.SetStatus(UsbUserBufferTooSmall);
326 DPRINT(
"Pass through request is not serviced\n");
327 User.SetStatus(UsbUserMiniportError);
343 if (SleepState <= HcCaps->SystemWake)
363 PUSB_POWER_INFO
Info =
User.Payload<USB_POWER_INFO>();
371 DPRINT1(
"Power state map requested before root hub %p started\n",
RootHub);
372 User.SetStatus(UsbUserDeviceNotStarted);
382 if (
Info->SystemState < WdmUsbPowerSystemWorking ||
Info->SystemState > WdmUsbPowerSystemHibernate)
408 PUSB_BANDWIDTH_INFO
Info =
User.Payload<USB_BANDWIDTH_INFO>();
426 if (
Controller->m_Config.EvtControllerGetCurrentFrameNumber !=
NULL)
445 PUSB_BUS_STATISTICS_0 Stats =
User.Payload<USB_BUS_STATISTICS_0>();
450 Stats->DeviceCount =
Controller->m_ChildDeviceCount;
455 Frame = Stats->CurrentUsbFrame;
457 Stats->CurrentUsbFrame = Frame;
459 Stats->BulkBytes = 0;
461 Stats->InterruptBytes = 0;
462 Stats->ControlDataBytes = 0;
463 Stats->CommonBufferBytes = 0;
466 Stats->PciInterruptCount = 1;
468 Stats->HardResetCount = 0;
469 Stats->WorkerSignalCount = 0;
470 Stats->WorkerIdleTimeMs = 0;
474 Stats->RootHubEnabled =
FALSE;
475 Stats->RootHubDevicePowerState = 4;
479 Stats->RootHubEnabled =
TRUE;
480 Stats->RootHubDevicePowerState =
Controller->m_RootHubInD0 ? 0 : 2;
491 PUSB_DRIVER_VERSION_PARAMETERS
Version =
User.Payload<USB_DRIVER_VERSION_PARAMETERS>();
495 Version->USBUSER_Version = USBUSER_VERSION;
514 { USBUSER_GET_CONTROLLER_INFO_0,
sizeof(USB_CONTROLLER_INFO_0) },
515 { USBUSER_GET_CONTROLLER_DRIVER_KEY,
sizeof(USB_UNICODE_NAME) },
516 { USBUSER_PASS_THRU,
sizeof(USB_PASS_THRU_PARAMETERS) },
517 { USBUSER_GET_POWER_STATE_MAP,
sizeof(USB_POWER_INFO) },
518 { USBUSER_GET_BANDWIDTH_INFORMATION,
sizeof(USB_BANDWIDTH_INFO) },
519 { USBUSER_GET_BUS_STATISTICS_0,
sizeof(USB_BUS_STATISTICS_0) },
520 { USBUSER_GET_ROOTHUB_SYMBOLIC_NAME,
sizeof(USB_UNICODE_NAME) },
521 { USBUSER_GET_USB_DRIVER_VERSION,
sizeof(USB_DRIVER_VERSION_PARAMETERS) },
522 { USBUSER_USB_REFRESH_HCT_REG,
sizeof(
ULONG) },
523 { USBUSER_OP_SEND_ONE_PACKET,
sizeof(PACKET_PARAMETERS) },
524 { USBUSER_OP_RAW_RESET_PORT,
sizeof(RAW_RESET_PORT_PARAMETERS) },
525 { USBUSER_SET_ROOTPORT_FEATURE,
sizeof(RAW_ROOTPORT_FEATURE) },
526 { USBUSER_CLEAR_ROOTPORT_FEATURE,
sizeof(RAW_ROOTPORT_FEATURE) },
527 { USBUSER_GET_ROOTPORT_STATUS,
sizeof(RAW_ROOTPORT_FEATURE) }
560 switch (
User.Header()->UsbUserRequest)
562 case USBUSER_GET_CONTROLLER_INFO_0:
566 case USBUSER_GET_CONTROLLER_DRIVER_KEY:
567 UcxUserGetDriverKeyName(
User,
Fdo);
570 case USBUSER_PASS_THRU:
574 case USBUSER_GET_POWER_STATE_MAP:
578 case USBUSER_GET_BANDWIDTH_INFORMATION:
582 case USBUSER_GET_BUS_STATISTICS_0:
586 case USBUSER_GET_ROOTHUB_SYMBOLIC_NAME:
590 case USBUSER_GET_USB_DRIVER_VERSION:
595 case USBUSER_USB_REFRESH_HCT_REG:
599 case USBUSER_OP_SEND_ONE_PACKET:
600 DPRINT1(
"USBUSER send one packet is not supported\n");
601 User.SetStatus(UsbUserInvalidHeaderParameter);
604 case USBUSER_OP_RAW_RESET_PORT:
605 case USBUSER_SET_ROOTPORT_FEATURE:
606 case USBUSER_CLEAR_ROOTPORT_FEATURE:
607 case USBUSER_GET_ROOTPORT_STATUS:
608 DPRINT1(
"USBUSER test request 0x%lx is disabled\n",
User.Header()->UsbUserRequest);
609 User.SetStatus(UsbUserFeatureDisabled);
617 DPRINT1(
"Unknown USBUSER request 0x%lx\n",
User.Header()->UsbUserRequest);
620 User.SetStatus(UsbUserInvalidRequestCode);
636 PUSBUSER_REQUEST_HEADER
Header;
657 Header->UsbUserStatusCode = UsbUserSuccess;
662 DPRINT1(
"USBUSER header length %lu differs from buffer length %Iu\n",
664 User.SetStatus(UsbUserInvalidHeaderParameter);
698 PUSB_UNICODE_NAME
Name;
731 Block->UsbUserRequest = USBUSER_GET_CONTROLLER_DRIVER_KEY;
732 UcxUserGetDriverKeyName(
User,
Fdo);
736 Block->UsbUserRequest = USBUSER_GET_ROOTHUB_SYMBOLIC_NAME;
740 if (
Block->UsbUserStatusCode != UsbUserBufferTooSmall)
750 DPRINT1(
"Name IOCTL 0x%lx failed, USBUSER status %d\n",
813 case IOCTL_USB_USER_REQUEST:
840 PUSB_DEVICE_NODE_INFO
Node = (PUSB_DEVICE_NODE_INFO)
OutBuffer;
853 Node->Sig = USB_NODE_INFO_SIG;
854 Node->LengthInBytes =
sizeof(*Node);
856 sizeof(
Node->DeviceDescription),
859 Node->NodeType = UsbController;
867 Node->ControllerDeviceInfo.NumberOfRootPorts =
RootHub->m_NumberOf20Ports +
RootHub->m_NumberOf30Ports;
868 Node->ControllerDeviceInfo.HcFeatureFlags = USB_HC_FEATURE_FLAG_SEL_SUSPEND;
static UcxController * FromFdo(_In_ WDFDEVICE Fdo)
UcxUserRequest(_In_ PUSBUSER_REQUEST_HEADER Header, _In_ ULONG BufferLength)
PUSBUSER_REQUEST_HEADER Header() const
PUSBUSER_REQUEST_HEADER m_Header
VOID SetStatus(_In_ USB_USER_ERROR_CODE Status)
BOOLEAN CheckParameterLength(_In_ ULONG ParameterLength)
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
#define NT_SUCCESS(StatCode)
#define _IRQL_requires_(irql)
#define KeQuerySystemTime(t)
#define ExFreePoolWithTag(_P, _T)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define _Out_writes_bytes_to_(s, c)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
NTSTRSAFEAPI RtlStringCbCopyA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCSTR pszSrc)
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
#define STATUS_BUFFER_TOO_SMALL
WCHAR RootHubName[ANYSIZE_ARRAY]
DEVICE_POWER_STATE DeviceWake
SYSTEM_POWER_STATE SystemWake
DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
_In_ PGUID _In_ ULONG OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_Must_inspect_result_ _In_ UCXCONTROLLER _In_ PUCX_ROOTHUB_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXROOTHUB * RootHub
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG ParameterLength
#define IOCTL_USB_DIAGNOSTIC_MODE_ON
#define IOCTL_GET_HCD_DRIVERKEY_NAME
#define IOCTL_USB_DIAGNOSTIC_MODE_OFF
struct _USB_ROOT_HUB_NAME USB_ROOT_HUB_NAME
#define IOCTL_USB_GET_ROOT_HUB_NAME
static VOID NTAPI UcxHandleUserRequest(_In_ WDFDEVICE Fdo, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength)
static WDMUSB_POWER_STATE NTAPI UcxMapSystemPowerState(_In_ SYSTEM_POWER_STATE State)
#define UCX_DRIVER_TRACKING_CODE
#define UCX_LEGACY_NAME_ATTEMPTS
static VOID NTAPI UcxUserPassThru(_Inout_ UcxUserRequest &User)
static VOID NTAPI UcxUserGetBandwidthInformation(_Inout_ UcxUserRequest &User)
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, ActualLength)
static VOID NTAPI UcxMapWakeAndPower(_In_ const DEVICE_CAPABILITIES *HcCaps, _In_ SYSTEM_POWER_STATE SleepState, _Out_ PUSB_POWER_INFO Info)
static VOID NTAPI UcxUserGetBusStatistics(_Inout_ UcxUserRequest &User, _In_ UcxController *Controller)
#define UCX_USER_HEADER_SIZE
PUSB_ROOT_HUB_NAME Output
#define UCX_PASS_THRU_MAX_LENGTH
WdfStringGetUnicodeString(Original, &Name)
static BOOLEAN NTAPI UcxLookupUserRequestSize(_In_ ULONG Request, _Out_ PULONG ParameterLength)
#define UCX_USER_NAME_MIN
User Header() -> ActualBufferLength=UCX_USER_HEADER_SIZE+UCX_USER_NAME_MIN+ResultLength
static VOID NTAPI UcxRunUserRequest(_Inout_ UcxUserRequest &User, _In_ WDFDEVICE Fdo, _In_ UcxController *Controller)
static VOID NTAPI UcxReadFrameForStatistics(_In_ UcxController *Controller, _Inout_ PULONG Frame)
static VOID NTAPI UcxUserGetPowerStateMap(_Inout_ UcxUserRequest &User, _In_ UcxController *Controller)
_Out_ WDFSTRING * Stripped
static const UcxUserRequestSize UcxUserRequestSizes[]
BOOLEAN NTAPI UcxDispatchUserIoctl(_In_ WDFDEVICE Fdo, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode)
PUSBUSER_REQUEST_HEADER Block
static VOID NTAPI UcxUserGetDriverVersion(_Inout_ UcxUserRequest &User)
WDF_OBJECT_ATTRIBUTES_INIT & Attributes
#define UCX_SYNTHETIC_FRAME_MASK
static VOID NTAPI UcxUserGetControllerInfo(_Inout_ UcxUserRequest &User, _In_ UcxController *Controller)
#define UCX_BUS_BANDWIDTH
#define UCX_REPORTED_USBDI_VERSION
static WDMUSB_POWER_STATE NTAPI UcxMapDevicePowerState(_In_ DEVICE_POWER_STATE State)
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE UcxEvtWmiNodeInfoQueryInstance
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFDEVICE _Out_ PWDF_DEVICE_STATE DeviceState
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
_Must_inspect_result_ _In_ WDFDEVICE Fdo
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_In_ ULONG _Out_ PULONG BufferUsed
_Must_inspect_result_ _In_ WDFWMIINSTANCE WmiInstance
_In_ ULONG _In_ PHYSICAL_ADDRESS BusAddress
@ DevicePropertyDriverKeyName