20#define HUB_PDO_DRIVER_WAIT_TIME 10000
23#define HUB_URB_FUNCTION_LAST 0x003C
24#define HUB_URB_FUNCTION_FAST_PATH_1 0x0039
25#define HUB_URB_FUNCTION_FAST_PATH_2 0x003A
26#define HUB_URB_FUNCTION_SELECT_LIKE 0x003B
29#define HUB_MSOS20_SET_INDEX 7
32#define HUB_USB_BUFFERED_IOCTL(Function) \
33 CTL_CODE(FILE_DEVICE_USB, Function, METHOD_BUFFERED, FILE_ANY_ACCESS)
35#define HUB_IOCTL_GET_TRANSPORT_CHARACTERISTICS HUB_USB_BUFFERED_IOCTL(USB_GET_TRANSPORT_CHARACTERISTICS)
36#define HUB_IOCTL_REGISTER_TRANSPORT_CHANGE HUB_USB_BUFFERED_IOCTL(USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE)
37#define HUB_IOCTL_NOTIFY_TRANSPORT_CHANGE HUB_USB_BUFFERED_IOCTL(USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE)
38#define HUB_IOCTL_UNREGISTER_TRANSPORT_CHANGE HUB_USB_BUFFERED_IOCTL(USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE)
39#define HUB_IOCTL_START_TIME_SYNC HUB_USB_BUFFERED_IOCTL(USB_START_TRACKING_FOR_TIME_SYNC)
40#define HUB_IOCTL_GET_TIME_SYNC HUB_USB_BUFFERED_IOCTL(USB_GET_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC)
41#define HUB_IOCTL_STOP_TIME_SYNC HUB_USB_BUFFERED_IOCTL(USB_STOP_TRACKING_FOR_TIME_SYNC)
42#define HUB_IOCTL_GET_DEVICE_CHARACTERISTICS HUB_USB_BUFFERED_IOCTL(USB_GET_DEVICE_CHARACTERISTICS)
45#define HUB_TRANSPORT_REGISTRATION_SIZE (sizeof(ULONG) + sizeof(PVOID) + 24)
46#define HUB_DEVICE_CHARACTERISTICS_SIZE 0x18
47#define HUB_STAMPED_HANDLE_OFFSET 4
50#define HUB_IOCTL_MEDIA_SERIAL_NUMBER CTL_CODE(FILE_DEVICE_MASS_STORAGE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
53#define HUB_START_FAIL_MAX 4096
95 { 0x4d36e97e, 0xe325, 0x11ce, { 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } };
99 { 0xcde43191, 0x1fad, 0x4120, { 0xa7, 0xab, 0x74, 0x09, 0x56, 0xc6, 0x6f, 0x37 } };
101 { 0xad6f2a13, 0xc4d1, 0x4925, { 0x83, 0xcc, 0x96, 0x85, 0x7a, 0x24, 0x31, 0xd9 } };
105 { { 0xb1049018, 0x6da0, 0x4490, { 0xb0, 0xc9, 0x1e, 0x91, 0xf1, 0xf5, 0x5b, 0xd7 } }, 2 };
107 { { 0x32d615be, 0x32f4, 0x4fdc, { 0xbc, 0x48, 0xfc, 0x54, 0x30, 0x1a, 0xb6, 0xc4 } }, 2 };
109 { { 0xb5a825b8, 0x3907, 0x40b5, { 0xab, 0xca, 0x84, 0x51, 0xe2, 0x45, 0x3d, 0x5f } }, 3 };
114 { 0xfb093825, 0xbf59, 0x4fe6, { 0x8b, 0x6f, 0xaf, 0xd6, 0x71, 0x4c, 0x69, 0xe5 } },
115 { 0x903281ea, 0xc859, 0x47a9, { 0x89, 0x01, 0x7a, 0x11, 0x8c, 0x7b, 0xf5, 0xa7 } },
116 { 0xa7b5d35e, 0xc12c, 0x4f36, { 0xa4, 0x4f, 0x00, 0x62, 0x8f, 0x90, 0x03, 0x88 } },
117 { 0x300c0440, 0xee77, 0x4c1b, { 0xaf, 0x99, 0x3a, 0x33, 0xf8, 0xa9, 0xca, 0x5d } },
118 { 0xd4e98f31, 0x5ffe, 0x4ce1, { 0xbe, 0x31, 0x1b, 0x38, 0xb3, 0x84, 0xc0, 0x09 } }
123 { 0xc5f91e9d, 0x0ced, 0x43f2, { 0x90, 0x5e, 0x8f, 0x9d, 0x38, 0xe9, 0x33, 0x39 } },
124 { 0x34751a37, 0xe607, 0x452a, { 0xb9, 0xf7, 0xd0, 0x20, 0xfc, 0x5c, 0xd0, 0xdc } },
125 { 0x329423dd, 0x222f, 0x4b04, { 0x81, 0x5b, 0x08, 0xc1, 0xa6, 0xd8, 0x9c, 0x8e } },
126 { 0xbbfbadaf, 0x7520, 0x491a, { 0x91, 0x0d, 0x4a, 0x2c, 0xee, 0x72, 0x20, 0x3f } },
127 { 0xd4e98f31, 0x5ffe, 0x4ce1, { 0xbe, 0x31, 0x1b, 0x38, 0xb3, 0x84, 0xc0, 0x09 } }
139#define HUB_LPM_POLICY_LINK_BITS (HUB_LPM_POLICY_U1_ENABLED | HUB_LPM_POLICY_U2_ENABLED | \
140 HUB_LPM_POLICY_U1_ACCEPT | HUB_LPM_POLICY_U2_ACCEPT | \
141 HUB_LPM_POLICY_U1_INITIATE | HUB_LPM_POLICY_U2_INITIATE)
183 return HubGetPdoContext(
Device);
281 HubWaitForPnpEvent(&
Child->m_PreStartEvent,
"PdoPreStart",
Child->m_Object);
328 if (
Pdo->m_ControllerTarget ==
NULL)
330 DPRINT1(
"Port %u has no controller target for IRP %p\n",
Pdo->m_PortNumber,
Irp);
358HubPdoDispatchAndWait(
378HubPdoPublishBillboard(
395 DPRINT1(
"No memory for the billboard property\n");
412 Status = IoSetDevicePropertyData(WdfDeviceWdmGetDeviceObject(
Pdo->m_Device),
429HubPdoReleaseBillboard(
439 IoSetDevicePropertyData(WdfDeviceWdmGetDeviceObject(
Pdo->m_Device),
454HubPdoPublishDualRole(
462 Status = IoSetDevicePropertyData(WdfDeviceWdmGetDeviceObject(
Pdo->m_Device),
478HubPdoPublishTunnelState(
490 DPRINT1(
"Port %u has no valid USB4 tunnel state (%lu)\n",
Pdo->m_PortNumber,
State);
494 Status = IoSetDevicePropertyData(WdfDeviceWdmGetDeviceObject(
Pdo->m_Device),
502 DPRINT1(
"Port %u USB4 tunnel state property failed 0x%lx\n",
Pdo->m_PortNumber,
Status);
515 if (
Pdo->m_AcpiD3Cold.InterfaceReference !=
NULL)
527 if (
Pdo->m_AcpiD3Cold.InterfaceDereference !=
NULL)
541 if (
Pdo->m_AcpiD3Cold.SetD3ColdSupport !=
NULL)
554HubD3ColdGetIdleWakeInfo(
565 if (
Pdo->m_AcpiD3Cold.GetIdleWakeInfo !=
NULL)
567 Status =
Pdo->m_AcpiD3Cold.GetIdleWakeInfo(
Pdo->m_AcpiD3Cold.Context,
591HubD3ColdGetCapability(
600 if (
Pdo->m_AcpiD3Cold.GetD3ColdCapability ==
NULL)
610 DPRINT1(
"Platform claims D3cold for a removable port %u\n",
Pdo->m_PortNumber);
620HubD3ColdGetBusDriverSupport(
637HubD3ColdGetLastTransition(
645 if (
Pdo->m_AcpiD3Cold.GetLastTransitionStatus !=
NULL)
661HubPdoQueryAcpiD3Cold(
675 DPRINT1(
"D3cold query target on port %u not created 0x%lx\n",
Pdo->m_PortNumber,
Status);
683 DPRINT1(
"D3cold query target on port %u not opened 0x%lx\n",
Pdo->m_PortNumber,
Status);
689 &GUID_D3COLD_SUPPORT_INTERFACE,
697 DPRINT(
"No ACPI D3cold interface on port %u, 0x%lx\n",
Pdo->m_PortNumber,
Status);
729 Stack->Parameters.QueryInterface.Version != 1)
731 DPRINT(
"D3cold query on port %u with size %u version %u left alone\n",
732 Pdo->m_PortNumber,
Stack->Parameters.QueryInterface.Size,
Stack->Parameters.QueryInterface.Version);
741 DPRINT1(
"ACPI D3cold interface on port %u has size %u version %u\n",
757 Interface->SetD3ColdSupport = HubD3ColdSetSupport;
758 Interface->GetIdleWakeInfo = HubD3ColdGetIdleWakeInfo;
759 Interface->GetD3ColdCapability = HubD3ColdGetCapability;
760 Interface->GetBusDriverD3ColdSupport = HubD3ColdGetBusDriverSupport;
761 Interface->GetLastTransitionStatus = HubD3ColdGetLastTransition;
780 Stack->Parameters.QueryInterface.InterfaceSpecificData ==
Pdo)
782 DPRINT(
"Interface query on port %u left alone\n",
Pdo->m_PortNumber);
788 Stack->Parameters.QueryInterface.InterfaceSpecificData =
Child->m_UsbDevice;
795 Stack->Parameters.QueryInterface.InterfaceSpecificData =
Child->m_UsbDevice;
798 if (
Stack->Parameters.QueryInterface.Size >=
sizeof(*
Client) ||
801 Pdo->m_ClientContractVersion =
Client->ClientContractVersion;
822HubPdoWasProgrammingLost(
850HubPdoGetSymbolicLink(
894 DPRINT1(
"Parent interface query on port %u, which is not a hub\n",
Pdo->m_PortNumber);
900 Parent->Header.Size =
sizeof(*Parent);
911 Parent->HubTopologyAddress.RootHubPortNumber =
Pdo->m_PortNumber;
913 Parent->HubTopologyAddress.HubPortNumber[
Depth - 2] =
Pdo->m_PortNumber;
922 Parent->ParentLostStateDuringResume = HubPdoWasProgrammingLost;
923 Parent->ParentResetDuringResume = HubPdoWasHubReset;
925 Parent->QueryHubLinkName = HubPdoGetSymbolicLink;
936 Pdo->m_ChildHubFdo =
Parent->ChildHubObject;
937 DPRINT(
"Child hub %p on port %u at depth %u\n",
Pdo->m_ChildHubFdo,
Pdo->m_PortNumber,
Depth);
947HubPdoGetLocationString(
963 DPRINT1(
"No memory for the location string of port %u\n",
Child->m_Port->Number());
969 L"USB(%d)",
Child->m_Port->Number());
984HubPdoPreStartOnQueryId(
1002 DPRINT1(
"Hub did not power up for pre start 0x%lx\n",
Status);
1022 switch (
Stack->MinorFunction)
1028 return HubIdQueryDeviceText(
Child,
Irp);
1031 HubPdoPreStartOnQueryId(
Pdo,
Irp);
1042 HubPdoQueryAcpiD3Cold(
Pdo);
1044 HubPdoPublishBillboard(
Pdo);
1046 HubPdoPublishDualRole(
Pdo);
1047 HubPdoPublishTunnelState(
Pdo);
1065 if (
Irp->IoStatus.Information == 0)
1068 if (
Child->m_EnumMessageId != 0)
1070 DPRINT1(
"Port %u reports enumeration problem %lu\n",
Pdo->m_PortNumber,
Child->m_EnumMessageId);
1071 HubWriteEnumerationFailureCode(
Child);
1072 HubReportPnpProblem(
Device,
Child->m_EnumMessageId);
1114 if (
Irp->PendingReturned)
1125 DPRINT1(
"Port %u power IRP %p completes inline, work item failed 0x%lx\n",
1152 Target =
Stack->Parameters.Power.State.DeviceState;
1153 DPRINT(
"Port %u device power IRP to D%d\n",
Pdo->m_PortNumber, (
int)
Target - 1);
1160 DPRINT1(
"Port %u D2 to D3 wake status not taken 0x%lx\n",
Pdo->m_PortNumber,
Status);
1211 DPRINT(
"Port %u keeps U2 off for its tunneled device\n",
Pdo->m_PortNumber);
1215 HubUsb4AcquireHostPower(
Child->m_Port);
1227 Child->m_Port->m_ConnectionStatus = DeviceHubNestedTooDeeply;
1228 HubWmiNotifyHubNestedTooDeeply(
Hub,
Pdo->m_PortNumber);
1242 DPRINT1(
"Port %u device interface not created 0x%lx\n",
Pdo->m_PortNumber,
Status);
1254 DPRINT1(
"Port %u symbolic link string not created 0x%lx\n",
Pdo->m_PortNumber,
Status);
1262 DPRINT1(
"Port %u symbolic link not retrieved 0x%lx\n",
Pdo->m_PortNumber,
Status);
1269 DPRINT1(
"Port %u symbolic link not written to the registry 0x%lx\n",
Pdo->m_PortNumber,
Status);
1277 HubWmiRegisterDevice(
Device);
1314 HubUsb4ReleaseHostPower(
Child->m_Port);
1353 DPRINT(
"Child PDO %p on port %u surprise removed\n",
Device,
Pdo->m_PortNumber);
1363 HubPdoReleaseBillboard(
Pdo);
1374 DPRINT(
"Child PDO %p on port %u reported missing\n",
Device,
Pdo->m_PortNumber);
1398 DPRINT1(
"Hub did not power up for the resource query 0x%lx\n",
Status);
1429 DPRINT(
"Child PDO %p on port %u cleanup, reported %u\n",
Object,
Pdo->m_PortNumber,
Pdo->m_Reported);
1445 if (
Pdo->m_Reported)
1452 HubPdoReleaseBillboard(
Pdo);
1459 if (
Pdo->m_StartFailData !=
NULL)
1510 DPRINT(
"Port %u USB4 power component activation is not available\n",
Pdo->m_PortNumber);
1540 DPRINT(
"Child PDO %p on port %u D0 exit to %d, action %d\n",
1544 HubRecordSelectiveSuspend(
Child);
1575 HubWaitForPnpEvent(&
Child->m_PnpEvent,
"PdoPowerDown",
Child->m_Object);
1582 DPRINT1(
"Port %u ran out of bandwidth\n",
Pdo->m_PortNumber);
1583 HubWmiNotifyInsufficientBandwidth(
Pdo->m_Hub,
Pdo->m_PortNumber);
1588 DPRINT(
"Port %u USB4 power component idling is not available\n",
Pdo->m_PortNumber);
1628 DPRINT(
"Port %u wake notification done 0x%lx\n",
Pdo->m_PortNumber,
Params->IoStatus.Status);
1650 Pdo->m_WakeBlock.Size =
sizeof(
Pdo->m_WakeBlock);
1655 Stack.Parameters.Others.Argument1 = &
Pdo->m_WakeBlock;
1656 Stack.Parameters.Others.Argument2 =
Pdo->m_Child->m_UsbDevice;
1659 WdfRequestWdmFormatUsingStackLocation(
Request, &
Stack);
1665 DPRINT1(
"Port %u wake notification not sent 0x%lx\n",
Pdo->m_PortNumber,
Status);
1694 DPRINT1(
"Port %u device cannot wake\n",
Pdo->m_PortNumber);
1723 DPRINT(
"Port %u disable wake\n",
Pdo->m_PortNumber);
1733 WdfRequestCancelSentRequest(
Pdo->m_WakeRequest);
1780 DPRINT1(
"LPM policy %lu of %p is out of range\n", Setting,
Child);
1794 else if (Setting == 3)
1802 Policy &= ~HUB_LPM_POLICY_U1_ENABLED;
1809 Policy &= ~HUB_LPM_POLICY_U2_ENABLED;
1817 Policy |= Accept | Initiate;
1818 else if (Setting == 1)
1820 else if (Setting == 2)
1821 Policy &= ~(Accept | Initiate);
1944 Urb->UrbHeader.UsbdDeviceHandle =
Pdo->m_Child->m_UsbDevice;
1957 DPRINT1(
"URB %p header length %u too small\n",
Urb,
Urb->UrbHeader.Length);
1960 Urb->UrbHeader.UsbdFlags = 0;
1970 Function == URB_FUNCTION_SYNC_RESET_PIPE ||
1971 Function == URB_FUNCTION_SYNC_CLEAR_STALL) &&
1974 DPRINT1(
"Pipe URB %p length %u, expected %lu\n",
2012 if (
Child->m_DeviceDescriptor.bcdUSB <= 0x0200)
2025 DPRINT1(
"Port %u descriptor URB %p has no buffer\n",
Pdo->m_PortNumber,
Urb);
2067 struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST*
Request = &
Urb->UrbOSFeatureDescriptorRequest;
2079 DPRINT1(
"Port %u has no MS OS 2.0 descriptor set\n",
Pdo->m_PortNumber);
2086 DPRINT1(
"Port %u MS OS 2.0 URB %p has no buffer\n",
Pdo->m_PortNumber,
Urb);
2100 Urb->UrbControlVendorClassRequest.Request =
Child->m_MsOsVendorCode;
2105 DPRINT1(
"Port %u device does not support MS OS descriptors\n",
Pdo->m_PortNumber);
2119 if (
Irp->PendingReturned)
2137 if (
Pdo->m_ControllerTarget ==
NULL)
2139 DPRINT1(
"Port %u has no controller target for URB %p\n",
Pdo->m_PortNumber,
Urb);
2160 switch (
Urb->UrbHeader.Function)
2175 case URB_FUNCTION_SYNC_RESET_PIPE:
2176 case URB_FUNCTION_SYNC_CLEAR_STALL:
2189 case URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR:
2200 DPRINT1(
"Port %u GET_STATUS failed, the client said it is unsupported\n",
Pdo->m_PortNumber);
2224 ULONG OutputLength =
Stack->Parameters.DeviceIoControl.OutputBufferLength;
2229 ULONG NameBytes = 0;
2233 DPRINT1(
"Port %u hub name request has no buffer\n",
Pdo->m_PortNumber);
2237 if (OutputLength <
sizeof(*
HubName))
2239 DPRINT1(
"Port %u hub name buffer of %lu bytes too small\n",
Pdo->m_PortNumber, OutputLength);
2245 HubName->ActualLength =
sizeof(*HubName);
2247 Irp->IoStatus.Information =
sizeof(*HubName);
2252 HubPdoGetSymbolicLink(
Pdo, &
Link);
2269 if (NameBytes != 0 && OutputLength >= NameBytes +
sizeof(*
HubName))
2272 HubName->ActualLength = NameBytes +
sizeof(*HubName);
2273 Irp->IoStatus.Information =
HubName->ActualLength;
2290 DPRINT1(
"Port %u start failure not recorded, data %p, already %p\n",
2291 Pdo->m_PortNumber,
Data,
Pdo->m_StartFailData);
2296 DPRINT1(
"Port %u start failure data of %lu bytes cut down\n",
Pdo->m_PortNumber,
Data->LengthInBytes);
2301 DPRINT1(
"Port %u start failure data of %lu bytes too small\n",
Pdo->m_PortNumber,
Length);
2308 DPRINT1(
"No memory for %lu bytes of port %u start failure data\n",
Length,
Pdo->m_PortNumber);
2322HubPdoDeviceConfigInfo(
2333 DPRINT1(
"Port %u config info %p has a bad version\n",
Pdo->m_PortNumber,
Info);
2339 DPRINT1(
"Port %u config info length %lu, expected %lu\n",
2351 Info->HubFlags.HubIsHighSpeedCapable = 1;
2356 Info->HubFlags.HubIsMultiTt = 1;
2357 Info->HubFlags.HubIsMultiTtCapable = 1;
2361 Info->HubFlags.HubIsHighSpeed = 1;
2363 Info->HubFlags.HubIsArmedWakeOnConnect = 1;
2365 Info->HubFlags.HubIsRoot = 1;
2367 Info->HubFlags.HubIsBusPowered = 1;
2372 Info->Reserved[18] = 1;
2410 DPRINT1(
"Port %u topology address request has no buffer\n",
Pdo->m_PortNumber);
2417 Address->RootHubPortNumber =
Pdo->m_PortNumber;
2437 Info->DeviceDescriptor =
Child->m_DeviceDescriptor;
2438 Info->U1ExitLatency =
Child->m_U1ExitLatency;
2439 Info->U2ExitLatency =
Child->m_U2ExitLatency;
2440 Info->SublinkSpeedAttr =
Child->m_SublinkSpeedAttr;
2441 Info->SublinkSpeedAttrCount =
Child->m_SublinkSpeedAttrCount;
2442 Info->TotalHubDepth = (
UCHAR)
Child->m_Port->m_Info.TotalHubDepth;
2443 Info->HostInitiatedU1ExitLatency =
Child->m_HostU1ExitLatency;
2444 Info->HostInitiatedU2ExitLatency =
Child->m_HostU2ExitLatency;
2451 Info->SlowestLinkU1ExitLatency =
Child->m_Sel.U1Pel;
2460 if (
Child->m_SlowestLinkU2)
2462 Info->SlowestLinkU2ExitLatency =
Child->m_Sel.U2Pel;
2489 Query->ResultLength = 0;
2491 DPRINT(
"Port %u capability query {%08lx-...}\n",
Pdo->m_PortNumber,
Type->Data1);
2508 if (
IsEqualGUID(*
Type, GUID_USB_CAPABILITY_DEVICE_CONNECTION_SUPER_SPEED_COMPATIBLE))
2510 else if (
IsEqualGUID(*
Type, GUID_USB_CAPABILITY_DEVICE_CONNECTION_HIGH_SPEED_COMPATIBLE))
2532 DPRINT1(
"Port %u cycle request above passive level\n",
Pdo->m_PortNumber);
2538 DPRINT1(
"Client cycles port %u\n",
Pdo->m_PortNumber);
2543 DPRINT1(
"Port %u cycle ignored, one was already requested\n",
Pdo->m_PortNumber);
2571 DPRINT1(
"Port %u reset refused, the device is not in D0\n",
Pdo->m_PortNumber);
2576 DPRINT1(
"Port %u reset requested above passive level\n",
Pdo->m_PortNumber);
2584 DPRINT1(
"Port %u async reset refused, the device is not in D0\n",
Pdo->m_PortNumber);
2589 DPRINT1(
"Port %u async reset requested above dispatch level\n",
Pdo->m_PortNumber);
2604 Stack->Parameters.Others.Argument2 =
Pdo;
2617 case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION:
2618 return HubPdoSubmitIdleRequest(
Pdo,
Irp);
2620 case IOCTL_INTERNAL_USB_RECORD_FAILURE:
2631 case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
2634 DPRINT1(
"Port %u device handle request has no buffer\n",
Pdo->m_PortNumber);
2641 case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX:
2642 case IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE:
2643 case IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY:
2644 DPRINT1(
"Port %u internal IOCTL 0x%lx is not supported\n",
Pdo->m_PortNumber,
Code);
2647 case IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS:
2650 case IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO:
2655 Stack->Parameters.Others.Argument2 =
Child->m_UsbDevice;
2663 Stack->Parameters.Others.Argument2 =
Child->m_UsbDevice;
2688 DPRINT1(
"Port %u unknown internal IOCTL 0x%lx completed 0x%lx\n",
Pdo->m_PortNumber,
Code,
Status);
2725 DPRINT(
"Port %u client says GET_STATUS is unsupported\n",
Pdo->m_PortNumber);
2734 if (
Pdo->m_FailRequests && !Exempt)
2736 DPRINT1(
"Port %u IRP %p IOCTL 0x%lx failed, the device is not present\n",
Pdo->m_PortNumber,
Irp,
Code);
2763 if (
Stack->Parameters.DeviceIoControl.InputBufferLength !=
Size ||
2764 Stack->Parameters.DeviceIoControl.OutputBufferLength !=
Size ||
2767 DPRINT1(
"Port %u IOCTL 0x%lx buffers %lu/%lu, expected %lu\n",
2768 Pdo->m_PortNumber,
Stack->Parameters.DeviceIoControl.IoControlCode,
2769 Stack->Parameters.DeviceIoControl.InputBufferLength,
2770 Stack->Parameters.DeviceIoControl.OutputBufferLength,
Size);
2788 switch (
Stack->Parameters.DeviceIoControl.IoControlCode)
2840 Urb->UrbHeader.UsbdDeviceHandle =
Child->m_UsbDevice;
2841 if (
Urb->UrbSelectConfiguration.ConfigurationDescriptor ==
NULL)
2843 Urb->UrbSelectConfiguration.ConfigurationHandle =
NULL;
2857 DPRINT1(
"Client resets pipe %p on port %u\n",
Urb->UrbPipeRequest.PipeHandle,
Pdo->m_PortNumber);
2861 case URB_FUNCTION_SYNC_RESET_PIPE:
2862 DPRINT1(
"Client sync resets pipe %p on port %u\n",
Urb->UrbPipeRequest.PipeHandle,
Pdo->m_PortNumber);
2866 case URB_FUNCTION_SYNC_CLEAR_STALL:
2867 DPRINT1(
"Client clears stall on pipe %p on port %u\n",
Urb->UrbPipeRequest.PipeHandle,
Pdo->m_PortNumber);
2883 DPRINT1(
"Client reset of port %u starts\n",
Pdo->m_PortNumber);
2884 Child->m_Port->m_ConnectionStatus = DeviceReset;
2924 DPRINT(
"Media serial number request on a USB PDO is not supported\n");
2930 WdfRequestComplete(
Request,
Irp->IoStatus.Status);
2971HubPdoAssignPreprocess(
2974 static UCHAR PnpMinors[] =
2991 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
2999 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
3007 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
3016 return WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
3047 WdfDeviceInitSetPnpPowerEventCallbacks(
Init, &PnpPower);
3054 WdfPdoInitSetEventCallbacks(
Init, &PdoEvents);
3077 Status = WdfDeviceInitAssignSDDLString(*
Init, &Sddl);
3099 DPRINT(
"PDO name %wZ is taken, trying the next\n", &
Name);
3125 Parent.HubDepth =
Pdo->m_Hub->m_Parent.HubDepth + 1;
3132 &GUID_UCXHUB_PARENT_INTERFACE,
3142 Location.
Size =
sizeof(Location);
3150 return WdfDeviceAddQueryInterface(
Pdo->m_Device, &
Config);
3190 WdfDeviceSetPnpCapabilities(
Pdo->m_Device, &Caps);
3198HubPdoSetPowerCapabilities(
3228 WdfDeviceSetPowerCapabilities(
Pdo->m_Device, &Caps);
3236 return WdfRequestCreate(&
Attributes, WdfDeviceGetIoTarget(
Pdo->m_Hub->m_Device), &
Pdo->m_WakeRequest);
3368 Status = HubPdoSetPowerCapabilities(
Pdo);
3389 DPRINT1(
"Child PDO %p for port %u, VID %04x PID %04x\n",
3390 Device,
Pdo->m_PortNumber,
Child->m_DeviceDescriptor.idVendor,
Child->m_DeviceDescriptor.idProduct);
3397 WdfDeviceInitFree(
Init);
3426 return (
PURB)
Stack->Parameters.Others.Argument1;
3444 Urb->UrbSelectConfiguration.ConfigurationHandle =
NULL;
3479 Urb->UrbSelectConfiguration.ConfigurationDescriptor !=
NULL) ||
3482 Child->SetState(ChildState::ConfigurationValid);
3489 PowerLost =
Pdo->TestAndClearFlag(PdoFlag::PowerLostOnReset);
3490 ProgrammingLost =
Pdo->TestAndClearFlag(PdoFlag::ProgrammingLostOnReset);
3496 Flags->HostContextLost = ProgrammingLost;
3538 Urb->UrbHeader.Status =
Child->m_LastUsbdStatus;
3549 DPRINT1(
"Port %u client request %p IOCTL 0x%lx failed 0x%lx, URB status 0x%lx\n",
3550 Child->m_Port->Number(),
3575 volatile UCHAR Touch;
3590 Child->m_DeviceDescriptor.bcdUSB,
3593 Child->m_Port->m_Info.SspIsochBurstCount,
3594 Child->m_ValidationBits);
3635 Pdo->m_ConfigPowerDraw = 0;
3646 DPRINT1(
"Port %u configuration needs %lu mA, the port has %lu mA\n",
3651 HubWmiNotifyInsufficientPower(
Hub,
Pdo->m_PortNumber);
3659 DPRINT1(
"Port %u SuperSpeed configuration asks for more power than the port has\n",
Pdo->m_PortNumber);
3671 DPRINT1(
"Port %u select config interface %lu has bad length %u\n",
3703 ULONG Endpoints = 0;
3707 Config->wTotalLength <
sizeof(*Config))
3736 if (
Interface->bAlternateSetting == Alternate)
3778 if (
Info->Length < Needed)
3810 Pipe->MaximumPacketSize = 0;
3834 DPRINT1(
"Select interface without a configuration handle\n");
3872 DPRINT1(
"Port %u client pipe handle %p not found\n",
Child->m_Port->Number(),
Urb->UrbPipeRequest.PipeHandle);
3899 Child->m_EnumMessageId = 0;
3907 HubChildSetPdo(
Child, WdfDeviceWdmGetDeviceObject(
Child->m_Pdo->m_Device));
3926 DPRINT1(
"Port %u enumeration failed, message %lu\n",
Child->m_Port->Number(),
Child->m_EnumMessageId);
3959 DPRINT(
"Port %u device disconnected\n",
Pdo->m_PortNumber);
3961 Pdo->SetFlag(PdoFlag::DeviceGone);
3964 if (!
Pdo->HasFlag(PdoFlag::InBootPath) &&
Pdo->m_CycleQueued == 0)
3965 HubPurgeUxdState(
Child, HubUxdEvent::Disconnect);
3973 DPRINT(
"Port %u device reconnected\n",
Pdo->m_PortNumber);
3976 Pdo->ClearFlag(PdoFlag::DeviceGone);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
static NTSTATUS NTAPI HubPdoToController(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
static EVT_WDF_DEVICE_D0_EXIT HubPdoEvtD0Exit
static NTSTATUS NTAPI HubPdoSignalCompletion(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
static NTSTATUS NTAPI HubPdoAnswerD3Cold(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
#define HUB_START_FAIL_MAX
static NTSTATUS NTAPI HubPdoCompleteAsIs(_Inout_ PIRP Irp)
VOID NTAPI HubNoPingResponse(_In_ UCXHUB_HUB_CONTEXT HubContext, _In_ UCXHUB_DEVICE_CONTEXT DeviceContext)
static EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL HubPdoEvtIoDeviceControl
#define HUB_MSOS20_SET_INDEX
static const char HubTagPdo[]
static NTSTATUS NTAPI HubPdoQueueAndWait(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _In_ WDFQUEUE Queue)
static VOID NTAPI HubPdoStampUrb(_In_ HubPdo *Pdo, _Inout_ PURB Urb)
static NTSTATUS NTAPI HubPdoPowerIrpComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
static PFN_HUB_SET_SYSTEM_WAKE_DEVICE HubSetSystemWakeDevice
static NTSTATUS NTAPI HubPdoQueueAsync(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
HubWriteEnumerationData(Child)
USB_ID_STRING FriendlyName
static VOID NTAPI HubPdoFillHubInfo(_In_ HubPdo *Pdo, _Inout_ HubParentInfo *Info)
#define HUB_URB_FUNCTION_SELECT_LIKE
static NTSTATUS NTAPI HubPdoRouteUrb(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _Inout_ PURB Urb)
static const GUID HubCapLowSpeedCompatible
static EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL HubPdoEvtIoInternalDeviceControl
#define HUB_PDO_DRIVER_WAIT_TIME
static PUSB_INTERFACE_DESCRIPTOR NTAPI HubFindSelectedInterface(_In_ PUSB_CONFIGURATION_DESCRIPTOR Config, _In_ UCHAR Number, _In_ UCHAR Alternate)
static const DEVPROPKEY HubKeyUsb4TunnelState
static EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS HubPdoEvtEnableWakeAtBus
static const DEVPROPKEY HubKeyBillboardInfo
static PURB NTAPI HubClientUrb(_In_ WDFREQUEST Request, _Out_ PULONG IoControlCode)
#define HUB_IOCTL_START_TIME_SYNC
static const GUID HubLpmDeviceSettings[HUB_PDO_LPM_SETTINGS]
static EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY HubPdoEvtResourceRequirementsQuery
HubCacheMsOs20SetInfo(Child)
VOID(NTAPI * PFN_HUB_SET_SYSTEM_WAKE_DEVICE)(_In_ PDEVICE_OBJECT DeviceObject)
#define HUB_LPM_POLICY_LINK_BITS
_In_ WDF_POWER_DEVICE_STATE TargetState
#define HUB_IOCTL_GET_TRANSPORT_CHARACTERISTICS
_In_ DsmEvent _In_ PCSTR What
static NTSTATUS NTAPI HubPdoSelectLikeComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
WDF_OBJECT_ATTRIBUTES Attributes
#define HUB_IOCTL_GET_TIME_SYNC
static PVOID NTAPI HubPdoUrbBuffer(_In_ PVOID Pointer, _In_opt_ PMDL Mdl)
static BOOLEAN HubSetSystemWakeDeviceResolved
RtlInitEmptyUnicodeString(SymbolicLinkName, NULL, 0)
static EVT_WDF_DEVICE_D0_ENTRY HubPdoEvtD0Entry
static VOID NTAPI HubD3ColdReference(_In_ PVOID Context)
static const GUID HubCapFullSpeedCompatible
static VOID NTAPI HubPdoIndicateWake(_In_ HubPdo *Pdo)
WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp)
WdfPdoInitAllowForwardingRequestToParent(Init)
static BOOLEAN NTAPI HubFailClientCheck(_In_ HubChild *Child, _In_ USBD_STATUS UsbdStatus)
static NTSTATUS NTAPI HubPdoForwardSelectLike(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _Inout_ PURB Urb)
HubPdoPreStart(Pdo->m_Child)
WdfDeviceInitSetDeviceType(Init, FILE_DEVICE_UNKNOWN)
static EVT_WDF_DEVICE_QUERY_REMOVE HubPdoEvtQueryRemove
static const GUID HubClassUnknown
static BOOLEAN NTAPI HubPdoIsEnhancedSuperSpeed(_In_ HubChild *Child)
#define HUB_DEVICE_CHARACTERISTICS_SIZE
static NTSTATUS NTAPI HubPdoQueryCapability(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _Inout_ PUCXHUB_QUERY_CAPABILITY Query)
#define HUB_STAMPED_HANDLE_OFFSET
HubPdoPostAndWait(Pdo->m_Child, DsmEvent::PdoInstallMsOsExt, "PdoInstallMsOsExt")
static VOID NTAPI HubPatchFailedSelect(_In_ HubChild *Child, _Inout_ PURB Urb)
static NTSTATUS NTAPI HubPdoCachedDescriptor(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _Inout_ PURB Urb)
static VOID NTAPI HubD3ColdDereference(_In_ PVOID Context)
static EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS HubPdoEvtDisableWakeAtBus
HubPdoResolveSystemWake()
static EVT_WDF_DEVICE_RELEASE_HARDWARE HubPdoEvtReleaseHardware
#define HUB_IOCTL_REGISTER_TRANSPORT_CHANGE
_Outptr_ PZZWSTR * LocationStrings
#define HUB_TRANSPORT_REGISTRATION_SIZE
#define HUB_IOCTL_GET_DEVICE_CHARACTERISTICS
static NTSTATUS NTAPI HubPdoRecordFailure(_In_ HubPdo *Pdo, _In_opt_ HubStartFailHeader *Data)
HubReadDeviceHardwareValues(Child)
HubPdoRegisterLpmSettings(Pdo)
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS HubPdoPreprocessInternalIoctl
static NTSTATUS NTAPI HubPdoStampAndForward(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _In_ ULONG Size)
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubPdoWakeNotificationComplete
static NTSTATUS NTAPI HubPdoCompleteIrp(_Inout_ PIRP Irp, _In_ NTSTATUS Status)
WdfDeviceInitSetExclusive(Init, FALSE)
static NTSTATUS NTAPI HubPdoSendWakeNotification(_In_ HubPdo *Pdo)
static NTSTATUS NTAPI HubPdoQueryInterface(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
#define HUB_IOCTL_UNREGISTER_TRANSPORT_CHANGE
#define HUB_IOCTL_STOP_TIME_SYNC
static NTSTATUS NTAPI HubPdoGetHubName(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
static EVT_WDF_OBJECT_CONTEXT_CLEANUP HubPdoEvtCleanup
#define HUB_IOCTL_NOTIFY_TRANSPORT_CHANGE
#define HUB_URB_FUNCTION_FAST_PATH_2
static USBD_STATUS NTAPI HubInitInterfaceInformation(_In_ PUSB_CONFIGURATION_DESCRIPTOR Config, _Inout_ PUSBD_INTERFACE_INFORMATION Info)
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS HubPdoPreprocessPnp
static EVT_WDF_WORKITEM HubPdoEvtCompletePowerIrp
HubPdoSetPnpCapabilities(Pdo)
static EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND HubPdoEvtSelfManagedIoSuspend
WdfDeviceSetSpecialFileSupport(Device, WdfSpecialFilePaging, TRUE)
static NTSTATUS NTAPI HubPdoDispatchIoctl(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
static EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST HubPdoEvtParentInterfaceQuery
static NTSTATUS NTAPI HubPdoValidateUrb(_Inout_ PURB Urb)
static NTSTATUS NTAPI HubPdoSyncComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
USBD_STATUS NTAPI HubNtStatusToUsbd(_In_ NTSTATUS Status)
static EVT_WDF_DEVICE_REPORTED_MISSING HubPdoEvtReportedMissing
#define HUB_IOCTL_MEDIA_SERIAL_NUMBER
static EVT_WDF_DEVICE_SURPRISE_REMOVAL HubPdoEvtSurpriseRemoval
static EVT_WDF_DEVICE_PREPARE_HARDWARE HubPdoEvtPrepareHardware
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS HubPdoPreprocessIoctl
#define HUB_URB_FUNCTION_FAST_PATH_1
static NTSTATUS NTAPI HubPdoCyclePort(_In_ HubPdo *Pdo, _Inout_ PIRP Irp)
static const GUID HubLpmHubSettings[HUB_PDO_LPM_SETTINGS]
static EVT_WDF_DEVICE_QUERY_STOP HubPdoEvtQueryStop
static POWER_SETTING_CALLBACK HubPdoLpmSettingChanged
_In_ BOOLEAN D3ColdSupport
static EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT HubPdoEvtSelfManagedIoStart
WdfDeviceInitSetRemoveLockOptions(Init, &RemoveLock)
static NTSTATUS NTAPI HubPdoMsFeatureDescriptor(_In_ HubPdo *Pdo, _Inout_ PIRP Irp, _Inout_ PURB Urb)
WDF_REMOVE_LOCK_OPTIONS RemoveLock
static NTSTATUS NTAPI HubPdoTopologyAddress(_In_ HubPdo *Pdo, _Out_opt_ PUSB_TOPOLOGY_ADDRESS Address)
static WDFREQUEST NTAPI HubTakeClientRequest(_In_ HubChild *Child)
static USBD_STATUS NTAPI HubCheckConfigDescriptor(_In_ HubChild *Child, _In_ PUSB_CONFIGURATION_DESCRIPTOR Descriptor)
static const DEVPROPKEY HubKeyDualRoleFeatures
#define HUB_URB_FUNCTION_LAST
const GUID * InterfaceGuid
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS HubPdoPreprocessSetPower
static NTSTATUS NTAPI HubPdoPassDown(_In_ WDFDEVICE Device, _Inout_ PIRP Irp)
static NTSTATUS NTAPI HubUsbdStatusToNt(_In_ USBD_STATUS Status)
EVT_WDF_DEVICE_USAGE_NOTIFICATION_EX HubPdoEvtUsageNotificationEx
#define HUB_PDO_LPM_SETTINGS
#define HUB_PDO_CONTRACT_UNKNOWN
@ ClientDoesFunctionSuspend
BOOLEAN CreatePlaceholderPdo()
VOID MarkSystemWakeSource()
VOID CyclePortForClient()
VOID ClearResetAtResume()
BOOLEAN SelectInterfaceValid()
VOID StartDriverWaitTimer()
BOOLEAN PipeIsIsochronous()
VOID ReportDeviceMissing()
VOID NotifyDisconnected()
BOOLEAN ReferenceHubPower()
BOOLEAN PipeIsZeroBandwidth()
VOID CompleteClientRequestFailed()
VOID CompleteClientRequest()
VOID DereferenceHubPower()
BOOLEAN ResetAtResumeMarked()
VOID ForceResetOnNextStart()
VOID SignalPnpPowerFailure()
BOOLEAN SelectConfigValid()
VOID CompleteClientRequestLastStatus()
VOID ClearState(_In_ ChildState Flag)
USB_DEVICE_DESCRIPTOR m_DeviceDescriptor
WDFREQUEST m_ClientRequest
BOOLEAN m_HubPowerReferenceHeld
VOID SetState(_In_ ChildState Flag)
BOOLEAN m_TunneledDevicesSkipU2
UCXHUB_STACK_INTERFACE m_Stack
BOOLEAN HasFlag(_In_ HubFlag Flag) const
DEVICE_CAPABILITIES m_Capabilities
UCXUSBDEVICE UsbDevice() const
HubParentInfo m_ParentInfo
USB_30_HUB_DESCRIPTOR Usb30
UCXHUB_PARENT_INTERFACE m_Parent
BOOLEAN IsRootHub() const
union HubFdo::@1628 m_HubDescriptor
VOID SetFlag(_In_ PdoFlag Flag)
D3COLD_SUPPORT_INTERFACE m_AcpiD3Cold
BOOLEAN HasFlag(_In_ PdoFlag Flag) const
static HubPdo * FromDevice(_In_ WDFDEVICE Device)
VOID ClearFlag(_In_ PdoFlag Flag)
BOOLEAN HasProperty(_In_ PortProperty Property) const
static HubPort * FromObject(_In_ WDFOBJECT Object)
USHORT m_LastCompanionPort
HubConnectorId m_ConnectorId
VOID Post(_In_ PortEvent Event)
USB_CONNECTION_STATUS m_ConnectionStatus
USHORT m_FirstCompanionPort
VOID Start(_In_ ULONG Milliseconds)
#define STATUS_NOT_SUPPORTED
BOOLEAN NTAPI HubDescCheckConfiguration(_In_ const HubDescContext *Context, _In_reads_bytes_opt_(Length) PUSB_CONFIGURATION_DESCRIPTOR Descriptor, _In_ ULONG Length, _Out_opt_ PBOOLEAN SupportsStreams)
VOID NTAPI HubDescInitDeviceContext(_Out_ HubDescContext *Context, _In_ USHORT BcdUsb, _In_ USB_DEVICE_SPEED Speed, _In_ BOOLEAN Win8Behavior, _In_ ULONG SspIsochBurstCount, _In_opt_ PULONG Bitmap)
VOID NTAPI HubFreeBillboardInfo(_In_ HubChild *Child)
_In_ BOOLEAN _In_ ULONG Features
_Inout_ HubConfiguration ** Slot
#define HUB_LPM_POLICY_U1_INITIATE
#define HUB_LPM_POLICY_U1_ACCEPT
#define HUB_LPM_POLICY_U2_ENABLED
#define HUB_LPM_POLICY_U1_ENABLED
#define HUB_LPM_POLICY_U2_ACCEPT
#define HUB_LPM_POLICY_U2_INITIATE
#define HUB_LPM_POLICY_CONSERVATIVE
#define HUB_LPM_POLICY_AGGRESSIVE
#define DEVPROP_TYPE_EMPTY
#define DEVPROP_TYPE_UINT32
#define DEVPROP_TYPE_BINARY
HubPipe *NTAPI HubFindPipeByHandle(_In_opt_ HubConfiguration *Config, _In_ USBD_PIPE_HANDLE Handle)
#define DSM_KIND_SUPER_SPEED
#define DSM_KIND_FULL_SPEED
#define DSM_KIND_HIGH_SPEED
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
_Check_return_ _In_ ULONG _In_ DEVICE_POWER_STATE DevicePowerState
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
static VOID Wake(_In_ UCHAR Csn)
#define _IRQL_requires_max_(irql)
#define _IRQL_requires_(irql)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeRaiseIrql(irql, oldIrql)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeLowerIrql(oldIrql)
#define KeSetEvent(pEvt, foo, foo2)
#define KeGetCurrentIrql()
NTSTATUS NTAPI HubCreateReport(_In_ WDFDEVICE HubFdo, _In_ HubReport Type, _In_ ULONG SubReason)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
return pRequest Reuse(ReuseParams)
_In_ UCXUSBDEVICE UsbDevice
#define HUB_TUNNEL_STATE_UNKNOWN
@ UseWin8DescriptorValidation
NTSTATUS NTAPI HubIdBuildCompatibleIds(_In_ HubChild *Child, _In_opt_ PWDFDEVICE_INIT DeviceInit, _Out_opt_ PUSB_ID_STRING Ids)
NTSTATUS NTAPI HubIdBuildHardwareIds(_In_ HubChild *Child, _In_opt_ PWDFDEVICE_INIT DeviceInit, _Out_opt_ PUSB_ID_STRING Ids)
VOID NTAPI HubIdListFree(_Inout_ PUSB_ID_STRING Ids)
NTSTATUS NTAPI HubIdListCopy(_Out_ PUSB_ID_STRING Destination, _In_ const USB_ID_STRING *Source)
VOID NTAPI USBD_RemoveDeviceFromGlobalList(_In_ PVOID DeviceContext)
BOOLEAN NTAPI HubUsb4NeedsHostPower(_In_ HubChild *Child)
EVT_WDF_TIMER HubEvtBandwidthRetryTimer
WdfWorkItemEnqueue(WorkItem)
#define IOCTL_UCXHUB_RESET_PORT_ASYNC
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define UCXHUB_PARENT_INTERFACE_VERSION
#define IOCTL_UCXHUB_FREE_DUMP_DATA
_In_ UCXHUB_DEVICE_CONTEXT DeviceContext
struct _UCXHUB_DUMP_DEVICE_INFO * PUCXHUB_DUMP_DEVICE_INFO
union _UCXHUB_RESET_FLAGS * PUCXHUB_RESET_FLAGS
_In_ PUNICODE_STRING SymbolicLinkName
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
#define IOCTL_UCXHUB_QUERY_USB_CAPABILITY
#define IOCTL_UCXHUB_SET_FUNCTION_HANDLE_DATA
#define IOCTL_UCXHUB_GET_DUMP_DATA
struct _UCXHUB_PARENT_INTERFACE * PUCXHUB_PARENT_INTERFACE
#define IOCTL_UCXHUB_NOTIFY_FORWARD_PROGRESS
#define IOCTL_UCXHUB_GET_HUB_INFO
struct _UCXHUB_FORWARD_PROGRESS_INFO * PUCXHUB_FORWARD_PROGRESS_INFO
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE Query
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define InterlockedCompareExchange
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
_In_ PNDIS_STRING _In_ PNDIS_STRING SymbolicName
#define _In_reads_bytes_(s)
#define _In_reads_opt_(s)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
_NullNull_terminated_ WCHAR * PZZWSTR
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IRP_MN_SURPRISE_REMOVAL
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCopyCurrentIrpStackLocationToNext(Irp)
#define IoCompleteRequest
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
#define STATUS_POWER_STATE_INVALID
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
#define STRSAFE_FILL_BEHIND_NULL
NTSTRSAFEVAPI RtlStringCchPrintfExW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcchRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
#define IsEqualGUID(rguid1, rguid2)
#define FILE_DEVICE_UNKNOWN
#define IRP_MJ_DEVICE_CONTROL
#define STATUS_MORE_PROCESSING_REQUIRED
#define STATUS_BUFFER_TOO_SMALL
PFN_HUB_UNREGISTER_POWER_SETTING UnregisterPowerSetting
PFN_HUB_REGISTER_POWER_SETTING RegisterPowerSetting
PDEVICE_OBJECT RootHubPdo
USB_DEVICE_DESCRIPTOR DeviceDescriptor
USHORT TotalTpPropagationDelay
USHORT SlowestLinkU2ExitLatency
USHORT SlowestLinkU1ExitLatency
PUSB_ENDPOINT_DESCRIPTOR Descriptor
ULONG CapabilityFunctionSuspend
PSET_D3COLD_SUPPORT SetD3ColdSupport
PINTERFACE_DEREFERENCE InterfaceDereference
PINTERFACE_REFERENCE InterfaceReference
PGET_LOCATION_STRING GetLocationString
PINTERFACE_REFERENCE InterfaceReference
PINTERFACE_DEREFERENCE InterfaceDereference
COMPOSITE_DEVICE_CAPABILITIES CapabilityFlags
USB_DEVICE_SPEED HubSpeed
USB_TOPOLOGY_ADDRESS HubTopologyAddress
PFN_UCXHUB_IS_DEVICE_DISCONNECTED IsDeviceDisconnected
PFN_UCXHUB_CONTROLLER_STOP_IDLE BlockControllerIdle
PFN_UCXHUB_CONTROLLER_RESUME_IDLE AllowControllerIdle
USBD_INTERFACE_INFORMATION Interface
USBD_CONFIGURATION_HANDLE ConfigurationHandle
WDF_TRI_STATE SurpriseRemovalOK
DEVICE_POWER_STATE DeviceWake
SYSTEM_POWER_STATE SystemWake
DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]
PFN_WDF_DEVICE_REPORTED_MISSING EvtDeviceReportedMissing
PFN_WDF_DEVICE_ENABLE_WAKE_AT_BUS EvtDeviceEnableWakeAtBus
PFN_WDF_DEVICE_DISABLE_WAKE_AT_BUS EvtDeviceDisableWakeAtBus
PFN_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY EvtDeviceResourceRequirementsQuery
PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry
PFN_WDF_DEVICE_SELF_MANAGED_IO_RESTART EvtDeviceSelfManagedIoRestart
PFN_WDF_DEVICE_SELF_MANAGED_IO_INIT EvtDeviceSelfManagedIoInit
PFN_WDF_DEVICE_QUERY_STOP EvtDeviceQueryStop
PFN_WDF_DEVICE_QUERY_REMOVE EvtDeviceQueryRemove
PFN_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND EvtDeviceSelfManagedIoSuspend
PFN_WDF_DEVICE_D0_EXIT EvtDeviceD0Exit
PFN_WDF_DEVICE_SURPRISE_REMOVAL EvtDeviceSurpriseRemoval
PFN_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware
PFN_WDF_DEVICE_USAGE_NOTIFICATION_EX EvtDeviceUsageNotificationEx
PFN_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware
static const VBE_MODE Modes[VBE_MODE_COUNT]
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
#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 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_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INSUFFICIENT_RESOURCES
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
#define USB_ENDPOINT_DESCRIPTOR_TYPE
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
#define USB_DEVICE_DESCRIPTOR_TYPE
#define USB_ENDPOINT_TYPE_ISOCHRONOUS
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
struct _USB_ENDPOINT_DESCRIPTOR * PUSB_ENDPOINT_DESCRIPTOR
#define USB_ENDPOINT_TYPE_MASK
#define USB_INTERFACE_DESCRIPTOR_TYPE
#define HUB_PARENT_DISABLE_LPM
@ NoSelectiveSuspendIntegrated
#define HUB_PARENT_HIGH_SPEED_CAPABLE
struct _USBD_INTERFACE_INFORMATION * PUSBD_INTERFACE_INFORMATION
#define USBD_STATUS_DEVICE_GONE
struct _USBD_PIPE_INFORMATION USBD_PIPE_INFORMATION
#define URB_FUNCTION_SELECT_INTERFACE
#define USBD_STATUS_INVALID_PIPE_HANDLE
#define USBD_STATUS_CANCELED
#define USBD_STATUS_INVALID_PIPE_FLAGS
#define USBD_STATUS_SUCCESS
PVOID USBD_INTERFACE_HANDLE
#define USBD_PF_CHANGE_MAX_PACKET
#define USBD_TRANSFER_DIRECTION_IN
#define URB_FUNCTION_CONTROL_TRANSFER
#define USBD_STATUS_NOT_SUPPORTED
#define USBD_STATUS_INSUFFICIENT_RESOURCES
#define URB_FUNCTION_SELECT_CONFIGURATION
#define USBD_STATUS_INVALID_PARAMETER
#define USBD_STATUS_INTERFACE_NOT_FOUND
#define USBD_STATUS_PORT_OPERATION_PENDING
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
#define URB_FUNCTION_OPEN_STATIC_STREAMS
#define USBD_DEFAULT_PIPE_TRANSFER
#define USBD_STATUS_INVALID_URB_FUNCTION
#define USBD_STATUS_INVALID_CONFIGURATION_DESCRIPTOR
#define URB_FUNCTION_GET_STATUS_FROM_DEVICE
#define USBD_PF_VALID_MASK
PVOID USBD_CONFIGURATION_HANDLE
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
#define URB_FUNCTION_CLOSE_STATIC_STREAMS
#define USBD_STATUS_BAD_START_FRAME
#define USBD_STATUS_BUFFER_TOO_SMALL
#define URB_FUNCTION_ISOCH_TRANSFER
#define USBD_CLIENT_INTERFACE_VERSION
struct _USBD_CLIENT_INTERFACE * PUSBD_CLIENT_INTERFACE
_In_opt_ PVOID HubContext
struct _REGISTER_COMPOSITE_DEVICE * PREGISTER_COMPOSITE_DEVICE
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO
#define IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DEVICE
#define IOCTL_INTERNAL_USB_RESET_PORT
#define IOCTL_INTERNAL_USB_REQUEST_REMOTE_WAKE_NOTIFICATION
#define IOCTL_INTERNAL_USB_CYCLE_PORT
#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME
#define IOCTL_INTERNAL_USB_FAIL_GET_STATUS_FROM_DEVICE
enum _USB_CONNECTION_STATUS USB_CONNECTION_STATUS
struct _USB_HUB_NAME * PUSB_HUB_NAME
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT
#define IOCTL_INTERNAL_USB_ENABLE_PORT
#define IOCTL_INTERNAL_USB_GET_BUS_INFO
@ DeviceFailedEnumeration
#define IOCTL_INTERNAL_USB_UNREGISTER_COMPOSITE_DEVICE
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
#define IOCTL_INTERNAL_USB_GET_HUB_NAME
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
WdfStringGetUnicodeString(Original, &Name)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFCOLLECTION _In_ ULONG Index
#define DECLARE_CONST_UNICODE_STRING(_variablename, _string)
_In_ PDEVICE_OBJECT DeviceObject
FORCEINLINE VOID WDF_DEVICE_PNP_CAPABILITIES_INIT(_Out_ PWDF_DEVICE_PNP_CAPABILITIES Caps)
_In_ WDF_POWER_DEVICE_STATE PreviousState
@ WdfPowerDevicePrepareForHibernation
@ WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
@ WdfDeviceFailedAttemptRestart
@ WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
@ WdfSpecialFileHibernation
#define WdfDeviceStopIdle(Device, WaitForD0)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ WDF_POWER_DEVICE_STATE TargetState
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
FORCEINLINE VOID WDF_DEVICE_POWER_CAPABILITIES_INIT(_Out_ PWDF_DEVICE_POWER_CAPABILITIES Caps)
_In_ WDFCMRESLIST ResourcesRaw
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
#define WdfDeviceResumeIdle(Device)
FORCEINLINE VOID WDF_REMOVE_LOCK_OPTIONS_INIT(_Out_ PWDF_REMOVE_LOCK_OPTIONS RemoveLockOptions, _In_ ULONG Flags)
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
@ WdfIoQueueDispatchSequential
FORCEINLINE VOID WDF_IO_TARGET_OPEN_PARAMS_INIT_EXISTING_DEVICE(_Out_ PWDF_IO_TARGET_OPEN_PARAMS Params, _In_ PDEVICE_OBJECT DeviceObject)
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
#define WdfObjectReferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_PDO_EVENT_CALLBACKS_INIT(_Out_ PWDF_PDO_EVENT_CALLBACKS Callbacks)
_In_ WDFIORESREQLIST IoResourceRequirementsList
WDF_EXTERN_C_START typedef _In_ LPGUID _Inout_ PINTERFACE ExposedInterface
WDF_EXTERN_C_START typedef _In_ LPGUID _Inout_ PINTERFACE _Inout_opt_ PVOID ExposedInterfaceSpecificData
FORCEINLINE VOID NTAPI WdfDeviceInterfaceReferenceNoOp(_In_ PVOID Context)
FORCEINLINE VOID NTAPI WdfDeviceInterfaceDereferenceNoOp(_In_ PVOID Context)
FORCEINLINE VOID WDF_QUERY_INTERFACE_CONFIG_INIT(_Out_ PWDF_QUERY_INTERFACE_CONFIG InterfaceConfig, _In_opt_ PINTERFACE Interface, _In_ CONST GUID *InterfaceType, _In_opt_ PFN_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST EvtDeviceProcessQueryInterfaceRequest)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
@ WDF_REQUEST_REUSE_NO_FLAGS
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
#define WDF_NO_SEND_OPTIONS
#define WDF_NO_OBJECT_ATTRIBUTES
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
FORCEINLINE VOID WDF_WORKITEM_CONFIG_INIT(_Out_ PWDF_WORKITEM_CONFIG Config, _In_ PFN_WDF_WORKITEM EvtWorkItemFunc)
_IRQL_requires_same_ _In_opt_ PVOID Argument1
enum _D3COLD_LAST_TRANSITION_STATUS * PD3COLD_LAST_TRANSITION_STATUS
#define STATUS_CONTINUE_COMPLETION
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IRP_MN_QUERY_INTERFACE
#define IRP_MN_START_DEVICE
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
_Out_ PBOOLEAN D3ColdSupported
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
_In_ SYSTEM_POWER_STATE _Out_ PDEVICE_WAKE_DEPTH DeepestWakeableDstate
#define PNP_LOCATION_INTERFACE_VERSION
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
@ LastDStateTransitionD3hot
@ LastDStateTransitionD3cold
@ DeviceWakeDepthNotWakeable
#define IRP_MN_DEVICE_ENUMERATED
_In_ SYSTEM_POWER_STATE SystemPowerState
_Out_ PD3COLD_LAST_TRANSITION_STATUS LastTransitionStatus
enum _DEVICE_WAKE_DEPTH * PDEVICE_WAKE_DEPTH
struct _D3COLD_SUPPORT_INTERFACE * PD3COLD_SUPPORT_INTERFACE
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)