23#define HUB_IO_NODE_INFO_SIZE sizeof(USB_NODE_INFORMATION)
24#define HUB_IO_CONNECTION_SIZE FIELD_OFFSET(USB_NODE_CONNECTION_INFORMATION, PipeList)
25#define HUB_IO_NAME_HEADER FIELD_OFFSET(USB_NODE_CONNECTION_NAME, NodeName)
26#define HUB_IO_NAME_SIZE sizeof(USB_NODE_CONNECTION_NAME)
27#define HUB_IO_DESCRIPTOR_HEADER FIELD_OFFSET(USB_DESCRIPTOR_REQUEST, Data)
28#define HUB_IO_ATTRIBUTES_SIZE sizeof(USB_NODE_CONNECTION_ATTRIBUTES)
29#define HUB_IO_HUB_INFO_EX_SIZE (FIELD_OFFSET(USB_HUB_INFORMATION_EX, u) + sizeof(USB_HUB_DESCRIPTOR))
30#define HUB_IO_CONNECTOR_SIZE (FIELD_OFFSET(USB_PORT_CONNECTOR_PROPERTIES, CompanionHubSymbolicLinkName) + sizeof(WCHAR))
31#define HUB_IO_CONNECTION_V2_SIZE sizeof(USB_NODE_CONNECTION_INFORMATION_EX_V2)
32#define HUB_IO_CYCLE_SIZE sizeof(USB_CYCLE_PORT_PARAMS)
47#define HUB_BUS_POWERED_PORT_POWER 100
50#define HUB_UPC_TYPE_C_USB2 0x08
51#define HUB_UPC_TYPE_C_SWITCH 0x09
52#define HUB_UPC_TYPE_C_NO_SWITCH 0x0A
55#define HUB_LANGID_US_ENGLISH 0x0409
76HubIoCallerIsAdmin(
VOID)
135 _In_ size_t MinInput,
136 _In_ size_t InputLength,
138 _In_ size_t MinOutput,
139 _In_ size_t OutputLength)
145 DPRINT1(
"Hub %p is not configured, user request refused\n",
Hub);
149 if (InputLength < MinInput)
151 DPRINT1(
"Hub %p user request input %lu bytes, needs %lu\n",
Hub, (
ULONG)InputLength, (
ULONG)MinInput);
155 if (OutputLength < MinOutput)
157 DPRINT1(
"Hub %p user request output %lu bytes, needs %lu\n",
Hub, (
ULONG)OutputLength, (
ULONG)MinOutput);
161 if (MinInput >=
sizeof(
ULONG))
181 _In_ size_t MinInput,
182 _In_ size_t InputLength,
183 _In_ size_t MinOutput,
184 _In_ size_t OutputLength,
241 WdfRequestFormatRequestUsingCurrentType(
Request);
307 Attribute = &
Port->m_Info.SublinkSpeedAttr[
Index];
401 _In_ size_t OutputLength,
402 _In_ size_t InputLength)
440 _In_ size_t OutputLength,
441 _In_ size_t InputLength)
451 DPRINT1(
"Hub %p node information has no output buffer 0x%lx\n",
Hub,
Status);
472 _In_ size_t OutputLength,
473 _In_ size_t InputLength)
491 DPRINT1(
"Hub %p driver key name: no device on port %lu\n",
Hub,
Index);
499 Status = WdfDeviceQueryProperty(
Pdo->m_Device,
517 if (OutputLength >=
Name->ActualLength)
545 _In_ size_t OutputLength,
546 _In_ size_t InputLength,
549 PUSB_NODE_CONNECTION_INFORMATION_EX
Info;
591 Speed =
Child->Speed();
612 Info->CurrentConfigurationValue =
Config->Descriptor.bConfigurationValue;
615 Info->NumberOfOpenPipes =
Config->EndpointCount;
628 sizeof(
Pipe->EndpointDescriptor));
629 Pipe->ScheduleOffset = 0;
631 Remaining -=
sizeof(*Pipe);
650 _In_ size_t OutputLength,
651 _In_ size_t InputLength)
694 Status = WdfDeviceRetrieveDeviceInterfaceString(
Pdo->m_Device, &GUID_DEVINTERFACE_USB_HUB,
NULL,
String);
735 _In_ size_t OutputLength,
736 _In_ size_t InputLength)
739 struct _URB_CONTROL_TRANSFER_EX*
Urb;
766 DPRINT1(
"Hub %p descriptor request: no known device on port %lu\n",
Hub,
Descriptor->ConnectionIndex);
805 Index !=
Child->m_DeviceDescriptor.iSerialNumber ||
840 Urb = &HubGetQueueContext(
Queue)->Urb;
843 Urb->Hdr.Length =
sizeof(*Urb);
844 Urb->Hdr.Function = URB_FUNCTION_CONTROL_TRANSFER_EX;
845 Urb->Hdr.UsbdDeviceHandle =
Child->m_UsbDevice;
858 Stack.Parameters.Others.Argument1 =
Urb;
876 _In_ size_t OutputLength,
877 _In_ size_t InputLength,
880 PUSB_HUB_CAP_FLAGS Caps;
916 _In_ size_t OutputLength,
917 _In_ size_t InputLength)
945 _In_ size_t OutputLength,
946 _In_ size_t InputLength)
982 _In_ size_t OutputLength,
983 _In_ size_t InputLength)
1028 if (CompanionIndex > 1)
1055 HubConnectorUnlock();
1066 _In_ size_t OutputLength,
1067 _In_ size_t InputLength)
1080 DPRINT1(
"Hub %p connection information V2 length %lu too small\n",
Hub,
Info->Length);
1098 DPRINT1(
"Hub %p connection information V2 caller does not claim USB 3\n",
Hub);
1113 if (
Port->IsUsb30())
1115 Info->SupportedUsbProtocols.Usb300 = 1;
1119 Info->SupportedUsbProtocols.Usb110 = 1;
1121 Info->SupportedUsbProtocols.Usb200 = 1;
1131 if (
Port->IsUsb30())
1133 Info->Flags.DeviceIsOperatingAtSuperSpeedOrHigher = 1;
1149 _In_ size_t OutputLength,
1150 _In_ size_t InputLength)
1152 PUSB_CYCLE_PORT_PARAMS
Params;
1170 DPRINT1(
"Hub %p cycle: no device on port %lu\n",
Hub,
Params->ConnectionIndex);
1182 Status = HubIoCallerIsAdmin();
1184 DPRINT1(
"Hub %p cycle of port %lu: caller is not an administrator\n",
Hub,
Params->ConnectionIndex);
1191 DPRINT1(
"Hub %p cycle of port %lu: stop idle failed 0x%lx\n",
Hub,
Params->ConnectionIndex, IdleStatus);
1221 Status = HubIoCallerIsAdmin();
1226 DPRINT(
"Hub %p reset request queued\n",
Hub);
1263 case IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX:
1279 case IOCTL_USB_GET_HUB_CAPABILITIES:
1283 case IOCTL_USB_GET_HUB_CAPABILITIES_EX:
1287 case IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES:
1291 case IOCTL_USB_HUB_CYCLE_PORT:
1295 case IOCTL_USB_RESET_HUB:
1350 DPRINT1(
"Hub %p port status for PDO %p without a device\n",
Hub,
Pdo);
VOID FailHubDescriptorRequest()
WDFREQUEST m_PortStatusRequest
VOID Post(_In_ HubEvent Event)
BOOLEAN HasFlag(_In_ HubFlag Flag) const
BOOLEAN RequestHubReset()
static HubFdo * FromDevice(_In_ WDFDEVICE Device)
HubPort * m_PortStatusTarget
HubParentInfo m_ParentInfo
USB_30_HUB_DESCRIPTOR Usb30
UCXHUB_PARENT_INTERFACE m_Parent
BOOLEAN IsRootHub() const
union HubFdo::@1628 m_HubDescriptor
HubPort * FindPort(_In_ ULONG PortNumber)
VOID NTAPI HubCompleteFdoDescriptorRequest(_In_ HubChild *Child, _In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG Size)
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG DataLength
#define NT_SUCCESS(StatCode)
#define _IRQL_requires_(irql)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
HubSaveUxdState(Child->m_Hub, Child, NULL)
BOOLEAN NTAPI HubIdGetSerialNumberText(_In_ HubChild *Child, _Outptr_result_bytebuffer_(*Length) PCWSTR *Text, _Out_ PULONG Length)
static VOID NTAPI HubIoGetConnectionAttributes(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
#define HUB_IO_CONNECTION_SIZE
#define HUB_LANGID_US_ENGLISH
#define HUB_IO_DESCRIPTOR_HEADER
static VOID NTAPI HubIoGetConnectorProperties(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoForward(_In_ HubFdo *Hub, _In_ WDFREQUEST Request)
static VOID NTAPI HubIoGetConnectionName(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
#define HUB_UPC_TYPE_C_USB2
static VOID NTAPI HubIoGetHubInformationEx(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoGetPortStatus(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static HubPdo *NTAPI HubIoLockChild(_In_ HubFdo *Hub, _In_ USHORT PortNumber)
VOID NTAPI HubCompleteFdoDescriptorRequest(_In_ HubChild *Child, _In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG Size)
#define HUB_IO_CONNECTION_V2_SIZE
static PWCHAR NTAPI HubIoStripLinkPrefix(_In_ PCUNICODE_STRING Link, _Out_ PULONG Bytes)
#define HUB_IO_NAME_HEADER
#define HUB_UPC_TYPE_C_SWITCH
static VOID NTAPI HubIoResetHub(_In_ HubFdo *Hub, _In_ WDFREQUEST Request)
static NTSTATUS NTAPI HubIoValidate(_In_ HubFdo *Hub, _In_ size_t MinInput, _In_ size_t InputLength, _In_opt_ PVOID Buffer, _In_ size_t MinOutput, _In_ size_t OutputLength)
#define HUB_BUS_POWERED_PORT_POWER
static BOOLEAN NTAPI HubIoDeviceRunsSsp(_In_ HubChild *Child)
#define HUB_IO_NODE_INFO_SIZE
static VOID NTAPI HubIoCompleteDescriptor(_In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG Size)
static VOID NTAPI HubIoGetConnectionInformation(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength, _In_ BOOLEAN Extended)
static VOID NTAPI HubIoGetNodeInformation(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
#define HUB_UPC_TYPE_C_NO_SWITCH
static const char HubTagUserRequest[]
#define HUB_IO_CYCLE_SIZE
static BOOLEAN NTAPI HubIoDeviceSspCapable(_In_ HubChild *Child)
static VOID NTAPI HubIoGetConnectionInformationV2(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoGetDriverKeyName(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoCyclePort(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoGetHubCapabilities(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength, _In_ BOOLEAN Extended)
NTKERNELAPI BOOLEAN NTAPI SeTokenIsAdmin(_In_ PACCESS_TOKEN Token)
Determines if a token is either an admin token or not. Such condition is checked based upon TOKEN_HAS...
static VOID NTAPI HubIoGetDescriptor(_In_ HubFdo *Hub, _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputLength, _In_ size_t InputLength)
static VOID NTAPI HubIoUnlockChildren(_In_ HubFdo *Hub)
#define HUB_IO_ATTRIBUTES_SIZE
#define HUB_IO_HUB_INFO_EX_SIZE
#define HUB_IO_CONNECTOR_SIZE
static NTSTATUS NTAPI HubIoPrepare(_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ size_t MinInput, _In_ size_t InputLength, _In_ size_t MinOutput, _In_ size_t OutputLength, _Outptr_result_maybenull_ PVOID *Buffer)
static VOID NTAPI HubIoBuild20Descriptor(_In_ HubFdo *Hub, _Out_ PUSB_HUB_DESCRIPTOR Descriptor)
static BOOLEAN NTAPI HubIoPortSpeedIsPlus(_In_ HubPort *Port, _In_ ULONG SpeedId, _In_ ULONG Direction)
#define HUB_SETUP_REQUEST_TIMEOUT_MS
HubPort *NTAPI HubConnectorFindCompanion(_In_ HubPort *Port, _In_ ULONG Index)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
WdfFdoLockStaticChildListForIteration(Hub->m_Device)
WdfFdoUnlockStaticChildListFromIteration(Hub->m_Device)
#define InterlockedCompareExchange
_In_ ULONG _In_ BOOLEAN Cached
#define _Outptr_result_maybenull_
#define UNREFERENCED_PARAMETER(P)
#define RtlFillMemory(Dest, Length, Fill)
#define STATUS_BUFFER_TOO_SMALL
struct _LIST_ENTRY * Flink
PACCESS_TOKEN ClientToken
PACCESS_TOKEN PrimaryToken
USB_DEVICE_SPEED HubSpeed
UCHAR bPowerOnToPowerGood
USHORT wHubCharacteristics
USHORT CompanionPortNumber
WCHAR CompanionHubSymbolicLinkName[1]
USB_PORT_PROPERTIES UsbPortProperties
VOID NTAPI SeLockSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Locks both the referenced primary and client access tokens of a security subject context.
VOID NTAPI SeReleaseSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Releases both the primary and client tokens of a security subject context.
VOID NTAPI SeUnlockSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Unlocks both the referenced primary and client access tokens of a security subject context.
VOID NTAPI SeCaptureSubjectContext(_Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Captures the security subject context of the calling thread and calling process.
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_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 Config
_In_ PGUID _In_ ULONG OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
ULONG PortIsUserConnectable
ULONG PortConnectorIsTypeC
ULONG PortHasMultipleCompanions
#define BMREQUEST_TO_DEVICE
#define USB_REQUEST_GET_DESCRIPTOR
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
#define USB_DEVICE_DESCRIPTOR_TYPE
#define USB_STRING_DESCRIPTOR_TYPE
#define BMREQUEST_STANDARD
#define BMREQUEST_DEVICE_TO_HOST
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
#define USB_20_HUB_DESCRIPTOR_TYPE
#define USB_BOS_DESCRIPTOR_TYPE
#define USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_DIR_RX
#define USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_PROTOCOL_SS
#define USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_DIR_TX
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL HubEvtIoInternalDeviceControl
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL HubEvtIoDeviceControl
#define HUB_PARENT_HIGH_SPEED_CAPABLE
#define USBD_STATUS_DEVICE_GONE
#define USBD_STATUS_SUCCESS
#define USBD_TRANSFER_DIRECTION_IN
#define USBD_SHORT_TRANSFER_OK
#define USBD_DEFAULT_PIPE_TRANSFER
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define IOCTL_USB_GET_PORT_CONNECTOR_PROPERTIES
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2
#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME
struct _USB_NODE_CONNECTION_INFORMATION * PUSB_NODE_CONNECTION_INFORMATION
#define IOCTL_USB_GET_HUB_INFORMATION_EX
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION
#define IOCTL_USB_GET_NODE_INFORMATION
#define IOCTL_USB_GET_NODE_CONNECTION_NAME
#define IOCTL_USB_GET_PORT_STATUS
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, ActualLength)
WdfStringGetUnicodeString(Original, &Name)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
@ WdfRetrievePresentChildren
_In_ WDFCOLLECTION _In_ ULONG Index
#define WdfDeviceStopIdle(Device, WaitForD0)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
#define WdfDeviceResumeIdle(Device)
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION Direction
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WdfObjectReferenceWithTag(Handle, Tag)
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
FORCEINLINE VOID WDF_REQUEST_SEND_OPTIONS_INIT(_Out_ PWDF_REQUEST_SEND_OPTIONS Options, _In_ ULONG Flags)
@ WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
FORCEINLINE VOID WDF_REQUEST_PARAMETERS_INIT(_Out_ PWDF_REQUEST_PARAMETERS Parameters)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
@ DevicePropertyDriverKeyName
#define IRP_MJ_INTERNAL_DEVICE_CONTROL