14#define DEVICE_DUPLICATE_RETRY_LIMIT 10
17#define DEVICE_FAST_RESET_WINDOW (1LL * 1000 * 1000 * 10)
20#define HUB_VALIDATION_DUPLICATE_SERIAL 234
23#define DEVICE_ENUM_RETRY_LIMIT 3
26#define PS_LOW_SPEED 0x0200
27#define PS_HIGH_SPEED 0x0400
46 Child->m_MsOs20SetLength = 0;
52 Child->m_ResumeRecoveryTime = 0;
53 Child->m_ResumeSignalingTime = 0;
106 DPRINT1(
"Device %p duplicate is not going away, serial number dropped\n",
m_Device);
137 if (OldSpeed != 0 && OldSpeed != NewSpeed)
139 DPRINT1(
"Device %p changed speed 0x%lx to 0x%lx\n",
m_Device, OldSpeed, NewSpeed);
154 if (BcdUsb == 0x0100)
158 else if (BcdUsb < 0x0200)
164 else if (BcdUsb == 0x0200)
168 else if (BcdUsb < 0x0300)
178 DPRINT1(
"Device %p on a USB 2 port reports bcdUSB 0x%x\n",
m_Device, BcdUsb);
193 if (
Child->m_EnumRetryCount > 0)
203 else if (
Child->HasState(ChildState::WarmResetOnEnumeration))
205 else if (
Child->HasState(ChildState::HotResetOnEnumeration))
212 Child->ClearState(ChildState::HotResetOnEnumeration);
247 DPRINT(
"Device %p descriptor differs from the cached one\n",
m_Device);
430 Serial.LengthInBytes =
Child->m_SerialNumberLength;
435 Child->m_Port->Number(),
437 Child->m_DeviceDescriptor.idVendor,
438 Child->m_DeviceDescriptor.idProduct,
447 DPRINT(
"Device %p waits for a departing duplicate\n",
Child);
451 DPRINT1(
"Device %p serial number already in use\n",
Child);
456 DPRINT1(
"Device %p could not be added to the device list\n",
Child);
460 DPRINT1(
"Device %p unexpected device list answer\n",
Child);
505 return Pdo !=
NULL &&
Pdo->HasFlag(PdoFlag::WakeArmRequested);
513 return Pdo !=
NULL &&
Pdo->HasFlag(PdoFlag::ArmedForWake);
525 return Pdo ==
NULL || !
Pdo->HasFlag(PdoFlag::ClientDoesFunctionSuspend);
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
BOOLEAN ArmForWakeWanted()
BOOLEAN DeviceProgrammingLost()
BOOLEAN DeviceArmedForWake()
BOOLEAN SupportsPdCharging()
BOOLEAN ResetOnResumeFromSx()
BOOLEAN ResetOnResumeFromS0()
BOOLEAN NeedsSecondReset()
DSM_ADD_CHILD AddChildToHub()
VOID ClearReprogramNeeded()
BOOLEAN EnumRetriesUsedUp()
BOOLEAN ProductStringIndexZero()
BOOLEAN DeviceSpeedChanged()
BOOLEAN IsochDelaySkipped()
VOID RecordResetTimeout()
BOOLEAN DualRoleSupported()
BOOLEAN ProductNameWanted()
BOOLEAN DuplicateRetriesUsedUp()
BOOLEAN ConfigReadOnReset()
BOOLEAN WaitNeededAfterAddress()
BOOLEAN DisableWhenUnused()
BOOLEAN SuperSpeedMustBeDisabled()
BOOLEAN SameDeviceConnected()
DSM_RESET_KIND ResetKindNeeded()
VOID RecordDeviceVersion()
VOID BugCheckForBootDevice()
VOID StartDuplicateRetries()
VOID ClearState(_In_ ChildState Flag)
USB_DEVICE_SPEED Speed() const
USB_DEVICE_DESCRIPTOR m_OriginalDeviceDescriptor
ULONG m_DuplicateRetryCount
USB_DEVICE_DESCRIPTOR m_DeviceDescriptor
VOID SetProperty(_In_ ChildProperty Flag)
BOOLEAN HasProperty(_In_ ChildProperty Flag) const
UCHAR m_ScratchBuffer[256]
HubConfiguration * m_CurrentConfig
VOID SetState(_In_ ChildState Flag)
USHORT m_EffectiveExitLatency
BOOLEAN HasHack(_In_ ChildHack Flag) const
BOOLEAN HasState(_In_ ChildState Flag) const
BOOLEAN HasFlag(_In_ HubFlag Flag) const
#define HUB_MSOS20_ALT_ENUM
#define HUB_VALIDATION_DUPLICATE_SERIAL
VOID NTAPI HubLogDeviceValidationError(_In_ HubChild *Child, _In_ ULONG Code)
#define DEVICE_ENUM_RETRY_LIMIT
static VOID NTAPI HubForgetMsOs20(_Inout_ HubChild *Child)
#define DEVICE_DUPLICATE_RETRY_LIMIT
#define DEVICE_FAST_RESET_WINDOW
enum _DSM_RESET_KIND DSM_RESET_KIND
#define DSM_KIND_ANY_SPEED
#define DSM_KIND_SUPER_SPEED
#define DSM_KIND_LOW_SPEED
enum _DSM_ADD_CHILD DSM_ADD_CHILD
#define DSM_KIND_FULL_SPEED
#define DSM_KIND_HIGH_SPEED
#define KeQuerySystemTime(t)
#define HUB_BOOT_DEVICE_IS_STORAGE
#define HUB_USB3_BOOT_DEVICE_FAILED
#define HUB_BUGCHECK_USB3
#define HUB_BOOT_DEVICE_IS_HUB
BOOLEAN NTAPI HubIdLanguageSupported(_In_ HubChild *Child, _In_ USHORT Language)
#define HUB_ENUM_PORT_RESET_FAILED
VOID NTAPI USBD_MarkDeviceAsDisconnected(_In_ PVOID DeviceContext)
ULONG NTAPI USBD_AddDeviceToGlobalList(_In_ PVOID DeviceContext, _In_opt_ PVOID HubContext, _In_ ULONG PortNumber, _In_opt_ PVOID ConnectorNode, _In_ USHORT IdVendor, _In_ USHORT IdProduct, _In_ PUSB_ID_STRING SerialNumber)
VOID NTAPI USBD_RemoveDeviceFromGlobalList(_In_ PVOID DeviceContext)
PVOID NTAPI HubConnectorNodeForPort(_In_ HubPort *Port)
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
#define RtlEqualMemory(dst, src, len)
#define ExFreePoolWithTag(_P, _T)
#define SUBLANG_ENGLISH_US
BOOLEAN HasFlag(_In_ HubGlobal Flag) const
USB_PORT_STATUS_AND_CHANGE StatusChange
struct _LIST_ENTRY * Flink
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_In_ UCXUSBDEVICE _In_ ULONG Interface
USB_PORT_STATUS PortStatus
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
#define USBD_GLOBAL_LIST_DUPLICATE_PENDING
#define USBD_GLOBAL_LIST_ADDED
#define USBD_GLOBAL_LIST_DUPLICATE
#define USBD_GLOBAL_LIST_NO_MEMORY
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO