14#ifndef USB3_URB_RESERVED_RESOURCES
15#define USB3_URB_RESERVED_RESOURCES 0x00000010
24 _In_ WDFIOTARGET SizingTarget)
75 Urb.Hdr.Length =
sizeof(
Urb);
76 Urb.Hdr.Function = URB_FUNCTION_CONTROL_TRANSFER_EX;
83 if (
Urb.SetupPacket[0] & 0x80)
96 Stack.Parameters.Others.Argument1 = &
Urb;
150 *
Value = (
USHORT)((EndpointAddress & 0x0F) | ((
Child->m_Address & 0x7F) << 4));
207 DPRINT1(
"Hub %p TT clear for endpoint %p failed 0x%lx, URB status 0x%lx\n",
248 DPRINT1(
"Hub %p no memory for a TT clear\n",
Hub);
259 Clear->Control.SetSetup(0x23,
286#define HUB_USER_PORT_STATUS_OFFSET 4
287#define HUB_USER_PORT_STATUS_SIZE 8
313 DPRINT1(
"Hub %p control request 0x%x failed 0x%lx, URB status 0x%lx\n",
498 DPRINT1(
"Hub %p configuration descriptor too short, %lu bytes, wTotalLength %u\n",
515 DPRINT1(
"Hub %p no memory to cache the configuration descriptor\n",
m_Hub);
555 ULONG OverCurrentMode;
567 if (Characteristics & 0x0001)
569 if (Characteristics & 0x0008)
579 OverCurrentMode = (Characteristics >> 3) & 0x3;
581 if (Characteristics & 0x0001)
583 if (OverCurrentMode == 1)
585 else if (OverCurrentMode >= 2)
611 HubNoteHubOverCurrent(
m_Hub);
614 return HubCheck::Yes;
622 return HubCheck::Yes;
628 return (
Change != 0) ? HubCheck::Error : HubCheck::No;
641 return HubChange::None;
684 DPRINT(
"Hub %p status change read canceled\n",
Hub);
688 DPRINT1(
"Hub %p status change read failed 0x%lx, URB status 0x%lx\n",
737 WdfRequestWdmFormatUsingStackLocation(
Interrupt->Request, &
Stack);
760 DPRINT1(
"Hub %p status change read not canceled\n",
m_Hub);
773 if (!(
Interrupt->BitmapBuffer[Bit / 8] & (1 << (Bit % 8))))
778 DPRINT1(
"Hub %p reports a change on missing port %lu\n",
m_Hub, Bit);
779 return HubCheck::Error;
793 BOOLEAN Extended =
Port->HasProperty(PortProperty::EnhancedSuperSpeed);
830 switch (
Params.Parameters.DeviceIoControl.IoControlCode)
857 if (
Pdo->m_Flags & (
LONG)PdoFlag::ReportPortDisabled)
868 DPRINT1(
"Hub %p port %u status 0x%x change 0x%x reported as no device\n",
876 DPRINT1(
"Hub %p port status request with IOCTL 0x%lx\n",
877 m_Hub,
Params.Parameters.DeviceIoControl.IoControlCode);
893 DPRINT1(
"Hub %p port %u status request failed, hardware error %u\n",
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
PUSB_CONFIGURATION_DESCRIPTOR m_ConfigDescriptor
VOID SetFlag(_In_ HubFlag Flag)
static HubFdo * FromContext(_In_ UCXHUB_HUB_CONTEXT Context)
WDFIOTARGET m_RootHubTarget
WDFREQUEST m_PortStatusRequest
USHORT m_ConfigTotalLength
VOID Post(_In_ HubEvent Event)
HubControlRequest m_Control
USB_HUB_STATUS_AND_CHANGE m_PreviousHubStatus
HubInterruptRequest m_Interrupt
UCXHUB_STACK_INTERFACE m_Stack
BOOLEAN HasFlag(_In_ HubFlag Flag) const
USB_DEVICE_STATUS m_DeviceStatus
UCXUSBDEVICE UsbDevice() const
USHORT m_InterruptMaxPacket
HubPort * m_PortStatusTarget
HubChange m_SelectedChange
USB_30_HUB_DESCRIPTOR Usb30
BOOLEAN NeedsForwardProgress() const
UCXHUB_PARENT_INTERFACE m_Parent
BOOLEAN IsRootHub() const
union HubFdo::@1628 m_HubDescriptor
HubPort * FindPort(_In_ ULONG PortNumber)
USB_HUB_STATUS_AND_CHANGE m_HubStatus
HubChange LostHubChange()
BOOLEAN CacheConfigDescriptor()
VOID StartStatusChangeRead()
VOID GetConfigDescriptor(_In_ BOOLEAN FullLength)
BOOLEAN ConfigDescriptorTruncated()
HubCheck CheckHubChangeBit()
VOID CancelStatusChangeRead()
HubCheck SelectHubChange()
BOOLEAN OverCurrentCleared()
BOOLEAN ParseHubDescriptor()
VOID FailPortStatus(_In_ BOOLEAN HardwareError)
BOOLEAN ParsePowerStatus()
HubChange PendingHubChange()
#define NT_SUCCESS(StatCode)
#define ExAllocatePoolWithTag(hernya, size, tag)
return pRequest Reuse(ReuseParams)
BOOLEAN NTAPI HubValidateHubConfiguration(_In_ HubFdo *Hub, _In_reads_bytes_(Length) PUSB_CONFIGURATION_DESCRIPTOR Descriptor, _In_ ULONG Length)
BOOLEAN NTAPI HubCheckUsb2HubDescriptor(_In_ HubFdo *Hub, _In_reads_bytes_(Length) PUSB_HUB_DESCRIPTOR Descriptor, _In_ ULONG Length)
VOID NTAPI HubLogConfigTotalLengthMismatch(_In_ HubFdo *Hub)
BOOLEAN NTAPI HubCheckUsb3HubDescriptor(_In_ HubFdo *Hub, _In_reads_bytes_(Length) PUSB_30_HUB_DESCRIPTOR Descriptor, _In_ ULONG Length)
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubInterruptComplete
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubControlComplete
#define USB3_URB_RESERVED_RESOURCES
static NTSTATUS NTAPI HubTtClearValue(_In_ HubChild *Child, _In_ UCXENDPOINT Endpoint, _In_ ULONG EndpointAddress, _Out_ PUSHORT Value)
static WDFREQUEST NTAPI HubTakePortStatusRequest(_In_ HubFdo *Hub, _Out_ PWDF_REQUEST_PARAMETERS Params)
static const char HubTagClearTt[]
VOID NTAPI HubClearTtBuffer(_In_ UCXHUB_HUB_CONTEXT HubContext, _In_ UCXHUB_DEVICE_CONTEXT DeviceContext, _In_ UCXENDPOINT Endpoint, _In_ ULONG EndpointNumber, _In_ ULONG TtPortNumber)
#define HUB_USER_PORT_STATUS_SIZE
#define HUB_USER_PORT_STATUS_OFFSET
static VOID NTAPI HubSendControl(_In_ HubFdo *Hub, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortOk)
static VOID NTAPI HubTtClearComplete(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context)
#define HUB_REQUEST_CLEAR_FEATURE
#define HUB_SETUP_REQUEST_TIMEOUT_MS
#define HUB_MSG_CONTROL_TRANSFER_FAILED
#define HUB_REQUEST_CLEAR_TT_BUFFER
#define HUB_REQUEST_RESET_TT
#define HUB_MSG_INTERRUPT_FAILED
#define HUB_REQUEST_GET_STATUS
#define HUB_C_LOCAL_POWER
#define HUB_REQUEST_GET_DESCRIPTOR
#define HUB_C_OVER_CURRENT
#define HUB_REQUEST_SET_HUB_DEPTH
#define HS_LOCAL_POWER_LOST
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT _In_ ULONG _In_ ULONG TtPortNumber
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_In_ UCXHUB_DEVICE_CONTEXT DeviceContext
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT _In_ ULONG EndpointNumber
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
#define UCXHUB_URB_FLAG_PEND_INTERRUPT_TX
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define _Must_inspect_result_
#define _In_reads_bytes_opt_(s)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_ADAPTER_HARDWARE_ERROR
_Must_inspect_result_ NTSTATUS Create(_In_ WDFOBJECT Parent, _In_ WDFIOTARGET SizingTarget)
NTSTATUS Send(_In_ WDFIOTARGET Target, _In_opt_ UCXUSBDEVICE Device, _In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion, _In_ WDFCONTEXT Context, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk, _In_ BOOLEAN ForwardProgress)
VOID SetSetup(_In_ UCHAR RequestType, _In_ UCHAR RequestCode, _In_ USHORT Value, _In_ USHORT Index, _In_ USHORT Length)
struct _URB_CONTROL_TRANSFER_EX Urb
HubControlRequest Control
struct _LIST_ENTRY * Flink
USB_DEVICE_SPEED HubSpeed
PFN_UCXHUB_CLEAR_TT_BUFFER_COMPLETE ClearTtBufferComplete
USHORT wHubCharacteristics
USHORT wHubCharacteristics
#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
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
#define USB_REQUEST_GET_STATUS
struct _USB_CONFIGURATION_DESCRIPTOR * PUSB_CONFIGURATION_DESCRIPTOR
#define USB_REQUEST_GET_DESCRIPTOR
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
#define USB_ENDPOINT_TYPE_CONTROL
#define USB_ENDPOINT_DIRECTION_MASK
#define USB_ENDPOINT_TYPE_MASK
#define USB_ENDPOINT_TYPE_BULK
#define USB_20_HUB_DESCRIPTOR_TYPE
#define USB_30_HUB_DESCRIPTOR_TYPE
#define USBD_TRANSFER_DIRECTION_IN
#define USBD_SHORT_TRANSFER_OK
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
#define USBD_DEFAULT_PIPE_TRANSFER
_In_opt_ PVOID HubContext
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define IOCTL_USB_GET_PORT_STATUS
#define USBD_PORT_ENABLED
#define USBD_PORT_CONNECTED
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, ActualLength)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WdfObjectReferenceWithTag(Handle, Tag)
_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
FORCEINLINE VOID WDF_REQUEST_PARAMETERS_INIT(_Out_ PWDF_REQUEST_PARAMETERS Parameters)
EVT_WDF_REQUEST_COMPLETION_ROUTINE * PFN_WDF_REQUEST_COMPLETION_ROUTINE
_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)
#define WDF_NO_SEND_OPTIONS
_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
#define IRP_MJ_INTERNAL_DEVICE_CONTROL