16#define CLIENT_INTERVAL_CAP 6
19#define BCD_USB_25 0x0250
22#define COMPANION_LENGTH 6
23#define SSP_COMPANION_LENGTH 8
35 WdfRequestGetParameters(
Child->m_ClientRequest, &
Params);
73 UCXENDPOINT** Arrays[] = { &
Child->m_EndpointsToEnable,
74 &
Child->m_EndpointsUnchanged,
75 &
Child->m_EndpointsToDisable };
78 Child->m_EndpointArrayCapacity = 0;
98 UCXENDPOINT* Fresh[3];
101 Child->m_EnableCount = 0;
102 Child->m_DisableCount = 0;
103 Child->m_UnchangedCount = 0;
105 if (Count <= Child->m_EndpointArrayCapacity)
111 Count *
sizeof(UCXENDPOINT),
123 Child->m_EndpointsToEnable = Fresh[0];
124 Child->m_EndpointsUnchanged = Fresh[1];
125 Child->m_EndpointsToDisable = Fresh[2];
147 Child->m_EndpointsToDisable[
Child->m_DisableCount++] =
Pipe->Endpoint;
151 Child->m_EndpointsUnchanged[
Child->m_UnchangedCount++] =
Pipe->Endpoint;
190 DPRINT1(
"Configuration record of %lu bytes not allocated 0x%lx\n",
Size,
Status);
237 Interface->HasAlternateSettings = HasAlternates;
238 Interface->NeedsSetInterface = HasAlternates;
305 if (!
Pipe->ZeroBandwidth)
308 if (!
Companion->bmAttributes.Isochronous.SspCompanion)
320 Pipe->IsochCompanion = SspCompanion;
348 DPRINT1(
"Device %p interface %u has fewer than %lu endpoint descriptors\n",
358 DPRINT1(
"Device %p interface %u descriptor runs past the configuration\n",
Child,
Info->InterfaceNumber);
366 DPRINT1(
"Device %p interface %u has a zero length descriptor\n",
Child,
Info->InterfaceNumber);
373 DPRINT1(
"Device %p interface %u has fewer than %lu endpoint descriptors\n",
381 DPRINT1(
"Device %p interface %u endpoint descriptor runs past the configuration\n",
404 if (
Client->MaximumPacketSize == 0)
466 USHORT Seen[3] = { 0, 0, 0 };
493 if ((Seen[0] | Seen[Map]) & Bit)
517 for (
I = 0;
I <
First->PipeCount;
I++)
519 A =
First->Pipes[
I].Descriptor;
521 for (J = 0; J <
Second->PipeCount; J++)
523 B =
Second->Pipes[J].Descriptor;
525 if (
A->bEndpointAddress ==
B->bEndpointAddress &&
526 A->wMaxPacketSize != 0 &&
527 B->wMaxPacketSize != 0)
529 DPRINT1(
"Endpoint 0x%x shared by interface %u alternate %u and interface %u alternate %u\n",
531 First->Descriptor->bInterfaceNumber,
First->Descriptor->bAlternateSetting,
532 Second->Descriptor->bInterfaceNumber,
Second->Descriptor->bAlternateSetting);
549 if (
Child->m_LastUsbdStatus == 0)
575 Child->m_EnableCount = 0;
578 Child->ClearState(ChildState::ConfigurationValid);
581 Child->ClearState(ChildState::AltSettingFiltered);
599 Info->InterfaceNumber,
600 Info->AlternateSetting,
607 DPRINT1(
"Device %p SELECT_CONFIGURATION names missing interface %u alternate %u\n",
616 DPRINT(
"Device %p interface %u alternate %u is filtered\n",
618 Child->SetState(ChildState::AltSettingFiltered);
650 DPRINT1(
"Device %p configuration has an endpoint zero descriptor\n",
Child);
673 Child->m_UnchangedCount = 0;
674 Child->m_DisableCount = 0;
693 Child->SetState(ChildState::ConfigurationValid);
724 Child->m_EnableCount = 0;
725 Child->ClearState(ChildState::AltSettingFiltered);
729 Child->ClearState(ChildState::ConfigurationValid);
736 Info->InterfaceNumber,
737 Info->AlternateSetting,
746 DPRINT1(
"Device %p SELECT_INTERFACE names missing interface %u alternate %u\n",
755 DPRINT(
"Device %p interface %u alternate %u is filtered\n",
757 Child->SetState(ChildState::AltSettingFiltered);
792 DPRINT1(
"Device %p interface %u has an endpoint zero descriptor\n",
Child,
Info->InterfaceNumber);
805 if (
Other->Descriptor->bInterfaceNumber ==
Info->InterfaceNumber)
825 Child->m_UnchangedCount = 0;
826 Child->m_DisableCount = 0;
834 Child->m_OldInterface = Old;
881 Child->m_EnableCount = 0;
882 Child->m_DisableCount = 0;
883 Child->m_UnchangedCount = 0;
902 if (
Pipe->ZeroBandwidth)
904 Pipe->State = PipeState::Disabled;
905 Child->m_EndpointsUnchanged[
Child->m_UnchangedCount++] =
Pipe->Endpoint;
909 Pipe->State = PipeState::PendingEnable;
910 Child->m_EndpointsToEnable[
Child->m_EnableCount++] =
Pipe->Endpoint;
931 DPRINT1(
"Endpoint 0x%x has no pipe handle\n",
Pipe->Descriptor->bEndpointAddress);
933 Stack->MarkEndpointClientOwned(
Pipe->Endpoint);
934 return Pipe->PipeHandle;
965 Child->m_Hub->m_Stack.EndpointGetMaxTransferSize(
Pipe->Endpoint);
988 if (
Interface->Descriptor->bInterfaceNumber !=
Info->InterfaceNumber)
997 DPRINT1(
"Device %p selected interface %u is not in the configuration\n",
Child,
Info->InterfaceNumber);
USBD_STATUS NTAPI HubNtStatusToUsbd(_In_ NTSTATUS Status)
VOID SetConfigInfoInRequest()
BOOLEAN PrepareConfigLists()
VOID SetInterfaceInfoInRequest()
BOOLEAN PrepareListsForReset()
BOOLEAN PrepareInterfaceLists()
PUSB_INTERFACE_DESCRIPTOR NTAPI HubDescFindInterface(_In_ PUSB_CONFIGURATION_DESCRIPTOR Config, _In_ PVOID Position, _In_ LONG Number, _In_ LONG Alternate, _In_ LONG Class, _In_ LONG SubClass, _In_ LONG Protocol, _Out_opt_ PBOOLEAN HasAlternates)
static NTSTATUS NTAPI HubInterfacesShareEndpoints(_In_ HubInterface *First, _In_ HubInterface *Second)
static NTSTATUS NTAPI HubAllocateInterface(_In_ PUSB_INTERFACE_DESCRIPTOR Descriptor, _In_ BOOLEAN HasAlternates, _Out_ HubInterface **Result)
VOID NTAPI HubChildCollectForDisable(_In_ HubChild *Child, _In_ HubInterface *Interface)
static VOID NTAPI HubChildRecordFailure(_In_ HubChild *Child, _In_ NTSTATUS Status)
static VOID NTAPI HubChildFreeEndpointArrays(_In_ HubChild *Child)
static NTSTATUS NTAPI HubAllocateConfiguration(_In_ PUSB_CONFIGURATION_DESCRIPTOR Source, _Out_ HubConfiguration **Result)
static NTSTATUS NTAPI HubConfigCheckDuplicates(_In_ HubConfiguration *Config)
#define SSP_COMPANION_LENGTH
static NTSTATUS NTAPI HubChildInitPipes(_In_ HubChild *Child, _Inout_ PUSBD_INTERFACE_INFORMATION Info, _Inout_ HubInterface *Interface, _In_ PUCHAR Walk, _In_ PUCHAR End)
static BOOLEAN NTAPI HubConfigHasEndpointZero(_In_ HubConfiguration *Config)
FORCEINLINE BOOLEAN NTAPI HubTypeFits(_In_ PUCHAR Walk, _In_ PUCHAR End)
static VOID NTAPI HubFreeConfiguration(_In_ HubChild *Child, _In_ HubConfiguration *Config)
#define CLIENT_INTERVAL_CAP
static BOOLEAN NTAPI HubInterfaceHasEndpointZero(_In_ HubInterface *Interface)
static USBD_PIPE_HANDLE NTAPI HubChildExposePipe(_In_ HubChild *Child, _Inout_ HubPipe *Pipe)
static PURB NTAPI HubChildClientUrb(_In_ HubChild *Child)
static NTSTATUS NTAPI HubChildSizeEndpointArrays(_In_ HubChild *Child, _In_ ULONG Count)
static VOID NTAPI HubPickCompanions(_In_ HubPipe *Pipe, _Inout_ PUSBD_PIPE_INFORMATION Client, _In_ PUCHAR Walk, _In_ PUCHAR End)
static BOOLEAN NTAPI HubChildSettingFiltered(_In_ HubChild *Child, _In_ UCHAR InterfaceNumber, _In_ UCHAR AlternateSetting)
#define NT_SUCCESS(StatCode)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
HubAltSettingFilter * Filter
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
#define ExFreePoolWithTag(_P, _T)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
PACPI_METHOD_ARGUMENT Next
struct _LIST_ENTRY * Flink
PFN_UCXHUB_ENDPOINT_PIPE_HANDLE EndpointGetPipeHandle
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
USBD_INTERFACE_INFORMATION Interface
USBD_CONFIGURATION_HANDLE ConfigurationHandle
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#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
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
#define USB_ENDPOINT_DESCRIPTOR_TYPE
#define USB_ENDPOINT_TYPE_CONTROL
#define USB_ENDPOINT_TYPE_ISOCHRONOUS
struct _USB_ENDPOINT_DESCRIPTOR * PUSB_ENDPOINT_DESCRIPTOR
#define USB_ENDPOINT_TYPE_MASK
#define USB_ENDPOINT_DIRECTION_IN(x)
#define USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR_TYPE
#define USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_TYPE
struct _USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR * PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
struct _USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR * PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR
#define USB_ENDPOINT_ADDRESS_MASK
struct _USBD_INTERFACE_INFORMATION * PUSBD_INTERFACE_INFORMATION
struct _USBD_PIPE_INFORMATION USBD_PIPE_INFORMATION
enum _USBD_PIPE_TYPE USBD_PIPE_TYPE
PVOID USBD_INTERFACE_HANDLE
#define USBD_PF_CHANGE_MAX_PACKET
#define USBD_STATUS_INTERFACE_NOT_FOUND
#define USBD_STATUS_BAD_ENDPOINT_ADDRESS
#define USBD_STATUS_INVALID_CONFIGURATION_DESCRIPTOR
_In_ PVOID _In_ LONG _In_ LONG AlternateSetting
_In_ PVOID _In_ LONG InterfaceNumber
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
_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
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
#define WDF_NO_OBJECT_ATTRIBUTES
_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