ReactOS 0.4.16-dev-2208-g6350669
usbhub.c File Reference
#include "usbhub.h"
#include <debug.h>
#include "dbg_uhub.h"
#include <ntddstor.h>
Include dependency graph for usbhub.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define NDEBUG_USBHUB_SCE
 
#define NDEBUG_USBHUB_PNP
 

Functions

NTSTATUS NTAPI USBH_Wait (IN ULONG Milliseconds)
 
NTSTATUS NTAPI USBH_GetConfigValue (IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
 
VOID NTAPI USBH_CompleteIrp (IN PIRP Irp, IN NTSTATUS CompleteStatus)
 
NTSTATUS NTAPI USBH_PassIrp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_SyncIrpComplete (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
BOOLEAN NTAPI IsBitSet (IN PUCHAR BitMapAddress, IN USHORT Bit)
 
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI USBH_WriteFailReasonID (IN PDEVICE_OBJECT DeviceObject, IN ULONG FailReason)
 
VOID NTAPI USBH_UrbTimeoutDPC (IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
 
NTSTATUS NTAPI USBH_SetPdoRegistryParameter (IN PDEVICE_OBJECT DeviceObject, IN PCWSTR ValueName, IN PVOID Data, IN ULONG DataSize, IN ULONG Type, IN ULONG DevInstKeyType)
 
NTSTATUS NTAPI USBH_SyncSubmitUrb (IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
 
NTSTATUS NTAPI USBH_FdoSyncSubmitUrb (IN PDEVICE_OBJECT FdoDevice, IN PURB Urb)
 
NTSTATUS NTAPI USBH_Transact (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID TransferBuffer, IN ULONG BufferLen, IN BOOLEAN IsDeviceToHost, IN USHORT Function, IN BM_REQUEST_TYPE RequestType, IN UCHAR Request, IN USHORT RequestValue, IN USHORT RequestIndex)
 
NTSTATUS NTAPI USBH_SyncResetPort (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port)
 
NTSTATUS NTAPI USBH_GetDeviceType (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, OUT USB_DEVICE_TYPE *OutDeviceType)
 
NTSTATUS NTAPI USBHUB_GetExtendedHubInfo (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_EXTHUB_INFORMATION_0 HubInfoBuffer)
 
PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_SyncGetRootHubPdo (IN PDEVICE_OBJECT DeviceObject, IN OUT PDEVICE_OBJECT *OutPdo1, IN OUT PDEVICE_OBJECT *OutPdo2)
 
NTSTATUS NTAPI USBH_SyncGetHubCount (IN PDEVICE_OBJECT DeviceObject, IN OUT PULONG OutHubCount)
 
PUSB_DEVICE_HANDLE NTAPI USBH_SyncGetDeviceHandle (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI USBH_GetDeviceDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PUSB_DEVICE_DESCRIPTOR HubDeviceDescriptor)
 
NTSTATUS NTAPI USBH_SyncGetDeviceConfigurationDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor, IN ULONG NumberOfBytes, IN PULONG OutLength)
 
NTSTATUS NTAPI USBH_GetConfigurationDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR *OutDescriptor)
 
NTSTATUS NTAPI USBH_SyncGetHubDescriptor (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_SyncGetStringDescriptor (IN PDEVICE_OBJECT DeviceObject, IN UCHAR Index, IN USHORT LanguageId, IN PUSB_STRING_DESCRIPTOR Descriptor, IN ULONG NumberOfBytes, IN PULONG OutLength, IN BOOLEAN IsValidateLength)
 
NTSTATUS NTAPI USBH_SyncGetStatus (IN PDEVICE_OBJECT DeviceObject, IN PUSHORT OutStatus, IN USHORT Function, IN USHORT RequestIndex)
 
NTSTATUS NTAPI USBH_SyncGetHubStatus (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_HUB_STATUS_AND_CHANGE HubStatus, IN ULONG Length)
 
NTSTATUS NTAPI USBH_SyncClearHubStatus (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT RequestValue)
 
NTSTATUS NTAPI USBH_SyncGetPortStatus (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN PUSB_PORT_STATUS_AND_CHANGE PortStatus, IN ULONG Length)
 
NTSTATUS NTAPI USBH_SyncClearPortStatus (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN USHORT RequestValue)
 
NTSTATUS NTAPI USBH_SyncPowerOnPort (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN BOOLEAN IsWait)
 
NTSTATUS NTAPI USBH_SyncPowerOnPorts (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_SyncDisablePort (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port)
 
BOOLEAN NTAPI USBH_HubIsBusPowered (IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor)
 
NTSTATUS NTAPI USBH_ChangeIndicationAckChangeComplete (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI USBH_ChangeIndicationAckChange (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *Urb, IN USHORT Port, IN USHORT RequestValue)
 
NTSTATUS NTAPI USBH_ChangeIndicationProcessChange (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI USBH_ChangeIndicationQueryChange (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *Urb, IN USHORT Port)
 
VOID NTAPI USBH_ProcessHubStateChange (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_HUB_STATUS_AND_CHANGE HubStatus)
 
VOID NTAPI USBH_ProcessPortStateChange (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN PUSB_PORT_STATUS_AND_CHANGE PortStatus)
 
NTSTATUS NTAPI USBH_GetPortStatus (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PULONG PortStatus)
 
NTSTATUS NTAPI USBH_EnableParentPort (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_ResetInterruptPipe (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_ResetHub (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_ChangeIndicationWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
NTSTATUS NTAPI USBH_ChangeIndication (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBD_CreateDeviceEx (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE *OutDeviceHandle, IN USB_PORT_STATUS UsbPortStatus, IN USHORT Port)
 
NTSTATUS NTAPI USBD_RemoveDeviceEx (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, IN ULONG Flags)
 
NTSTATUS NTAPI USBD_InitializeDeviceEx (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, IN PUCHAR DeviceDescriptorBuffer, IN ULONG DeviceDescriptorBufferLength, IN PUCHAR ConfigDescriptorBuffer, IN ULONG ConfigDescriptorBufferLength)
 
VOID NTAPI USBHUB_SetDeviceHandleData (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PDEVICE_OBJECT UsbDevicePdo, IN PVOID DeviceHandle)
 
VOID NTAPI USBHUB_FlushAllTransfers (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBD_GetDeviceInformationEx (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_NODE_CONNECTION_INFORMATION_EX Info, IN ULONG Length, IN PUSB_DEVICE_HANDLE DeviceHandle)
 
NTSTATUS NTAPI USBD_RestoreDeviceEx (IN PUSBHUB_FDO_EXTENSION HubExtension, IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle, IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle)
 
NTSTATUS NTAPI USBH_AllocateWorkItem (PUSBHUB_FDO_EXTENSION HubExtension, PUSBHUB_IO_WORK_ITEM *OutHubIoWorkItem, PUSBHUB_WORKER_ROUTINE WorkerRoutine, SIZE_T BufferLength, PVOID *OutHubWorkItemBuffer, WORK_QUEUE_TYPE Type)
 
VOID NTAPI USBH_Worker (IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
 
VOID NTAPI USBH_QueueWorkItem (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
 
VOID NTAPI USBH_FreeWorkItem (IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
 
VOID NTAPI USBHUB_RootHubCallBack (IN PVOID Context)
 
NTSTATUS NTAPI USBD_RegisterRootHubCallBack (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBD_UnRegisterRootHubCallBack (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_HubSetDWakeCompletion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
VOID NTAPI USBH_HubQueuePortIdleIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY IdleList)
 
VOID NTAPI USBH_HubCompleteQueuedPortIdleIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY IdleList, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_FlushPortPwrList (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_HubCompletePortIdleIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_HubCancelIdleIrp (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP IdleIrp)
 
BOOLEAN NTAPI USBH_CheckIdleAbort (IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
 
VOID NTAPI USBH_FdoWaitWakeIrpCompletion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
NTSTATUS NTAPI USBH_FdoSubmitWaitWakeIrp (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_FdoIdleNotificationCallback (IN PVOID Context)
 
VOID NTAPI USBH_CompletePortIdleIrpsWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
VOID NTAPI USBH_IdleCompletePowerHubWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
NTSTATUS NTAPI USBH_FdoIdleNotificationRequestComplete (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI USBH_FdoSubmitIdleRequestIrp (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_CheckHubIdle (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_CheckIdleWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
VOID NTAPI USBH_CheckIdleDeferred (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_PdoSetCapabilities (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension)
 
NTSTATUS NTAPI USBH_ProcessDeviceInformation (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension)
 
BOOLEAN NTAPI USBH_CheckDeviceIDUnique (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT idVendor, IN USHORT idProduct, IN PVOID SerialNumber, IN USHORT SN_DescriptorLength)
 
BOOLEAN NTAPI USBH_ValidateSerialNumberString (IN PUSHORT SerialNumberString)
 
NTSTATUS NTAPI USBH_CheckDeviceLanguage (IN PDEVICE_OBJECT DeviceObject, IN USHORT LanguageId)
 
NTSTATUS NTAPI USBH_GetSerialNumberString (IN PDEVICE_OBJECT DeviceObject, IN LPWSTR *OutSerialNumber, IN PUSHORT OutDescriptorLength, IN USHORT LanguageId, IN UCHAR Index)
 
NTSTATUS NTAPI USBH_CreateDevice (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN USB_PORT_STATUS UsbPortStatus, IN ULONG IsWait)
 
NTSTATUS NTAPI USBH_ResetDevice (IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN BOOLEAN IsKeepDeviceData, IN BOOLEAN IsWait)
 
NTSTATUS NTAPI USBH_PdoDispatch (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_FdoDispatch (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_AddDevice (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT LowerPDO)
 
VOID NTAPI USBH_DriverUnload (IN PDRIVER_OBJECT DriverObject)
 
NTSTATUS NTAPI USBH_HubDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_RegQueryGenericUSBDeviceString (PVOID USBDeviceString)
 
NTSTATUS NTAPI DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
 

Variables

PWSTR GenericUSBDeviceString = NULL
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file usbhub.c.

◆ NDEBUG_USBHUB_PNP

#define NDEBUG_USBHUB_PNP

Definition at line 14 of file usbhub.c.

◆ NDEBUG_USBHUB_SCE

#define NDEBUG_USBHUB_SCE

Definition at line 13 of file usbhub.c.

Function Documentation

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( IN PDRIVER_OBJECT  DriverObject,
IN PUNICODE_STRING  RegistryPath 
)

Definition at line 5130 of file usbhub.c.

5132{
5133 DPRINT("USBHUB: DriverEntry - %wZ\n", RegistryPath);
5134
5135 DriverObject->DriverExtension->AddDevice = USBH_AddDevice;
5136 DriverObject->DriverUnload = USBH_DriverUnload;
5137
5139 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBH_HubDispatch;
5140
5143
5144 DriverObject->MajorFunction[IRP_MJ_PNP] = USBH_HubDispatch;
5145 DriverObject->MajorFunction[IRP_MJ_POWER] = USBH_HubDispatch;
5147
5149
5150 return STATUS_SUCCESS;
5151}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
NTSTATUS NTAPI USBH_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT LowerPDO)
Definition: usbhub.c:4962
NTSTATUS NTAPI USBH_HubDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: usbhub.c:5049
PWSTR GenericUSBDeviceString
Definition: usbhub.c:19
NTSTATUS NTAPI USBH_RegQueryGenericUSBDeviceString(PVOID USBDeviceString)
Definition: usbhub.c:5105
VOID NTAPI USBH_DriverUnload(IN PDRIVER_OBJECT DriverObject)
Definition: usbhub.c:5036
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define IRP_MJ_POWER

◆ IsBitSet()

BOOLEAN NTAPI IsBitSet ( IN PUCHAR  BitMapAddress,
IN USHORT  Bit 
)

Definition at line 121 of file usbhub.c.

123{
124 BOOLEAN IsSet;
125
126 IsSet = (BitMapAddress[Bit / 8] & (1 << (Bit & 7))) != 0;
127 DPRINT("IsBitSet: Bit - %lX, IsSet - %x\n", Bit, IsSet);
128 return IsSet;
129}
unsigned char BOOLEAN

Referenced by USBH_ChangeIndication(), and USBH_ChangeIndicationWorker().

◆ PdoExt()

◆ USBD_CreateDeviceEx()

NTSTATUS NTAPI USBD_CreateDeviceEx ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_DEVICE_HANDLE OutDeviceHandle,
IN USB_PORT_STATUS  UsbPortStatus,
IN USHORT  Port 
)

Definition at line 2523 of file usbhub.c.

2527{
2529 PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
2530
2531 DPRINT("USBD_CreateDeviceEx: Port - %x, UsbPortStatus - 0x%04X\n",
2532 Port,
2533 UsbPortStatus.AsUshort16);
2534
2535 CreateUsbDevice = HubExtension->BusInterface.CreateUsbDevice;
2536
2537 if (!CreateUsbDevice)
2538 {
2540 }
2541
2542 HubDeviceHandle = USBH_SyncGetDeviceHandle(HubExtension->LowerDevice);
2543
2544 return CreateUsbDevice(HubExtension->BusInterface.BusContext,
2545 OutDeviceHandle,
2547 UsbPortStatus.AsUshort16,
2548 Port);
2549}
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
CPPORT Port[4]
Definition: headless.c:35
_Outptr_ PUSB_DEVICE_HANDLE _In_ PUSB_DEVICE_HANDLE HubDeviceHandle
Definition: hubbusif.h:41
USB_BUSIFFN_CREATE_USB_DEVICE * PUSB_BUSIFFN_CREATE_USB_DEVICE
Definition: hubbusif.h:44
PUSB_DEVICE_HANDLE NTAPI USBH_SyncGetDeviceHandle(IN PDEVICE_OBJECT DeviceObject)
Definition: usbhub.c:832

Referenced by USBH_CreateDevice(), and USBH_ResetDevice().

◆ USBD_GetDeviceInformationEx()

NTSTATUS NTAPI USBD_GetDeviceInformationEx ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_NODE_CONNECTION_INFORMATION_EX  Info,
IN ULONG  Length,
IN PUSB_DEVICE_HANDLE  DeviceHandle 
)

Definition at line 2654 of file usbhub.c.

2659{
2662 SIZE_T DeviceInfoLength;
2663 PUSB_NODE_CONNECTION_INFORMATION_EX NodeInfo;
2664 SIZE_T NodeInfoLength;
2665 ULONG PipeNumber;
2666 ULONG dummy;
2668
2669 DPRINT("USBD_GetDeviceInformationEx ... \n");
2670
2671 QueryDeviceInformation = HubExtension->BusInterface.QueryDeviceInformation;
2672
2674 {
2676 return Status;
2677 }
2678
2679 DeviceInfoLength = sizeof(USB_DEVICE_INFORMATION_0);
2680
2681 while (TRUE)
2682 {
2684 DeviceInfoLength,
2685 USB_HUB_TAG);
2686
2687 if (!DeviceInfo)
2688 {
2690 }
2691
2692 RtlZeroMemory(DeviceInfo, DeviceInfoLength);
2693
2694 DeviceInfo->InformationLevel = 0;
2695
2696 Status = QueryDeviceInformation(HubExtension->BusInterface.BusContext,
2698 DeviceInfo,
2699 DeviceInfoLength,
2700 &dummy);
2701
2703 {
2704 break;
2705 }
2706
2707 DeviceInfoLength = DeviceInfo->ActualLength;
2708
2710 }
2711
2712 NodeInfo = NULL;
2713 NodeInfoLength = 0;
2714
2715 if (NT_SUCCESS(Status))
2716 {
2717 NodeInfoLength = (sizeof(USB_NODE_CONNECTION_INFORMATION_EX) - sizeof(USB_PIPE_INFO)) +
2718 DeviceInfo->NumberOfOpenPipes * sizeof(USB_PIPE_INFO);
2719
2720 NodeInfo = ExAllocatePoolWithTag(PagedPool, NodeInfoLength, USB_HUB_TAG);
2721
2722 if (!NodeInfo)
2723 {
2726 }
2727
2728 RtlZeroMemory(NodeInfo, NodeInfoLength);
2729
2730 NodeInfo->ConnectionIndex = Info->ConnectionIndex;
2731
2732 RtlCopyMemory(&NodeInfo->DeviceDescriptor,
2733 &DeviceInfo->DeviceDescriptor,
2734 sizeof(USB_DEVICE_DESCRIPTOR));
2735
2736 NodeInfo->CurrentConfigurationValue = DeviceInfo->CurrentConfigurationValue;
2737 NodeInfo->Speed = DeviceInfo->DeviceSpeed;
2738 NodeInfo->DeviceIsHub = PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_HUB_DEVICE;
2739 NodeInfo->DeviceAddress = DeviceInfo->DeviceAddress;
2740 NodeInfo->NumberOfOpenPipes = DeviceInfo->NumberOfOpenPipes;
2741 NodeInfo->ConnectionStatus = Info->ConnectionStatus;
2742
2743 for (PipeNumber = 0;
2744 PipeNumber < DeviceInfo->NumberOfOpenPipes;
2745 PipeNumber++)
2746 {
2747 RtlCopyMemory(&NodeInfo->PipeList[PipeNumber],
2748 &DeviceInfo->PipeList[PipeNumber],
2749 sizeof(USB_PIPE_INFO));
2750 }
2751 }
2752
2754
2755 if (NodeInfo)
2756 {
2757 if (NodeInfoLength <= Length)
2758 {
2759 Length = NodeInfoLength;
2760 }
2761 else
2762 {
2764 }
2765
2766 RtlCopyMemory(Info, NodeInfo, Length);
2767
2768 ExFreePoolWithTag(NodeInfo, USB_HUB_TAG);
2769 }
2770
2771 return Status;
2772}
LONG NTSTATUS
Definition: precomp.h:26
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
BOOL NTAPI QueryDeviceInformation(_In_ PCWSTR DriveRoot, _Out_ PVOID DeviceInformation, _In_ ULONG BufferSize)
Retrieves disk device information.
Definition: query.c:79
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
_Inout_ PUSB_DEVICE_HANDLE DeviceHandle
Definition: hubbusif.h:121
struct _USB_DEVICE_INFORMATION_0 USB_DEVICE_INFORMATION_0
USB_BUSIFFN_GET_DEVICE_INFORMATION * PUSB_BUSIFFN_GET_DEVICE_INFORMATION
Definition: hubbusif.h:183
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define USB_HUB_TAG
Definition: usbhub.h:26
#define USBHUB_PDO_FLAG_HUB_DEVICE
Definition: usbhub.h:61
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690

Referenced by USBH_IoctlGetNodeConnectionInformation().

◆ USBD_InitializeDeviceEx()

NTSTATUS NTAPI USBD_InitializeDeviceEx ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_DEVICE_HANDLE  DeviceHandle,
IN PUCHAR  DeviceDescriptorBuffer,
IN ULONG  DeviceDescriptorBufferLength,
IN PUCHAR  ConfigDescriptorBuffer,
IN ULONG  ConfigDescriptorBufferLength 
)

Definition at line 2577 of file usbhub.c.

2583{
2585 PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
2586 PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
2587
2588 DPRINT("USBD_InitializeDeviceEx: ... \n");
2589
2590 InitializeUsbDevice = HubExtension->BusInterface.InitializeUsbDevice;
2591 GetUsbDescriptors = HubExtension->BusInterface.GetUsbDescriptors;
2592
2593 if (!InitializeUsbDevice || !GetUsbDescriptors)
2594 {
2596 }
2597
2598 Status = InitializeUsbDevice(HubExtension->BusInterface.BusContext,
2599 DeviceHandle);
2600
2601 if (!NT_SUCCESS(Status))
2602 {
2603 return Status;
2604 }
2605
2606 return GetUsbDescriptors(HubExtension->BusInterface.BusContext,
2612}
USB_BUSIFFN_INITIALIZE_USB_DEVICE * PUSB_BUSIFFN_INITIALIZE_USB_DEVICE
Definition: hubbusif.h:122
USB_BUSIFFN_GET_USB_DESCRIPTORS * PUSB_BUSIFFN_GET_USB_DESCRIPTORS
Definition: hubbusif.h:154
_Inout_ PUSB_DEVICE_HANDLE _Out_writes_bytes_to_ DeviceDescriptorBufferLength PUCHAR _Inout_ PULONG _Out_writes_bytes_to_ ConfigDescriptorBufferLength PUCHAR _Inout_ PULONG ConfigDescriptorBufferLength
Definition: hubbusif.h:153
_Inout_ PUSB_DEVICE_HANDLE _Out_writes_bytes_to_ DeviceDescriptorBufferLength PUCHAR DeviceDescriptorBuffer
Definition: hubbusif.h:148
_Inout_ PUSB_DEVICE_HANDLE _Out_writes_bytes_to_ DeviceDescriptorBufferLength PUCHAR _Inout_ PULONG _Out_writes_bytes_to_ ConfigDescriptorBufferLength PUCHAR ConfigDescriptorBuffer
Definition: hubbusif.h:151
_Inout_ PUSB_DEVICE_HANDLE _Out_writes_bytes_to_ DeviceDescriptorBufferLength PUCHAR _Inout_ PULONG DeviceDescriptorBufferLength
Definition: hubbusif.h:150

Referenced by USBH_CreateDevice(), and USBH_ResetDevice().

◆ USBD_RegisterRootHubCallBack()

NTSTATUS NTAPI USBD_RegisterRootHubCallBack ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3001 of file usbhub.c.

3002{
3003 PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
3004
3005 DPRINT("USBD_RegisterRootHubCallBack: ... \n");
3006
3007 RootHubInitNotification = HubExtension->BusInterface.RootHubInitNotification;
3008
3009 if (!RootHubInitNotification)
3010 {
3012 }
3013
3014 KeClearEvent(&HubExtension->RootHubNotificationEvent);
3015
3016 return RootHubInitNotification(HubExtension->BusInterface.BusContext,
3017 HubExtension,
3019}
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
USB_BUSIFFN_ROOTHUB_INIT_NOTIFY * PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY
Definition: hubbusif.h:279
VOID NTAPI USBHUB_RootHubCallBack(IN PVOID Context)
Definition: usbhub.c:2972

Referenced by USBH_StartHubFdoDevice().

◆ USBD_RemoveDeviceEx()

NTSTATUS NTAPI USBD_RemoveDeviceEx ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_DEVICE_HANDLE  DeviceHandle,
IN ULONG  Flags 
)

Definition at line 2553 of file usbhub.c.

2556{
2557 PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
2558
2559 DPRINT("USBD_RemoveDeviceEx: DeviceHandle - %p, Flags - %X\n",
2561 Flags);
2562
2563 RemoveUsbDevice = HubExtension->BusInterface.RemoveUsbDevice;
2564
2565 if (!RemoveUsbDevice)
2566 {
2568 }
2569
2570 return RemoveUsbDevice(HubExtension->BusInterface.BusContext,
2572 Flags);
2573}
USB_BUSIFFN_REMOVE_USB_DEVICE * PUSB_BUSIFFN_REMOVE_USB_DEVICE
Definition: hubbusif.h:140
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by USBH_CreateDevice(), USBH_FdoCleanup(), USBH_FdoQueryBusRelations(), USBH_PdoRemoveDevice(), USBH_ProcessPortStateChange(), USBH_ResetDevice(), and USBH_ResetPortWorker().

◆ USBD_RestoreDeviceEx()

NTSTATUS NTAPI USBD_RestoreDeviceEx ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN OUT PUSB_DEVICE_HANDLE  OldDeviceHandle,
IN OUT PUSB_DEVICE_HANDLE  NewDeviceHandle 
)

Definition at line 2776 of file usbhub.c.

2779{
2780 PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
2782
2783 DPRINT("USBD_RestoreDeviceEx: HubExtension - %p, OldDeviceHandle - %p, NewDeviceHandle - %p\n",
2784 HubExtension,
2787
2788 RestoreUsbDevice = HubExtension->BusInterface.RestoreUsbDevice;
2789
2790 if (RestoreUsbDevice)
2791 {
2792 Status = RestoreUsbDevice(HubExtension->BusInterface.BusContext,
2795 }
2796 else
2797 {
2799 }
2800
2801 return Status;
2802}
_Outptr_ PUSB_DEVICE_HANDLE * NewDeviceHandle
Definition: hubbusif.h:40
_Inout_ PUSB_DEVICE_HANDLE OldDeviceHandle
Definition: hubbusif.h:161
USB_BUSIFFN_RESTORE_DEVICE * PUSB_BUSIFFN_RESTORE_DEVICE
Definition: hubbusif.h:163

Referenced by USBH_ResetDevice().

◆ USBD_UnRegisterRootHubCallBack()

NTSTATUS NTAPI USBD_UnRegisterRootHubCallBack ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3023 of file usbhub.c.

3024{
3025 PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
3027
3028 DPRINT("USBD_UnRegisterRootHubCallBack ... \n");
3029
3030 RootHubInitNotification = HubExtension->BusInterface.RootHubInitNotification;
3031
3032 if (!RootHubInitNotification)
3033 {
3035 }
3036
3037 Status = RootHubInitNotification(HubExtension->BusInterface.BusContext,
3038 NULL,
3039 NULL);
3040
3041 if (!NT_SUCCESS(Status))
3042 {
3043 KeWaitForSingleObject(&HubExtension->RootHubNotificationEvent,
3044 Executive,
3045 KernelMode,
3046 FALSE,
3047 NULL);
3048 }
3049
3050 return Status;
3051}
#define FALSE
Definition: types.h:117
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KernelMode
Definition: asm.h:38
@ Executive
Definition: ketypes.h:467

Referenced by USBH_FdoCleanup().

◆ USBH_AddDevice()

NTSTATUS NTAPI USBH_AddDevice ( IN PDRIVER_OBJECT  DriverObject,
IN PDEVICE_OBJECT  LowerPDO 
)

Definition at line 4962 of file usbhub.c.

4964{
4967 PUSBHUB_FDO_EXTENSION HubExtension;
4968 PDEVICE_OBJECT LowerDevice;
4969
4970 DPRINT("USBH_AddDevice: DriverObject - %p, LowerPDO - %p\n",
4972 LowerPDO);
4973
4975
4977 sizeof(USBHUB_FDO_EXTENSION),
4978 NULL,
4979 0x8600,
4981 FALSE,
4982 &DeviceObject);
4983
4984 if (!NT_SUCCESS(Status))
4985 {
4986 DPRINT1("USBH_AddDevice: IoCreateDevice() fail\n");
4987
4988 if (DeviceObject)
4989 {
4991 }
4992
4993 return Status;
4994 }
4995
4996 DPRINT("USBH_AddDevice: DeviceObject - %p\n", DeviceObject);
4997
4998 HubExtension = DeviceObject->DeviceExtension;
4999 RtlZeroMemory(HubExtension, sizeof(USBHUB_FDO_EXTENSION));
5000
5002
5003 LowerDevice = IoAttachDeviceToDeviceStack(DeviceObject, LowerPDO);
5004
5005 if (!LowerDevice)
5006 {
5007 DPRINT1("USBH_AddDevice: IoAttachDeviceToDeviceStack() fail\n");
5008
5009 if (DeviceObject)
5010 {
5012 }
5013
5014 return STATUS_UNSUCCESSFUL;
5015 }
5016
5017 DPRINT("USBH_AddDevice: LowerDevice - %p\n", LowerDevice);
5018
5019 HubExtension->Common.SelfDevice = DeviceObject;
5020
5021 HubExtension->LowerPDO = LowerPDO;
5022 HubExtension->LowerDevice = LowerDevice;
5023
5024 KeInitializeSemaphore(&HubExtension->IdleSemaphore, 1, 1);
5025
5027 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
5028
5029 DPRINT("USBH_AddDevice: call IoWMIRegistrationControl() UNIMPLEMENTED. FIXME\n");
5030
5031 return Status;
5032}
#define DPRINT1
Definition: precomp.h:8
#define FILE_AUTOGENERATED_DEVICE_NAME
Definition: iotypes.h:138
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:966
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
Definition: semphobj.c:22
PDEVICE_OBJECT SelfDevice
Definition: usbhub.h:144
PDEVICE_OBJECT LowerPDO
Definition: usbhub.h:149
KSEMAPHORE IdleSemaphore
Definition: usbhub.h:177
COMMON_DEVICE_EXTENSION Common
Definition: usbhub.h:148
PDEVICE_OBJECT LowerDevice
Definition: usbhub.h:150
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define USBH_EXTENSION_TYPE_HUB
Definition: usbhub.h:28
#define DO_POWER_PAGABLE

Referenced by DriverEntry().

◆ USBH_AllocateWorkItem()

NTSTATUS NTAPI USBH_AllocateWorkItem ( PUSBHUB_FDO_EXTENSION  HubExtension,
PUSBHUB_IO_WORK_ITEM OutHubIoWorkItem,
PUSBHUB_WORKER_ROUTINE  WorkerRoutine,
SIZE_T  BufferLength,
PVOID OutHubWorkItemBuffer,
WORK_QUEUE_TYPE  Type 
)

Definition at line 2806 of file usbhub.c.

2812{
2813 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
2815 PVOID WorkItemBuffer;
2816
2817 DPRINT("USBH_AllocateWorkItem: ... \n");
2818
2819 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_WITEM_INIT))
2820 {
2822 }
2823
2824 HubIoWorkItem = ExAllocatePoolWithTag(NonPagedPool,
2825 sizeof(USBHUB_IO_WORK_ITEM),
2826 USB_HUB_TAG);
2827
2828 if (!HubIoWorkItem)
2829 {
2831 }
2832
2833 RtlZeroMemory(HubIoWorkItem, sizeof(USBHUB_IO_WORK_ITEM));
2834
2836
2837 HubIoWorkItem->HubWorkItem = WorkItem;
2838
2839 if (!WorkItem)
2840 {
2841 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2843 }
2844
2845 if (BufferLength && OutHubWorkItemBuffer)
2846 {
2847 WorkItemBuffer = ExAllocatePoolWithTag(NonPagedPool,
2849 USB_HUB_TAG);
2850
2851 HubIoWorkItem->HubWorkItemBuffer = WorkItemBuffer;
2852
2853 if (!WorkItemBuffer)
2854 {
2855 IoFreeWorkItem(HubIoWorkItem->HubWorkItem);
2856 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2857
2859 }
2860
2861 RtlZeroMemory(WorkItemBuffer, BufferLength);
2862 }
2863 else
2864 {
2865 HubIoWorkItem->HubWorkItemBuffer = NULL;
2866 }
2867
2868 HubIoWorkItem->HubWorkItemType = Type;
2869 HubIoWorkItem->HubExtension = HubExtension;
2870 HubIoWorkItem->HubWorkerRoutine = WorkerRoutine;
2871
2872 if (OutHubIoWorkItem)
2873 {
2874 *OutHubIoWorkItem = HubIoWorkItem;
2875 }
2876
2877 if (OutHubWorkItemBuffer)
2878 {
2879 *OutHubWorkItemBuffer = HubIoWorkItem->HubWorkItemBuffer;
2880 }
2881
2882 return STATUS_SUCCESS;
2883}
Type
Definition: Type.h:7
#define NonPagedPool
Definition: env_spec_w32.h:307
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine
Definition: fltkernel.h:1977
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
PUSBHUB_WORKER_ROUTINE HubWorkerRoutine
Definition: usbhub.h:138
PUSBHUB_FDO_EXTENSION HubExtension
Definition: usbhub.h:137
WORK_QUEUE_TYPE HubWorkItemType
Definition: usbhub.h:136
PVOID HubWorkItemBuffer
Definition: usbhub.h:139
PIO_WORKITEM HubWorkItem
Definition: usbhub.h:135
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define USBHUB_FDO_FLAG_WITEM_INIT
Definition: usbhub.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115

Referenced by USBH_ChangeIndication(), USBH_CheckIdleDeferred(), USBH_FdoIdleNotificationRequestComplete(), USBH_PdoIoctlResetPort(), and USBH_PortIdleNotificationCancelRoutine().

◆ USBH_ChangeIndication()

NTSTATUS NTAPI USBH_ChangeIndication ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 2334 of file usbhub.c.

2337{
2338 PUSBHUB_FDO_EXTENSION HubExtension;
2339 USBD_STATUS UrbStatus;
2340 BOOLEAN IsErrors = FALSE;
2341 PUSBHUB_IO_WORK_ITEM HubWorkItem;
2342 PUSBHUB_STATUS_CHANGE_CONTEXT HubWorkItemBuffer;
2343 USHORT NumPorts;
2344 USHORT Port;
2346 PVOID Bitmap;
2348
2349 HubExtension = Context;
2350 UrbStatus = HubExtension->SCEWorkerUrb.Hdr.Status;
2351
2352 DPRINT_SCE("USBH_ChangeIndication: IrpStatus - %x, UrbStatus - %x, HubFlags - %lX\n",
2353 Irp->IoStatus.Status,
2354 UrbStatus,
2355 HubExtension->HubFlags);
2356
2357 if (NT_ERROR(Irp->IoStatus.Status) || USBD_ERROR(UrbStatus) ||
2358 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED) ||
2359 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING))
2360 {
2361 HubExtension->RequestErrors++;
2362
2363 IsErrors = TRUE;
2364
2365 KeSetEvent(&HubExtension->StatusChangeEvent,
2367 FALSE);
2368
2369 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING ||
2370 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED ||
2371 HubExtension->RequestErrors > USBHUB_MAX_REQUEST_ERRORS ||
2372 Irp->IoStatus.Status == STATUS_DELETE_PENDING)
2373 {
2374 DPRINT_SCE("USBH_ChangeIndication: HubExtension->RequestErrors - %x\n",
2375 HubExtension->RequestErrors);
2376
2378 }
2379
2380 DPRINT_SCE("USBH_ChangeIndication: HubExtension->RequestErrors - %x\n",
2381 HubExtension->RequestErrors);
2382 }
2383 else
2384 {
2385 HubExtension->RequestErrors = 0;
2386 }
2387
2389 HubExtension->SCEBitmapLength;
2390
2391 Status = USBH_AllocateWorkItem(HubExtension,
2392 &HubWorkItem,
2395 (PVOID *)&HubWorkItemBuffer,
2397
2398 if (!NT_SUCCESS(Status))
2399 {
2401 }
2402
2403 RtlZeroMemory(HubWorkItemBuffer, BufferLength);
2404
2405 HubWorkItemBuffer->IsRequestErrors = FALSE;
2406
2407 if (IsErrors)
2408 {
2409 HubWorkItemBuffer->IsRequestErrors = TRUE;
2410 }
2411
2412 if (InterlockedIncrement(&HubExtension->ResetRequestCount) == 1)
2413 {
2414 KeClearEvent(&HubExtension->ResetEvent);
2415 }
2416
2417 HubWorkItemBuffer->HubExtension = HubExtension;
2418
2419 HubExtension->WorkItemToQueue = HubWorkItem;
2420
2421 Bitmap = HubWorkItemBuffer + 1;
2422
2424 HubExtension->SCEBitmap,
2425 HubExtension->SCEBitmapLength);
2426
2427 NumPorts = HubExtension->HubDescriptor->bNumberOfPorts;
2428
2429 for (Port = 0; Port <= NumPorts; ++Port)
2430 {
2431 if (IsBitSet(Bitmap, Port))
2432 {
2433 break;
2434 }
2435 }
2436
2437 if (Port > NumPorts)
2438 {
2439 Port = 0;
2440 }
2441
2443 HubExtension->ResetPortIrp,
2444 &HubExtension->SCEWorkerUrb,
2445 Port);
2446
2447 if (NT_ERROR(Status))
2448 {
2449 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_FAILED;
2450 }
2451
2453}
#define InterlockedIncrement
Definition: armddk.h:53
_In_ PIRP Irp
Definition: csq.h:116
#define DPRINT_SCE(...)
Definition: dbg_uhub.h:110
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define STATUS_DELETE_PENDING
Definition: ntstatus.h:416
unsigned short USHORT
Definition: pedump.c:61
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
PUSBHUB_IO_WORK_ITEM WorkItemToQueue
Definition: usbhub.h:197
PUSB_HUB_DESCRIPTOR HubDescriptor
Definition: usbhub.h:166
struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST SCEWorkerUrb
Definition: usbhub.h:175
KEVENT StatusChangeEvent
Definition: usbhub.h:176
PUSBHUB_FDO_EXTENSION HubExtension
Definition: usbhub.h:249
UCHAR bNumberOfPorts
Definition: usb100.h:173
#define NT_ERROR(Status)
Definition: umtypes.h:106
#define USBD_ERROR(Status)
Definition: usb.h:169
LONG USBD_STATUS
Definition: usb.h:165
VOID NTAPI USBH_ChangeIndicationWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:2159
NTSTATUS NTAPI USBH_AllocateWorkItem(PUSBHUB_FDO_EXTENSION HubExtension, PUSBHUB_IO_WORK_ITEM *OutHubIoWorkItem, PUSBHUB_WORKER_ROUTINE WorkerRoutine, SIZE_T BufferLength, PVOID *OutHubWorkItemBuffer, WORK_QUEUE_TYPE Type)
Definition: usbhub.c:2806
NTSTATUS NTAPI USBH_ChangeIndicationQueryChange(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *Urb, IN USHORT Port)
Definition: usbhub.c:1769
BOOLEAN NTAPI IsBitSet(IN PUCHAR BitMapAddress, IN USHORT Bit)
Definition: usbhub.c:121
#define USBHUB_FDO_FLAG_DEVICE_STOPPING
Definition: usbhub.h:34
#define USBHUB_MAX_REQUEST_ERRORS
Definition: usbhub.h:108
struct _USBHUB_STATUS_CHANGE_CONTEXT USBHUB_STATUS_CHANGE_CONTEXT
#define USBHUB_FDO_FLAG_DEVICE_FAILED
Definition: usbhub.h:35
@ DelayedWorkQueue
Definition: extypes.h:190
#define EVENT_INCREMENT
Definition: iotypes.h:597

Referenced by USBH_SubmitStatusChangeTransfer().

◆ USBH_ChangeIndicationAckChange()

NTSTATUS NTAPI USBH_ChangeIndicationAckChange ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST Urb,
IN USHORT  Port,
IN USHORT  RequestValue 
)

Definition at line 1657 of file usbhub.c.

1662{
1663 PIO_STACK_LOCATION IoStack;
1665
1666 DPRINT_SCE("USBH_ChangeIndicationAckChange: ... \n");
1667
1668 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
1669 Urb->Hdr.Function = URB_FUNCTION_CLASS_OTHER;
1670 Urb->Hdr.UsbdDeviceHandle = NULL;
1671
1672 Urb->TransferFlags = USBD_SHORT_TRANSFER_OK;
1673 Urb->TransferBufferLength = 0;
1674 Urb->TransferBuffer = NULL;
1675 Urb->TransferBufferMDL = NULL;
1676 Urb->UrbLink = NULL;
1677
1678 RequestType.B = 0;
1679 RequestType.Recipient = BMREQUEST_TO_OTHER;
1682
1683 Urb->RequestTypeReservedBits = RequestType.B;
1684 Urb->Request = USB_REQUEST_CLEAR_FEATURE;
1685 Urb->Index = Port;
1686 Urb->Value = RequestValue;
1687
1689 IoSizeOfIrp(HubExtension->LowerDevice->StackSize),
1690 HubExtension->LowerDevice->StackSize);
1691
1692 IoStack = IoGetNextIrpStackLocation(Irp);
1693
1695 IoStack->Parameters.Others.Argument1 = Urb;
1697
1700 HubExtension,
1701 TRUE,
1702 TRUE,
1703 TRUE);
1704
1705 return IoCallDriver(HubExtension->LowerDevice, Irp);
1706}
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
VOID NTAPI IoInitializeIrp(IN PIRP Irp, IN USHORT PacketSize, IN CCHAR StackSize)
Definition: irp.c:1854
#define IoCallDriver
Definition: irp.c:1225
struct _IO_STACK_LOCATION::@1710::@1711 DeviceIoControl
struct _IO_STACK_LOCATION::@4301::@4340 Others
union _IO_STACK_LOCATION::@1710 Parameters
#define BMREQUEST_CLASS
Definition: usb100.h:35
#define BMREQUEST_TO_OTHER
Definition: usb100.h:41
#define BMREQUEST_HOST_TO_DEVICE
Definition: usb100.h:31
#define USB_REQUEST_CLEAR_FEATURE
Definition: usb100.h:79
#define USBD_SHORT_TRANSFER_OK
Definition: usb.h:154
#define URB_FUNCTION_CLASS_OTHER
Definition: usb.h:117
_In_ PIO_STACK_LOCATION _In_ PURB Urb
Definition: usbdlib.h:267
NTSTATUS NTAPI USBH_ChangeIndicationAckChangeComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: usbhub.c:1618
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define IoSizeOfIrp(_StackSize)

Referenced by USBH_ChangeIndicationProcessChange().

◆ USBH_ChangeIndicationAckChangeComplete()

NTSTATUS NTAPI USBH_ChangeIndicationAckChangeComplete ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 1618 of file usbhub.c.

1621{
1622 PUSBHUB_FDO_EXTENSION HubExtension;
1623 PVOID Event;
1624 USHORT Port;
1625
1626 HubExtension = Context;
1627
1628 DPRINT_SCE("USBH_ChangeIndicationAckChangeComplete: ... \n");
1629
1630 ASSERT(HubExtension->Port > 0);
1631 Port = HubExtension->Port - 1;
1632
1633 HubExtension->PortData[Port].PortStatus = HubExtension->PortStatus;
1634
1636 NULL);
1637
1638 if (Event)
1639 {
1641 }
1642
1643 USBH_SubmitStatusChangeTransfer(HubExtension);
1644
1645 if (!InterlockedDecrement(&HubExtension->ResetRequestCount))
1646 {
1647 KeSetEvent(&HubExtension->ResetEvent,
1649 FALSE);
1650 }
1651
1653}
#define InterlockedDecrement
Definition: armddk.h:52
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
#define ASSERT(a)
Definition: mode.c:44
PUSBHUB_PORT_DATA PortData
Definition: usbhub.h:167
USB_PORT_STATUS_AND_CHANGE PortStatus
Definition: usbhub.h:199
PRKEVENT pResetPortEvent
Definition: usbhub.h:183
USB_PORT_STATUS_AND_CHANGE PortStatus
Definition: usbhub.h:118
NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2457

Referenced by USBH_ChangeIndicationAckChange().

◆ USBH_ChangeIndicationProcessChange()

NTSTATUS NTAPI USBH_ChangeIndicationProcessChange ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 1710 of file usbhub.c.

1713{
1714 PUSBHUB_FDO_EXTENSION HubExtension;
1716 USHORT RequestValue;
1717
1718 HubExtension = Context;
1719
1720 DPRINT_SCE("USBH_ChangeIndicationProcessChange: PortStatus - %lX\n",
1721 HubExtension->PortStatus.AsUlong32);
1722
1723 if ((NT_SUCCESS(Irp->IoStatus.Status) ||
1724 USBD_SUCCESS(HubExtension->SCEWorkerUrb.Hdr.Status)) &&
1727 {
1728 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
1729 {
1730 KeSetEvent(&HubExtension->PendingRequestEvent,
1732 FALSE);
1733 }
1734
1735 USBH_FreeWorkItem(HubExtension->WorkItemToQueue);
1736
1737 HubExtension->WorkItemToQueue = NULL;
1738
1740 {
1741 RequestValue = USBHUB_FEATURE_C_PORT_RESET;
1742 }
1743 else
1744 {
1745 RequestValue = USBHUB_FEATURE_C_PORT_ENABLE;
1746 }
1747
1748 USBH_ChangeIndicationAckChange(HubExtension,
1749 HubExtension->ResetPortIrp,
1750 &HubExtension->SCEWorkerUrb,
1751 HubExtension->Port,
1752 RequestValue);
1753 }
1754 else
1755 {
1756 ASSERT(HubExtension->WorkItemToQueue != NULL);
1757
1758 WorkItem = HubExtension->WorkItemToQueue;
1759 HubExtension->WorkItemToQueue = NULL;
1760
1761 USBH_QueueWorkItem(HubExtension, WorkItem);
1762 }
1763
1765}
LONG PendingRequestCount
Definition: usbhub.h:180
KEVENT PendingRequestEvent
Definition: usbhub.h:181
USHORT PortEnableDisableChange
Definition: usb200.h:164
USHORT ResetChange
Definition: usb200.h:167
USB_20_PORT_CHANGE Usb20PortChange
Definition: usb200.h:231
USB_PORT_CHANGE PortChange
Definition: usb200.h:241
#define USBD_SUCCESS(Status)
Definition: usb.h:167
VOID NTAPI USBH_FreeWorkItem(IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
Definition: usbhub.c:2952
VOID NTAPI USBH_QueueWorkItem(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
Definition: usbhub.c:2932
NTSTATUS NTAPI USBH_ChangeIndicationAckChange(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST *Urb, IN USHORT Port, IN USHORT RequestValue)
Definition: usbhub.c:1657
#define USBHUB_FEATURE_C_PORT_ENABLE
Definition: usbhub.h:99
#define USBHUB_FEATURE_C_PORT_RESET
Definition: usbhub.h:102

Referenced by USBH_ChangeIndicationQueryChange().

◆ USBH_ChangeIndicationQueryChange()

NTSTATUS NTAPI USBH_ChangeIndicationQueryChange ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST Urb,
IN USHORT  Port 
)

Definition at line 1769 of file usbhub.c.

1773{
1776 PIO_STACK_LOCATION IoStack;
1778
1779 DPRINT_SCE("USBH_ChangeIndicationQueryChange: Port - %x\n", Port);
1780
1781 InterlockedIncrement(&HubExtension->PendingRequestCount);
1782
1783 if (!Port)
1784 {
1785 ASSERT(HubExtension->WorkItemToQueue != NULL);
1786
1787 WorkItem = HubExtension->WorkItemToQueue;
1788 HubExtension->WorkItemToQueue = NULL;
1789
1790 USBH_QueueWorkItem(HubExtension, WorkItem);
1791
1792 return STATUS_SUCCESS;
1793 }
1794
1795 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
1796 Urb->Hdr.UsbdDeviceHandle = NULL;
1797 Urb->Hdr.Function = URB_FUNCTION_CLASS_OTHER;
1798
1800 Urb->TransferBuffer = &HubExtension->PortStatus;
1801 Urb->TransferBufferLength = sizeof(HubExtension->PortStatus);
1802 Urb->TransferBufferMDL = NULL;
1803 Urb->UrbLink = NULL;
1804
1805 RequestType.B = 0;
1806 RequestType.Recipient = BMREQUEST_TO_OTHER;
1809
1810 Urb->RequestTypeReservedBits = RequestType.B;
1811 Urb->Request = USB_REQUEST_GET_STATUS;
1812 Urb->Value = 0;
1813 Urb->Index = Port;
1814
1815 HubExtension->Port = Port;
1816
1818 IoSizeOfIrp(HubExtension->LowerDevice->StackSize),
1819 HubExtension->LowerDevice->StackSize);
1820
1821 IoStack = IoGetNextIrpStackLocation(Irp);
1822
1824 IoStack->Parameters.Others.Argument1 = Urb;
1826
1829 HubExtension,
1830 TRUE,
1831 TRUE,
1832 TRUE);
1833
1834 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
1835
1836 return Status;
1837}
#define USB_REQUEST_GET_STATUS
Definition: usb100.h:78
#define BMREQUEST_DEVICE_TO_HOST
Definition: usb100.h:32
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:160
NTSTATUS NTAPI USBH_ChangeIndicationProcessChange(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: usbhub.c:1710

Referenced by USBH_ChangeIndication().

◆ USBH_ChangeIndicationWorker()

VOID NTAPI USBH_ChangeIndicationWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 2159 of file usbhub.c.

2161{
2162 PUSBHUB_FDO_EXTENSION LowerHubExtension;
2163 PUSBHUB_PORT_PDO_EXTENSION LowerPortExtension;
2166 USB_HUB_STATUS_AND_CHANGE HubStatus;
2168 USHORT Port = 0;
2169
2170 DPRINT_SCE("USBH_ChangeIndicationWorker ... \n");
2171
2172 WorkItem = Context;
2173
2174 KeWaitForSingleObject(&HubExtension->HubSemaphore,
2175 Executive,
2176 KernelMode,
2177 FALSE,
2178 NULL);
2179
2180 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING)
2181 {
2182 KeSetEvent(&HubExtension->StatusChangeEvent,
2184 FALSE);
2185
2186 goto Exit;
2187 }
2188
2189 if (!HubExtension->RequestErrors)
2190 {
2191 goto Enum;
2192 }
2193
2194 DPRINT_SCE("USBH_ChangeIndicationWorker: RequestErrors - %x\n",
2195 HubExtension->RequestErrors);
2196
2197 if (HubExtension->LowerPDO == HubExtension->RootHubPdo)
2198 {
2199 goto Enum;
2200 }
2201
2202 LowerPortExtension = HubExtension->LowerPDO->DeviceExtension;
2203
2204 if (LowerPortExtension->PortPdoFlags & USBHUB_PDO_FLAG_POWER_D1_OR_D2)
2205 {
2206 goto Enum;
2207 }
2208
2209 LowerHubExtension = LowerPortExtension->HubExtension;
2210
2211 if (!LowerHubExtension)
2212 {
2213 goto Enum;
2214 }
2215
2216 Status = USBH_SyncGetPortStatus(LowerHubExtension,
2217 LowerPortExtension->PortNumber,
2218 &PortStatus,
2220
2221 if (!NT_SUCCESS(Status) ||
2222 !PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus)
2223 {
2224 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_REMOVED;
2225
2226 KeSetEvent(&HubExtension->StatusChangeEvent,
2228 FALSE);
2229
2230 goto Exit;
2231 }
2232
2233 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_ESD_RECOVERING))
2234 {
2235 HubExtension->HubFlags |= USBHUB_FDO_FLAG_ESD_RECOVERING;
2236
2237 DPRINT("USBH_ChangeIndicationWorker: Starting ESD recovery\n");
2238
2239 /* Initiate ESD recovery: power cycle the hub (D3 -> D0) */
2240 USBH_HubStartESDRecovery(HubExtension);
2241
2242 goto Exit;
2243 }
2244
2245Enum:
2246
2247 if (WorkItem->IsRequestErrors)
2248 {
2249 USBH_ResetHub(HubExtension);
2250 }
2251 else
2252 {
2253 for (Port = 0;
2254 Port < HubExtension->HubDescriptor->bNumberOfPorts;
2255 Port++)
2256 {
2257 if (IsBitSet((PUCHAR)(WorkItem + 1), Port))
2258 {
2259 break;
2260 }
2261 }
2262
2263 if (Port)
2264 {
2265 Status = USBH_SyncGetPortStatus(HubExtension,
2266 Port,
2267 &PortStatus,
2268 sizeof(PortStatus));
2269 }
2270 else
2271 {
2272 Status = USBH_SyncGetHubStatus(HubExtension,
2273 &HubStatus,
2274 sizeof(HubStatus));
2275 }
2276
2277 if (NT_SUCCESS(Status))
2278 {
2279 if (Port)
2280 {
2281 USBH_ProcessPortStateChange(HubExtension,
2282 Port,
2283 &PortStatus);
2284 }
2285 else
2286 {
2287 USBH_ProcessHubStateChange(HubExtension,
2288 &HubStatus);
2289 }
2290 }
2291 else
2292 {
2293 HubExtension->RequestErrors++;
2294
2295 if (HubExtension->RequestErrors > USBHUB_MAX_REQUEST_ERRORS)
2296 {
2297 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_FAILED;
2298 goto Exit;
2299 }
2300 }
2301 }
2302
2303 USBH_SubmitStatusChangeTransfer(HubExtension);
2304
2305Exit:
2306
2307 KeReleaseSemaphore(&HubExtension->HubSemaphore,
2309 1,
2310 FALSE);
2311
2312 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
2313 {
2314 KeSetEvent(&HubExtension->PendingRequestEvent,
2316 FALSE);
2317 }
2318
2319 if (!InterlockedDecrement((PLONG)&HubExtension->ResetRequestCount))
2320 {
2321 KeSetEvent(&HubExtension->ResetEvent,
2323 FALSE);
2324
2325 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEFER_CHECK_IDLE)
2326 {
2327 USBH_CheckHubIdle(HubExtension);
2328 }
2329 }
2330}
MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR *DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey)
Definition: mmixer.c:220
NTSTATUS NTAPI USBH_HubStartESDRecovery(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:162
_Outptr_ PUSB_DEVICE_HANDLE _In_ PUSB_DEVICE_HANDLE _In_ USHORT PortStatus
Definition: hubbusif.h:42
#define LOW_REALTIME_PRIORITY
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
Definition: semphobj.c:54
static void Exit(void)
Definition: sock.c:1330
PUSBHUB_FDO_EXTENSION HubExtension
Definition: usbhub.h:209
int32_t * PLONG
Definition: typedefs.h:58
unsigned char * PUCHAR
Definition: typedefs.h:53
VOID NTAPI USBH_CheckHubIdle(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3823
NTSTATUS NTAPI USBH_SyncGetPortStatus(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN PUSB_PORT_STATUS_AND_CHANGE PortStatus, IN ULONG Length)
Definition: usbhub.c:1414
NTSTATUS NTAPI USBH_SyncGetHubStatus(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_HUB_STATUS_AND_CHANGE HubStatus, IN ULONG Length)
Definition: usbhub.c:1363
VOID NTAPI USBH_ProcessHubStateChange(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_HUB_STATUS_AND_CHANGE HubStatus)
Definition: usbhub.c:1841
VOID NTAPI USBH_ProcessPortStateChange(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN PUSB_PORT_STATUS_AND_CHANGE PortStatus)
Definition: usbhub.c:1875
NTSTATUS NTAPI USBH_ResetHub(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2130
#define USBHUB_FDO_FLAG_ESD_RECOVERING
Definition: usbhub.h:41
#define USBHUB_PDO_FLAG_POWER_D1_OR_D2
Definition: usbhub.h:74
#define USBHUB_FDO_FLAG_DEVICE_REMOVED
Definition: usbhub.h:46
#define USBHUB_FDO_FLAG_DEFER_CHECK_IDLE
Definition: usbhub.h:48

Referenced by USBH_ChangeIndication().

◆ USBH_CheckDeviceIDUnique()

BOOLEAN NTAPI USBH_CheckDeviceIDUnique ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  idVendor,
IN USHORT  idProduct,
IN PVOID  SerialNumber,
IN USHORT  SN_DescriptorLength 
)

Definition at line 4182 of file usbhub.c.

4187{
4188 PDEVICE_OBJECT PortDevice;
4189 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4190 ULONG Port;
4191 SIZE_T NumberBytes;
4192
4193 DPRINT("USBH_CheckDeviceIDUnique: idVendor - 0x%04X, idProduct - 0x%04X\n",
4194 idVendor,
4195 idProduct);
4196
4197 if (!HubExtension->HubDescriptor->bNumberOfPorts)
4198 {
4199 return TRUE;
4200 }
4201
4202 for (Port = 0; Port < HubExtension->HubDescriptor->bNumberOfPorts; Port++)
4203 {
4204 PortDevice = HubExtension->PortData[Port].DeviceObject;
4205
4206 if (PortDevice)
4207 {
4208 PortExtension = PortDevice->DeviceExtension;
4209
4210 if (PortExtension->DeviceDescriptor.idVendor == idVendor &&
4211 PortExtension->DeviceDescriptor.idProduct == idProduct &&
4212 PortExtension->SN_DescriptorLength == SN_DescriptorLength)
4213 {
4214 if (PortExtension->SerialNumber)
4215 {
4216 NumberBytes = RtlCompareMemory(PortExtension->SerialNumber,
4218 SN_DescriptorLength);
4219
4220 if (NumberBytes == SN_DescriptorLength)
4221 {
4222 return FALSE;
4223 }
4224 }
4225 }
4226 }
4227 }
4228
4229 return TRUE;
4230}
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
ULONG SerialNumber
Definition: rxce.c:117
PVOID DeviceExtension
Definition: env_spec_w32.h:418
USB_DEVICE_DESCRIPTOR DeviceDescriptor
Definition: usbhub.h:216

Referenced by USBH_CreateDevice().

◆ USBH_CheckDeviceLanguage()

NTSTATUS NTAPI USBH_CheckDeviceLanguage ( IN PDEVICE_OBJECT  DeviceObject,
IN USHORT  LanguageId 
)

Definition at line 4257 of file usbhub.c.

4259{
4262 ULONG NumSymbols;
4263 ULONG ix;
4264 PWCHAR pSymbol;
4265 ULONG Length;
4266
4267 DPRINT("USBH_CheckDeviceLanguage: LanguageId - 0x%04X\n", LanguageId);
4268
4271 USB_HUB_TAG);
4272
4273 if (!Descriptor)
4274 {
4276 }
4277
4279
4281 0,
4282 0,
4283 Descriptor,
4285 &Length,
4286 TRUE);
4287
4288 if (!NT_SUCCESS(Status) ||
4289 Length < sizeof(USB_COMMON_DESCRIPTOR))
4290 {
4291 goto Exit;
4292 }
4293
4294 NumSymbols = (Length -
4295 FIELD_OFFSET(USB_STRING_DESCRIPTOR, bString)) / sizeof(WCHAR);
4296
4297 pSymbol = Descriptor->bString;
4298
4299 for (ix = 1; ix < NumSymbols; ix++)
4300 {
4301 if (*pSymbol == (WCHAR)LanguageId)
4302 {
4304 goto Exit;
4305 }
4306
4307 pSymbol++;
4308 }
4309
4311
4312Exit:
4314 return Status;
4315}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint16_t * PWCHAR
Definition: typedefs.h:56
#define MAXIMUM_USB_STRING_LENGTH
Definition: usb100.h:43
NTSTATUS NTAPI USBH_SyncGetStringDescriptor(IN PDEVICE_OBJECT DeviceObject, IN UCHAR Index, IN USHORT LanguageId, IN PUSB_STRING_DESCRIPTOR Descriptor, IN ULONG NumberOfBytes, IN PULONG OutLength, IN BOOLEAN IsValidateLength)
Definition: usbhub.c:1248
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by USBH_GetSerialNumberString(), and USBH_PdoQueryDeviceText().

◆ USBH_CheckHubIdle()

VOID NTAPI USBH_CheckHubIdle ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3823 of file usbhub.c.

3824{
3825 PDEVICE_OBJECT PdoDevice;
3826 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3827 PUSBHUB_PORT_DATA PortData;
3828 ULONG HubFlags;
3829 ULONG Port;
3830 KIRQL Irql;
3831 BOOLEAN IsHubIdle = FALSE;
3832 BOOLEAN IsAllPortsIdle;
3833 BOOLEAN IsHubCheck = TRUE;
3834
3835 DPRINT("USBH_CheckHubIdle: FIXME !!! HubExtension - %p\n", HubExtension);
3836
3837return; //HACK: delete it line after fixing Power Manager!!!
3838
3839 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3840
3841 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_CHECK_IDLE_LOCK)
3842 {
3843 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3844 return;
3845 }
3846
3847 HubExtension->HubFlags |= USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3848 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3849
3850 if (USBH_GetRootHubExtension(HubExtension)->SystemPowerState.SystemState != PowerSystemWorking)
3851 {
3852 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3853 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3854 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3855 return;
3856 }
3857
3858 HubFlags = HubExtension->HubFlags;
3859 DPRINT("USBH_CheckHubIdle: HubFlags - %lX\n", HubFlags);
3860
3861 if (!(HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED) ||
3862 !(HubFlags & USBHUB_FDO_FLAG_DO_ENUMERATION))
3863 {
3864 goto Exit;
3865 }
3866
3867 if (HubFlags & USBHUB_FDO_FLAG_NOT_ENUMERATED ||
3869 HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED ||
3871 HubFlags & USBHUB_FDO_FLAG_DEVICE_REMOVED ||
3872 HubFlags & USBHUB_FDO_FLAG_STATE_CHANGING ||
3873 HubFlags & USBHUB_FDO_FLAG_WAKEUP_START ||
3875 {
3876 goto Exit;
3877 }
3878
3879 if (HubExtension->ResetRequestCount)
3880 {
3881 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEFER_CHECK_IDLE;
3882 goto Exit;
3883 }
3884
3885 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DEFER_CHECK_IDLE;
3886
3887 InterlockedIncrement(&HubExtension->PendingRequestCount);
3888
3889 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
3890 Executive,
3891 KernelMode,
3892 FALSE,
3893 NULL);
3894
3896
3897 IsAllPortsIdle = TRUE;
3898
3899 PortData = HubExtension->PortData;
3900
3901 for (Port = 0;
3902 Port < HubExtension->HubDescriptor->bNumberOfPorts;
3903 Port++)
3904 {
3905 PdoDevice = PortData[Port].DeviceObject;
3906
3907 if (PdoDevice)
3908 {
3909 PortExtension = PdoDevice->DeviceExtension;
3910
3911 if (!PortExtension->IdleNotificationIrp)
3912 {
3913 DPRINT("USBH_CheckHubIdle: PortExtension - %p\n",
3914 PortExtension);
3915
3916 IsAllPortsIdle = FALSE;
3917 IsHubCheck = FALSE;
3918
3919 break;
3920 }
3921 }
3922 }
3923
3924 if (IsHubCheck &&
3925 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST))
3926 {
3927 KeClearEvent(&HubExtension->IdleEvent);
3928 HubExtension->HubFlags |= USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3929 IsHubIdle = TRUE;
3930 }
3931
3933
3934 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
3936 1,
3937 FALSE);
3938
3939 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3940 {
3941 KeSetEvent(&HubExtension->PendingRequestEvent,
3943 FALSE);
3944 }
3945
3946 DPRINT("USBH_CheckHubIdle: IsAllPortsIdle - %x, IsHubIdle - %x\n",
3947 IsAllPortsIdle,
3948 IsHubIdle);
3949
3950 if (IsAllPortsIdle && IsHubIdle)
3951 {
3952 USBH_FdoSubmitIdleRequestIrp(HubExtension);
3953 }
3954
3955Exit:
3956 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3957 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3958 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3959}
_Out_ PKIRQL Irql
Definition: csq.h:179
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
Definition: util.c:150
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
Definition: util.c:56
@ PowerSystemWorking
Definition: ntpoapi.h:36
PDEVICE_OBJECT DeviceObject
Definition: usbhub.h:119
PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:699
NTSTATUS NTAPI USBH_FdoSubmitIdleRequestIrp(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3737
#define USBHUB_FDO_FLAG_DEVICE_STARTED
Definition: usbhub.h:33
#define USBHUB_FDO_FLAG_STATE_CHANGING
Definition: usbhub.h:45
#define USBHUB_FDO_FLAG_CHECK_IDLE_LOCK
Definition: usbhub.h:53
#define USBHUB_FDO_FLAG_ENUM_POST_RECOVER
Definition: usbhub.h:51
#define USBHUB_FDO_FLAG_DO_ENUMERATION
Definition: usbhub.h:52
#define USBHUB_FDO_FLAG_WAKEUP_START
Definition: usbhub.h:49
#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST
Definition: usbhub.h:44
#define USBHUB_FDO_FLAG_NOT_ENUMERATED
Definition: usbhub.h:55
_In_ SYSTEM_POWER_STATE SystemPowerState
Definition: iotypes.h:7522

Referenced by USBH_ChangeIndicationWorker(), USBH_CheckIdleWorker(), and USBH_DeviceControl().

◆ USBH_CheckIdleAbort()

BOOLEAN NTAPI USBH_CheckIdleAbort ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN BOOLEAN  IsWait,
IN BOOLEAN  IsExtCheck 
)

Definition at line 3236 of file usbhub.c.

3239{
3240 PDEVICE_OBJECT PdoDevice;
3241 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3242 PUSBHUB_PORT_DATA PortData;
3243 ULONG Port;
3245
3246 DPRINT("USBH_CheckIdleAbort: ... \n");
3247
3248 InterlockedIncrement(&HubExtension->PendingRequestCount);
3249
3250 if (IsWait == TRUE)
3251 {
3252 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
3253 Executive,
3254 KernelMode,
3255 FALSE,
3256 NULL);
3257 }
3258
3259 PortData = HubExtension->PortData;
3260
3261 for (Port = 0; Port < HubExtension->HubDescriptor->bNumberOfPorts; Port++)
3262 {
3263 PdoDevice = PortData[Port].DeviceObject;
3264
3265 if (PdoDevice)
3266 {
3267 PortExtension = PdoDevice->DeviceExtension;
3268
3269 if (PortExtension->PoRequestCounter)
3270 {
3271 Result = TRUE;
3272 goto Wait;
3273 }
3274 }
3275 }
3276
3277 if (IsExtCheck == TRUE)
3278 {
3279 PortData = HubExtension->PortData;
3280
3281 for (Port = 0;
3282 Port < HubExtension->HubDescriptor->bNumberOfPorts;
3283 Port++)
3284 {
3285 PdoDevice = PortData[Port].DeviceObject;
3286
3287 if (PdoDevice)
3288 {
3289 PortExtension = PdoDevice->DeviceExtension;
3290 InterlockedExchange(&PortExtension->StateBehindD2, 0);
3291 }
3292 }
3293 }
3294
3295Wait:
3296
3297 if (IsWait == TRUE)
3298 {
3299 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
3301 1,
3302 FALSE);
3303 }
3304
3305 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3306 {
3307 KeSetEvent(&HubExtension->PendingRequestEvent,
3309 FALSE);
3310 }
3311
3312 return Result;
3313}
#define InterlockedExchange
Definition: armddk.h:54
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170
_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
Definition: wsk.h:409

Referenced by USBH_FdoIdleNotificationCallback(), and USBH_FdoPower().

◆ USBH_CheckIdleDeferred()

VOID NTAPI USBH_CheckIdleDeferred ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3972 of file usbhub.c.

3973{
3974 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
3976
3977 DPRINT("USBH_CheckIdleDeferred: HubExtension - %p\n", HubExtension);
3978
3979 Status = USBH_AllocateWorkItem(HubExtension,
3980 &HubIoWorkItem,
3982 0,
3983 NULL,
3985
3986 DPRINT("USBH_CheckIdleDeferred: HubIoWorkItem - %p\n", HubIoWorkItem);
3987
3988 if (NT_SUCCESS(Status))
3989 {
3990 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3991 }
3992}
VOID NTAPI USBH_CheckIdleWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:3963

Referenced by USBH_FdoDeferPoRequestCompletion(), USBH_FdoPnP(), USBH_FdoPower(), USBH_PdoRemoveDevice(), and USBH_PortIdleNotificationRequest().

◆ USBH_CheckIdleWorker()

VOID NTAPI USBH_CheckIdleWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 3963 of file usbhub.c.

3965{
3966 DPRINT("USBH_CheckIdleWorker: ... \n");
3967 USBH_CheckHubIdle(HubExtension);
3968}

Referenced by USBH_CheckIdleDeferred().

◆ USBH_CompleteIrp()

◆ USBH_CompletePortIdleIrpsWorker()

VOID NTAPI USBH_CompletePortIdleIrpsWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 3591 of file usbhub.c.

3593{
3594 PUSBHUB_IDLE_PORT_CONTEXT IdlePortContext;
3595 NTSTATUS NtStatus;
3597 BOOLEAN IsFlush = FALSE;
3598
3599 DPRINT("USBH_CompletePortIdleIrpsWorker ... \n");
3600
3601 IdlePortContext = Context;
3602 NtStatus = IdlePortContext->Status;
3603
3605 &IdlePortContext->PwrList,
3606 NtStatus);
3607
3608 DPRINT1("USBH_CompletePortIdleIrpsWorker: USBH_RegQueryFlushPortPowerIrpsFlag() UNIMPLEMENTED. FIXME\n");
3609 Status = STATUS_NOT_IMPLEMENTED;// USBH_RegQueryFlushPortPowerIrpsFlag(&IsFlush);
3610
3611 if (NT_SUCCESS(Status))
3612 {
3613 if (IsFlush)
3614 {
3615 USBH_FlushPortPwrList(HubExtension);
3616 }
3617 }
3618}
VOID NTAPI USBH_FlushPortPwrList(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3140
VOID NTAPI USBH_HubCompleteQueuedPortIdleIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY IdleList, IN NTSTATUS NtStatus)
Definition: usbhub.c:3125

Referenced by USBH_FdoIdleNotificationRequestComplete().

◆ USBH_CreateDevice()

NTSTATUS NTAPI USBH_CreateDevice ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN USB_PORT_STATUS  UsbPortStatus,
IN ULONG  IsWait 
)

Definition at line 4394 of file usbhub.c.

4398{
4399 ULONG PdoNumber = 0;
4400 WCHAR CharDeviceName[64];
4403 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4405 LPWSTR SerialNumberBuffer;
4406 BOOLEAN IsHsDevice;
4407 BOOLEAN IsLsDevice;
4408 BOOLEAN IgnoringHwSerial = FALSE;
4411
4412 DPRINT("USBH_CreateDevice: Port - %x, UsbPortStatus - %lX\n",
4413 Port,
4414 UsbPortStatus.AsUshort16);
4415
4416 do
4417 {
4418 RtlStringCbPrintfW(CharDeviceName,
4419 sizeof(CharDeviceName),
4420 L"\\Device\\USBPDO-%d",
4421 PdoNumber);
4422
4423 RtlInitUnicodeString(&DeviceName, CharDeviceName);
4424
4425 Status = IoCreateDevice(HubExtension->Common.SelfDevice->DriverObject,
4427 &DeviceName,
4429 0,
4430 FALSE,
4431 &DeviceObject);
4432
4433 ++PdoNumber;
4434 }
4436
4437 if (!NT_SUCCESS(Status))
4438 {
4439 ASSERT(Port > 0);
4440 HubExtension->PortData[Port-1].DeviceObject = DeviceObject;
4441 return Status;
4442 }
4443
4444 DeviceObject->StackSize = HubExtension->RootHubPdo2->StackSize;
4445
4446 PortExtension = DeviceObject->DeviceExtension;
4447
4448 DPRINT("USBH_CreateDevice: PortDevice - %p, <%wZ>\n", DeviceObject, &DeviceName);
4449 DPRINT("USBH_CreateDevice: PortExtension - %p\n", PortExtension);
4450
4451 RtlZeroMemory(PortExtension, sizeof(USBHUB_PORT_PDO_EXTENSION));
4452
4454 PortExtension->Common.SelfDevice = DeviceObject;
4455
4456 PortExtension->HubExtension = HubExtension;
4457 PortExtension->RootHubExtension = HubExtension;
4458
4459 PortExtension->PortNumber = Port;
4461 PortExtension->IgnoringHwSerial = FALSE;
4462
4464
4465 InitializeListHead(&PortExtension->PortPowerList);
4467
4468 PortExtension->PoRequestCounter = 0;
4469 PortExtension->PendingSystemPoRequest = 0;
4470 PortExtension->PendingDevicePoRequest = 0;
4471 PortExtension->StateBehindD2 = 0;
4472
4473 SerialNumberBuffer = NULL;
4474
4475 IsHsDevice = UsbPortStatus.Usb20PortStatus.HighSpeedDeviceAttached;
4476 IsLsDevice = UsbPortStatus.Usb20PortStatus.LowSpeedDeviceAttached;
4477
4478 if (IsLsDevice == 0)
4479 {
4480 if (IsHsDevice)
4481 {
4483 }
4484 }
4485 else
4486 {
4488 }
4489
4490 /* Initialize PortExtension->InstanceID */
4494
4496 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
4497
4498 if (!NT_SUCCESS(Status))
4499 {
4500 DPRINT1("USBH_CreateDevice: IoCreateDevice() failed - %lX\n", Status);
4501 goto ErrorExit;
4502 }
4503
4504 Status = USBD_CreateDeviceEx(HubExtension,
4505 &PortExtension->DeviceHandle,
4506 UsbPortStatus,
4507 Port);
4508
4509 if (!NT_SUCCESS(Status))
4510 {
4511 DPRINT1("USBH_CreateDevice: USBD_CreateDeviceEx() failed - %lX\n", Status);
4512 goto ErrorExit;
4513 }
4514
4515 Status = USBH_SyncResetPort(HubExtension, Port);
4516
4517 if (!NT_SUCCESS(Status))
4518 {
4519 DPRINT1("USBH_CreateDevice: USBH_SyncResetPort() failed - %lX\n", Status);
4520 goto ErrorExit;
4521 }
4522
4523 if (IsWait)
4524 {
4525 USBH_Wait(50);
4526 }
4527
4528 Status = USBD_InitializeDeviceEx(HubExtension,
4529 PortExtension->DeviceHandle,
4530 (PUCHAR)&PortExtension->DeviceDescriptor,
4531 sizeof(USB_DEVICE_DESCRIPTOR),
4532 (PUCHAR)&PortExtension->ConfigDescriptor,
4534
4535 if (!NT_SUCCESS(Status))
4536 {
4537 DPRINT1("USBH_CreateDevice: USBD_InitializeDeviceEx() failed - %lX\n", Status);
4538 PortExtension->DeviceHandle = NULL;
4539 goto ErrorExit;
4540 }
4541
4542 DPRINT1("USBH_RegQueryDeviceIgnoreHWSerNumFlag UNIMPLEMENTED. FIXME\n");
4543 //Status = USBH_RegQueryDeviceIgnoreHWSerNumFlag(PortExtension->DeviceDescriptor.idVendor,
4544 // PortExtension->DeviceDescriptor.idProduct,
4545 // &IgnoringHwSerial);
4546
4547 if (TRUE)//Status == STATUS_OBJECT_NAME_NOT_FOUND)
4548 {
4549 IgnoringHwSerial = FALSE;
4550 }
4551
4552 if (IgnoringHwSerial)
4553 {
4554 PortExtension->IgnoringHwSerial = TRUE;
4555 }
4556
4557 if (PortExtension->DeviceDescriptor.iSerialNumber &&
4558 !PortExtension->IgnoringHwSerial)
4559 {
4561
4563 &SerialNumberBuffer,
4564 &PortExtension->SN_DescriptorLength,
4566 PortExtension->DeviceDescriptor.iSerialNumber);
4567
4568 if (SerialNumberBuffer)
4569 {
4570 if (!USBH_ValidateSerialNumberString((PUSHORT)SerialNumberBuffer))
4571 {
4572 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4573 SerialNumberBuffer = NULL;
4574 }
4575
4576 if (SerialNumberBuffer &&
4577 !USBH_CheckDeviceIDUnique(HubExtension,
4578 PortExtension->DeviceDescriptor.idVendor,
4579 PortExtension->DeviceDescriptor.idProduct,
4580 SerialNumberBuffer,
4581 PortExtension->SN_DescriptorLength))
4582 {
4583 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4584 SerialNumberBuffer = NULL;
4585 }
4586 }
4587
4589 SerialNumberBuffer);
4590 }
4591
4592 Status = USBH_ProcessDeviceInformation(PortExtension);
4593
4594 USBH_PdoSetCapabilities(PortExtension);
4595
4596 if (NT_SUCCESS(Status))
4597 {
4598 goto Exit;
4599 }
4600
4601ErrorExit:
4602
4604
4606 NULL);
4607
4608 if (DeviceHandle)
4609 {
4610 USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
4611 }
4612
4613 SerialNumberBuffer = InterlockedExchangePointer((PVOID)&PortExtension->SerialNumber,
4614 NULL);
4615
4616 if (SerialNumberBuffer)
4617 {
4618 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4619 }
4620
4621Exit:
4622
4623 ASSERT(Port > 0);
4624 HubExtension->PortData[Port-1].DeviceObject = DeviceObject;
4625 return Status;
4626}
#define L(x)
Definition: resources.c:13
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
_Out_ _Inout_ POEM_STRING DestinationString
Definition: rtlfuncs.h:1956
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
@ PowerDeviceD0
Definition: ntpoapi.h:49
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
unsigned short MaximumLength
Definition: sprintf.c:452
LIST_ENTRY PortPowerList
Definition: usbhub.h:233
KSPIN_LOCK PortPowerListSpinLock
Definition: usbhub.h:234
PUSB_DEVICE_HANDLE DeviceHandle
Definition: usbhub.h:211
COMMON_DEVICE_EXTENSION Common
Definition: usbhub.h:204
PUSBHUB_FDO_EXTENSION RootHubExtension
Definition: usbhub.h:210
USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
Definition: usbhub.h:218
KSPIN_LOCK PortTimeoutSpinLock
Definition: usbhub.h:226
POWER_STATE CurrentPowerState
Definition: usbhub.h:222
static VOID ErrorExit(LPTSTR lpszMessage)
Definition: telnetd.c:647
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint16_t * PUSHORT
Definition: typedefs.h:56
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
DEVICE_POWER_STATE DeviceState
Definition: ntpoapi.h:58
VOID NTAPI USBH_PdoSetCapabilities(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension)
Definition: usbhub.c:3996
NTSTATUS NTAPI USBD_RemoveDeviceEx(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, IN ULONG Flags)
Definition: usbhub.c:2553
NTSTATUS NTAPI USBH_ProcessDeviceInformation(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension)
Definition: usbhub.c:4071
NTSTATUS NTAPI USBH_Wait(IN ULONG Milliseconds)
Definition: usbhub.c:23
NTSTATUS NTAPI USBD_InitializeDeviceEx(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, IN PUCHAR DeviceDescriptorBuffer, IN ULONG DeviceDescriptorBufferLength, IN PUCHAR ConfigDescriptorBuffer, IN ULONG ConfigDescriptorBufferLength)
Definition: usbhub.c:2577
BOOLEAN NTAPI USBH_ValidateSerialNumberString(IN PUSHORT SerialNumberString)
Definition: usbhub.c:4234
NTSTATUS NTAPI USBD_CreateDeviceEx(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE *OutDeviceHandle, IN USB_PORT_STATUS UsbPortStatus, IN USHORT Port)
Definition: usbhub.c:2523
NTSTATUS NTAPI USBH_SyncResetPort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port)
Definition: usbhub.c:471
BOOLEAN NTAPI USBH_CheckDeviceIDUnique(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT idVendor, IN USHORT idProduct, IN PVOID SerialNumber, IN USHORT SN_DescriptorLength)
Definition: usbhub.c:4182
NTSTATUS NTAPI USBH_GetSerialNumberString(IN PDEVICE_OBJECT DeviceObject, IN LPWSTR *OutSerialNumber, IN PUSHORT OutDescriptorLength, IN USHORT LanguageId, IN UCHAR Index)
Definition: usbhub.c:4319
#define USBHUB_PDO_FLAG_PORT_HIGH_SPEED
Definition: usbhub.h:81
#define USBHUB_PDO_FLAG_PORT_LOW_SPEED
Definition: usbhub.h:64
#define USBH_EXTENSION_TYPE_PORT
Definition: usbhub.h:29
#define USBHUB_PDO_FLAG_INIT_PORT_FAILED
Definition: usbhub.h:63
#define FILE_DEVICE_USB
Definition: usbiodef.h:71
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by USBH_FdoQueryBusRelations().

◆ USBH_DriverUnload()

VOID NTAPI USBH_DriverUnload ( IN PDRIVER_OBJECT  DriverObject)

Definition at line 5036 of file usbhub.c.

5037{
5038 DPRINT("USBH_DriverUnload: UNIMPLEMENTED\n");
5039
5041 {
5044 }
5045}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352

Referenced by DriverEntry().

◆ USBH_EnableParentPort()

NTSTATUS NTAPI USBH_EnableParentPort ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2045 of file usbhub.c.

2046{
2047 PIRP Irp;
2049 KEVENT Event;
2051
2052 DPRINT("USBH_EnableParentPort ... \n");
2053
2055
2057 HubExtension->LowerDevice,
2058 NULL,
2059 0,
2060 NULL,
2061 0,
2062 TRUE,
2063 &Event,
2064 &IoStatusBlock);
2065
2066 if (!Irp)
2067 {
2069 }
2070
2071 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
2072
2073 if (Status == STATUS_PENDING)
2074 {
2076 Suspended,
2077 KernelMode,
2078 FALSE,
2079 NULL);
2080 }
2081 else
2082 {
2084 }
2085
2086 return IoStatusBlock.Status;
2087}
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
@ NotificationEvent
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:881
#define STATUS_PENDING
Definition: telnetd.h:14
#define IOCTL_INTERNAL_USB_ENABLE_PORT
Definition: usbioctl.h:47
@ Suspended
Definition: ketypes.h:472

Referenced by USBH_ResetHub().

◆ USBH_FdoDispatch()

NTSTATUS NTAPI USBH_FdoDispatch ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp 
)

Definition at line 4911 of file usbhub.c.

4913{
4914 PIO_STACK_LOCATION IoStack;
4917
4919
4920 DPRINT("USBH_FdoDispatch: HubExtension - %p, Irp - %p, MajorFunction - %X\n",
4921 HubExtension,
4922 Irp,
4923 IoStack->MajorFunction);
4924
4925 MajorFunction = IoStack->MajorFunction;
4926
4927 switch (MajorFunction)
4928 {
4929 case IRP_MJ_CREATE:
4930 case IRP_MJ_CLOSE:
4933 break;
4934
4936 Status = USBH_DeviceControl(HubExtension, Irp);
4937 break;
4938
4939 case IRP_MJ_PNP:
4940 Status = USBH_FdoPnP(HubExtension, Irp, IoStack->MinorFunction);
4941 break;
4942
4943 case IRP_MJ_POWER:
4944 Status = USBH_FdoPower(HubExtension, Irp, IoStack->MinorFunction);
4945 break;
4946
4948 DPRINT1("USBH_FdoDispatch: USBH_SystemControl() UNIMPLEMENTED. FIXME\n");
4949 /* fall through */
4950
4952 default:
4953 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
4954 break;
4955 }
4956
4957 return Status;
4958}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
NTSTATUS NTAPI USBH_DeviceControl(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:1136
NTSTATUS NTAPI USBH_FdoPnP(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
Definition: pnp.c:2362
NTSTATUS NTAPI USBH_FdoPower(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
Definition: power.c:551
VOID NTAPI USBH_CompleteIrp(IN PIRP Irp, IN NTSTATUS CompleteStatus)
Definition: usbhub.c:63
NTSTATUS NTAPI USBH_PassIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: usbhub.c:79
_In_ UCHAR MajorFunction
Definition: wdfdevice.h:1703
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by USBH_HubDispatch().

◆ USBH_FdoIdleNotificationCallback()

VOID NTAPI USBH_FdoIdleNotificationCallback ( IN PVOID  Context)

Definition at line 3380 of file usbhub.c.

3381{
3382 PUSBHUB_FDO_EXTENSION HubExtension;
3383 PUSBHUB_PORT_DATA PortData;
3384 PDEVICE_OBJECT PortDevice;
3385 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3386 PIRP Irp = NULL;
3387 PIRP IdleIrp;
3389 KEVENT Event;
3390 ULONG Port;
3391 PIO_STACK_LOCATION IoStack;
3392 PUSB_IDLE_CALLBACK_INFO CallbackInfo;
3393 BOOLEAN IsReady;
3394 KIRQL OldIrql;
3396
3397 HubExtension = Context;
3398
3399 DPRINT("USBH_FdoIdleNotificationCallback: HubExtension - %p, HubFlags - %lX\n",
3400 HubExtension,
3401 HubExtension->HubFlags);
3402
3403 if (HubExtension->HubFlags & (USBHUB_FDO_FLAG_ENUM_POST_RECOVER |
3410 {
3411 DbgBreakPoint();
3412 return;
3413 }
3414
3415 HubExtension->HubFlags |= USBHUB_FDO_FLAG_GOING_IDLE;
3416
3417 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP))
3418 {
3419 Status = USBH_FdoSubmitWaitWakeIrp(HubExtension);
3420
3421 if (Status != STATUS_PENDING)
3422 {
3423 DPRINT("Status != STATUS_PENDING. DbgBreakPoint()\n");
3424 DbgBreakPoint();
3425 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_GOING_IDLE;
3426 return;
3427 }
3428 }
3429
3431
3433 Executive,
3434 KernelMode,
3435 FALSE,
3436 NULL);
3437
3438 PortData = HubExtension->PortData;
3439 IsReady = TRUE;
3440
3441 for (Port = 0;
3442 Port < HubExtension->HubDescriptor->bNumberOfPorts;
3443 Port++)
3444 {
3445 PortDevice = PortData[Port].DeviceObject;
3446
3447 if (PortDevice)
3448 {
3449 PortExtension = PortDevice->DeviceExtension;
3450
3451 IdleIrp = PortExtension->IdleNotificationIrp;
3452
3453 if (!IdleIrp)
3454 {
3455 IsReady = FALSE;
3456 goto IdleHub;
3457 }
3458
3459 IoStack = IoGetCurrentIrpStackLocation(IdleIrp);
3460
3461 CallbackInfo = IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
3462
3463 if (!CallbackInfo)
3464 {
3465 IsReady = FALSE;
3466 goto IdleHub;
3467 }
3468
3469 if (!CallbackInfo->IdleCallback)
3470 {
3471 IsReady = FALSE;
3472 goto IdleHub;
3473 }
3474
3475 if (PortExtension->PendingSystemPoRequest)
3476 {
3477 IsReady = FALSE;
3478 goto IdleHub;
3479 }
3480
3481 if (InterlockedCompareExchange(&PortExtension->StateBehindD2,
3482 1,
3483 0))
3484 {
3485 IsReady = FALSE;
3486 goto IdleHub;
3487 }
3488
3489 DPRINT("USBH_FdoIdleNotificationCallback: IdleContext - %p\n",
3490 CallbackInfo->IdleContext);
3491
3492 CallbackInfo->IdleCallback(CallbackInfo->IdleContext);
3493
3494 if (PortExtension->CurrentPowerState.DeviceState == PowerDeviceD0)
3495 {
3496 IsReady = FALSE;
3497 goto IdleHub;
3498 }
3499 }
3500 }
3501
3502 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING) &&
3503 (USBH_CheckIdleAbort(HubExtension, FALSE, FALSE) == TRUE))
3504 {
3505 IsReady = FALSE;
3506 }
3507
3508IdleHub:
3509
3512 1,
3513 FALSE);
3514
3515 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3516 {
3517 KeSetEvent(&HubExtension->PendingRequestEvent,
3519 FALSE);
3520 }
3521
3522 if (!IsReady ||
3524 {
3525 DPRINT1("USBH_FdoIdleNotificationCallback: HubFlags - %lX\n",
3526 HubExtension->HubFlags);
3527
3528 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_DEVICE_SUSPENDED |
3530
3531 /* Aborting Idle for Hub */
3533
3534 if (HubExtension->PendingIdleIrp)
3535 {
3536 Irp = HubExtension->PendingIdleIrp;
3537 HubExtension->PendingIdleIrp = NULL;
3538 }
3539
3541
3542 if (Irp)
3543 {
3544 USBH_HubCancelIdleIrp(HubExtension, Irp);
3545 }
3546
3547 DbgBreakPoint();
3549 }
3550 else
3551 {
3552 PowerState.DeviceState = HubExtension->DeviceWake;
3553
3554 KeWaitForSingleObject(&HubExtension->IdleSemaphore,
3555 Executive,
3556 KernelMode,
3557 FALSE,
3558 NULL);
3559
3560 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_GOING_IDLE;
3561 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DO_SUSPENSE;
3562
3564
3565 DPRINT("USBH_FdoIdleNotificationCallback: LowerPdo - %p\n",
3566 HubExtension->LowerPDO);
3567
3568 DPRINT("USBH_FdoIdleNotificationCallback: PowerState.DeviceState - %x\n",
3569 PowerState.DeviceState);
3570
3571 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
3573 PowerState,
3575 &Event,
3576 NULL);
3577
3578 if (Status == STATUS_PENDING)
3579 {
3581 Executive,
3582 KernelMode,
3583 FALSE,
3584 NULL);
3585 }
3586 }
3587}
NTSYSAPI void WINAPI DbgBreakPoint(void)
#define InterlockedCompareExchange
Definition: interlocked.h:119
NTSTATUS NTAPI PoRequestPowerIrp(_In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR MinorFunction, _In_ POWER_STATE PowerState, _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction, _In_opt_ __drv_aliasesMem PVOID Context, _Outptr_opt_ PIRP *pIrp)
Definition: power.c:659
KSEMAPHORE ResetDeviceSemaphore
Definition: usbhub.h:182
DEVICE_POWER_STATE DeviceWake
Definition: usbhub.h:159
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
VOID NTAPI USBH_HubCompletePortIdleIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
Definition: usbhub.c:3200
VOID NTAPI USBH_HubCancelIdleIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP IdleIrp)
Definition: usbhub.c:3221
VOID NTAPI USBH_HubSetDWakeCompletion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: usbhub.c:3055
NTSTATUS NTAPI USBH_FdoSubmitWaitWakeIrp(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3328
BOOLEAN NTAPI USBH_CheckIdleAbort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
Definition: usbhub.c:3236
#define USBHUB_FDO_FLAG_DEVICE_SUSPENDED
Definition: usbhub.h:58
#define USBHUB_FDO_FLAG_DO_SUSPENSE
Definition: usbhub.h:56
#define USBHUB_FDO_FLAG_GOING_IDLE
Definition: usbhub.h:57
#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP
Definition: usbhub.h:39
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3040
#define IRP_MN_SET_POWER
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by USBH_FdoSubmitIdleRequestIrp().

◆ USBH_FdoIdleNotificationRequestComplete()

NTSTATUS NTAPI USBH_FdoIdleNotificationRequestComplete ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 3644 of file usbhub.c.

3647{
3648 PUSBHUB_FDO_EXTENSION HubExtension;
3649 NTSTATUS NtStatus;
3650 PVOID IdleIrp;
3651 KIRQL Irql;
3653 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
3654
3656
3657 HubExtension = Context;
3658 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3659
3660 IdleIrp = InterlockedExchangePointer((PVOID)&HubExtension->PendingIdleIrp,
3661 NULL);
3662
3663 DPRINT("USBH_FdoIdleNotificationRequestComplete: IdleIrp - %p\n", IdleIrp);
3664
3665 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3666 {
3668 }
3669
3671
3672 NtStatus = Irp->IoStatus.Status;
3673
3674 DPRINT("USBH_FdoIdleNotificationRequestComplete: NtStatus - %lX\n",
3675 NtStatus);
3676
3677 if (!NT_SUCCESS(NtStatus) &&
3678 NtStatus != STATUS_POWER_STATE_INVALID &&
3679 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_REMOVED) &&
3680 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
3681 {
3682 DPRINT("USBH_FdoIdleNotificationRequestComplete: DeviceState - %x\n",
3683 HubExtension->CurrentPowerState.DeviceState);
3684
3685 if (HubExtension->CurrentPowerState.DeviceState == PowerDeviceD0)
3686 {
3687 PUSBHUB_IDLE_PORT_CONTEXT HubWorkItemBuffer;
3688
3689 Status = USBH_AllocateWorkItem(HubExtension,
3690 &HubIoWorkItem,
3693 (PVOID *)&HubWorkItemBuffer,
3695
3696 if (NT_SUCCESS(Status))
3697 {
3698 HubWorkItemBuffer->Status = NtStatus;
3699
3700 USBH_HubQueuePortIdleIrps(HubExtension,
3701 &HubWorkItemBuffer->PwrList);
3702
3703 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3704 }
3705 }
3706 else
3707 {
3708 PUSBHUB_IDLE_HUB_CONTEXT HubWorkItemBuffer;
3709
3710 Status = USBH_AllocateWorkItem(HubExtension,
3711 &HubIoWorkItem,
3714 (PVOID *)&HubWorkItemBuffer,
3716
3717 if (NT_SUCCESS(Status))
3718 {
3719 HubWorkItemBuffer->Status = NtStatus;
3720 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3721 }
3722 }
3723 }
3724
3725 if (IdleIrp ||
3726 InterlockedExchange((PLONG)&HubExtension->IdleRequestLock, 1))
3727 {
3728 DPRINT("USBH_FdoIdleNotificationRequestComplete: Irp - %p\n", Irp);
3729 IoFreeIrp(Irp);
3730 }
3731
3733}
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1666
#define STATUS_POWER_STATE_INVALID
Definition: ntstatus.h:957
POWER_STATE CurrentPowerState
Definition: usbhub.h:160
VOID NTAPI USBH_IdleCompletePowerHubWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:3622
VOID NTAPI USBH_CompletePortIdleIrpsWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:3591
VOID NTAPI USBH_HubQueuePortIdleIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY IdleList)
Definition: usbhub.c:3067
#define USBHUB_FDO_FLAG_DEVICE_STOPPED
Definition: usbhub.h:37

Referenced by USBH_FdoSubmitIdleRequestIrp().

◆ USBH_FdoSubmitIdleRequestIrp()

NTSTATUS NTAPI USBH_FdoSubmitIdleRequestIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3737 of file usbhub.c.

3738{
3740 ULONG HubFlags;
3741 PDEVICE_OBJECT LowerPDO;
3742 PIRP Irp;
3743 PIO_STACK_LOCATION IoStack;
3744 KIRQL Irql;
3745
3746 DPRINT("USBH_FdoSubmitIdleRequestIrp: HubExtension - %p, PendingIdleIrp - %p\n",
3747 HubExtension,
3748 HubExtension->PendingIdleIrp);
3749
3750 if (HubExtension->PendingIdleIrp)
3751 {
3753 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3754 return Status;
3755 }
3756
3757 HubFlags = HubExtension->HubFlags;
3758
3759 if (HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING ||
3761 {
3762 HubExtension->HubFlags = HubFlags & ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3763 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3764 return STATUS_DEVICE_REMOVED;
3765 }
3766
3767 LowerPDO = HubExtension->LowerPDO;
3768
3769 HubExtension->IdleCallbackInfo.IdleCallback = USBH_FdoIdleNotificationCallback;
3770 HubExtension->IdleCallbackInfo.IdleContext = HubExtension;
3771
3772 Irp = IoAllocateIrp(LowerPDO->StackSize, FALSE);
3773
3774 if (!Irp)
3775 {
3776 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3778
3779 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3780 return Status;
3781 }
3782
3783 IoStack = IoGetNextIrpStackLocation(Irp);
3784
3786
3787 IoStack->Parameters.DeviceIoControl.InputBufferLength = sizeof(USB_IDLE_CALLBACK_INFO);
3788 IoStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION;
3789 IoStack->Parameters.DeviceIoControl.Type3InputBuffer = &HubExtension->IdleCallbackInfo;
3790
3793 HubExtension,
3794 TRUE,
3795 TRUE,
3796 TRUE);
3797
3798 InterlockedIncrement(&HubExtension->PendingRequestCount);
3799 InterlockedExchange(&HubExtension->IdleRequestLock, 0);
3800
3801 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_DEVICE_SUSPENDED |
3803
3804 Status = IoCallDriver(HubExtension->LowerPDO, Irp);
3805
3807
3808 if (Status == STATUS_PENDING &&
3809 HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST)
3810 {
3811 HubExtension->PendingIdleIrp = Irp;
3812 }
3813
3815
3816 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3817
3818 return Status;
3819}
#define STATUS_DEVICE_REMOVED
Definition: d3dkmdt.h:39
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:615
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
NTSTATUS NTAPI USBH_FdoIdleNotificationRequestComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: usbhub.c:3644
VOID NTAPI USBH_FdoIdleNotificationCallback(IN PVOID Context)
Definition: usbhub.c:3380

Referenced by USBH_CheckHubIdle().

◆ USBH_FdoSubmitWaitWakeIrp()

NTSTATUS NTAPI USBH_FdoSubmitWaitWakeIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3328 of file usbhub.c.

3329{
3332 PIRP Irp = NULL;
3333 KIRQL Irql;
3334
3335 DPRINT("USBH_FdoSubmitWaitWakeIrp: ... \n");
3336
3337 PowerState.SystemState = HubExtension->SystemWake;
3338 HubExtension->HubFlags |= USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
3339
3340 InterlockedIncrement(&HubExtension->PendingRequestCount);
3341 InterlockedExchange(&HubExtension->FdoWaitWakeLock, 0);
3342
3343 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
3345 PowerState,
3347 HubExtension,
3348 &Irp);
3349
3351
3352 if (Status == STATUS_PENDING)
3353 {
3354 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP)
3355 {
3356 HubExtension->PendingWakeIrp = Irp;
3357 DPRINT("USBH_FdoSubmitWaitWakeIrp: PendingWakeIrp - %p\n",
3358 HubExtension->PendingWakeIrp);
3359 }
3360 }
3361 else
3362 {
3363 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
3364
3365 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3366 {
3367 KeSetEvent(&HubExtension->PendingRequestEvent,
3369 FALSE);
3370 }
3371 }
3372
3374
3375 return Status;
3376}
VOID NTAPI USBH_FdoWaitWakeIrpCompletion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: usbhub.c:3317
#define IRP_MN_WAIT_WAKE

Referenced by USBH_FdoIdleNotificationCallback().

◆ USBH_FdoSyncSubmitUrb()

NTSTATUS NTAPI USBH_FdoSyncSubmitUrb ( IN PDEVICE_OBJECT  FdoDevice,
IN PURB  Urb 
)

Definition at line 355 of file usbhub.c.

357{
358 PUSBHUB_FDO_EXTENSION HubExtension;
359
360 DPRINT("USBH_FdoSyncSubmitUrb: FdoDevice - %p, Urb - %p\n",
361 FdoDevice,
362 Urb);
363
364 HubExtension = FdoDevice->DeviceExtension;
365 return USBH_SyncSubmitUrb(HubExtension->LowerDevice, Urb);
366}
NTSTATUS NTAPI USBH_SyncSubmitUrb(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
Definition: usbhub.c:250

Referenced by USBH_AbortInterruptPipe(), USBH_GetDeviceDescriptor(), USBH_OpenConfiguration(), USBH_ResetInterruptPipe(), USBH_SyncGetDeviceConfigurationDescriptor(), USBH_SyncGetStatus(), and USBH_Transact().

◆ USBH_FdoWaitWakeIrpCompletion()

VOID NTAPI USBH_FdoWaitWakeIrpCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 3317 of file usbhub.c.

3322{
3323 DPRINT("USBH_FdoWaitWakeIrpCompletion ... \n");
3324}

Referenced by USBH_FdoSubmitWaitWakeIrp().

◆ USBH_FlushPortPwrList()

VOID NTAPI USBH_FlushPortPwrList ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3140 of file usbhub.c.

3141{
3142 PDEVICE_OBJECT PortDevice;
3143 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3145 ULONG Port;
3146
3147 DPRINT("USBH_FlushPortPwrList ... \n");
3148
3149 InterlockedIncrement((PLONG)&HubExtension->PendingRequestCount);
3150
3151 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
3152 Executive,
3153 KernelMode,
3154 FALSE,
3155 NULL);
3156
3157 for (Port = 0; Port < HubExtension->HubDescriptor->bNumberOfPorts; ++Port)
3158 {
3159 PortDevice = HubExtension->PortData[Port].DeviceObject;
3160
3161 if (!PortDevice)
3162 {
3163 continue;
3164 }
3165
3166 PortExtension = PortDevice->DeviceExtension;
3167
3168 InterlockedExchange((PLONG)&PortExtension->StateBehindD2, 0);
3169
3170 while (TRUE)
3171 {
3173 &PortExtension->PortPowerListSpinLock);
3174
3175 if (!Entry)
3176 {
3177 break;
3178 }
3179
3180 DPRINT1("USBH_FlushPortPwrList: PortPowerList FIXME\n");
3181 DbgBreakPoint();
3182 }
3183 }
3184
3185 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
3187 1,
3188 FALSE);
3189
3190 if (!InterlockedDecrement((PLONG)&HubExtension->PendingRequestCount))
3191 {
3192 KeSetEvent(&HubExtension->PendingRequestEvent,
3194 FALSE);
3195 }
3196}
PLIST_ENTRY NTAPI ExInterlockedRemoveHeadList(IN OUT PLIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:166
base of all file and directory entries
Definition: entries.h:83
Definition: typedefs.h:120

Referenced by USBH_CompletePortIdleIrpsWorker(), and USBH_HubCompletePortIdleIrps().

◆ USBH_FreeWorkItem()

VOID NTAPI USBH_FreeWorkItem ( IN PUSBHUB_IO_WORK_ITEM  HubIoWorkItem)

Definition at line 2952 of file usbhub.c.

2953{
2955
2956 DPRINT("USBH_FreeWorkItem: ... \n");
2957
2958 WorkItem = HubIoWorkItem->HubWorkItem;
2959
2960 if (HubIoWorkItem->HubWorkItemBuffer)
2961 {
2962 ExFreePoolWithTag(HubIoWorkItem->HubWorkItemBuffer, USB_HUB_TAG);
2963 }
2964
2965 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2966
2968}

Referenced by USBH_ChangeIndicationProcessChange().

◆ USBH_GetConfigurationDescriptor()

NTSTATUS NTAPI USBH_GetConfigurationDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR OutDescriptor 
)

Definition at line 974 of file usbhub.c.

976{
978 ULONG ReturnedLen;
979 SIZE_T DescriptorLen;
981
982 DPRINT("USBH_GetConfigurationDescriptor: ... \n");
983
984 DescriptorLen = MAXUCHAR;
985
986 while (TRUE)
987 {
989 DescriptorLen,
991
992 if (!ConfigDescriptor)
993 {
995 break;
996 }
997
1000 DescriptorLen,
1001 &ReturnedLen);
1002
1003 if (ReturnedLen < sizeof(USB_CONFIGURATION_DESCRIPTOR))
1004 {
1006 }
1007
1008 if (!NT_SUCCESS(Status))
1009 {
1010 break;
1011 }
1012
1013 *OutDescriptor = ConfigDescriptor;
1014
1015 if (ConfigDescriptor->wTotalLength <= DescriptorLen)
1016 {
1017 break;
1018 }
1019
1020 DescriptorLen = ConfigDescriptor->wTotalLength;
1021
1023 *OutDescriptor = NULL;
1024 }
1025
1026 if (NT_SUCCESS(Status))
1027 {
1028 if (ReturnedLen < ConfigDescriptor->wTotalLength)
1029 {
1031 }
1032 }
1033 else
1034 {
1035 if (ConfigDescriptor)
1036 {
1038 }
1039
1040 *OutDescriptor = NULL;
1041 }
1042
1043 return Status;
1044}
#define STATUS_DEVICE_DATA_ERROR
Definition: udferr_usr.h:159
#define MAXUCHAR
Definition: umtypes.h:117
NTSTATUS NTAPI USBH_SyncGetDeviceConfigurationDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor, IN ULONG NumberOfBytes, IN PULONG OutLength)
Definition: usbhub.c:913
_Must_inspect_result_ _In_ WDFUSBDEVICE _Out_writes_bytes_to_opt_ ConfigDescriptorLength PVOID ConfigDescriptor
Definition: wdfusb.h:1036

Referenced by USBH_ProcessDeviceInformation(), and USBH_StartHubFdoDevice().

◆ USBH_GetConfigValue()

NTSTATUS NTAPI USBH_GetConfigValue ( IN PWSTR  ValueName,
IN ULONG  ValueType,
IN PVOID  ValueData,
IN ULONG  ValueLength,
IN PVOID  Context,
IN PVOID  EntryContext 
)

Definition at line 34 of file usbhub.c.

40{
42
43 DPRINT("USBHUB_GetConfigValue: ... \n");
44
45 if (ValueType == REG_BINARY)
46 {
48 }
49 else if (ValueType == REG_DWORD)
50 {
52 }
53 else
54 {
56 }
57
58 return Status;
59}
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:312
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
Definition: rtlfuncs.h:4210
#define REG_BINARY
Definition: nt_native.h:1499
#define REG_DWORD
Definition: sdbapi.c:615
uint32_t * PULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
Definition: wdfregistry.h:282

Referenced by USBH_RegQueryGenericUSBDeviceString().

◆ USBH_GetDeviceDescriptor()

NTSTATUS NTAPI USBH_GetDeviceDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN PUSB_DEVICE_DESCRIPTOR  HubDeviceDescriptor 
)

Definition at line 877 of file usbhub.c.

879{
882
883 DPRINT("USBH_GetDeviceDescriptor: ... \n");
884
886 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
888
889 if (!Urb)
890 {
891 DPRINT1("USBH_SyncGetDeviceHandle: Urb - NULL!\n");
893 }
894
896
898 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST);
899
900 Urb->TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR);
901 Urb->TransferBuffer = HubDeviceDescriptor;
902 Urb->DescriptorType = USB_DEVICE_DESCRIPTOR_TYPE;
903
905
907
908 return Status;
909}
Definition: usb.h:529
#define USB_DEVICE_DESCRIPTOR_TYPE
Definition: usb100.h:49
struct _USB_DEVICE_DESCRIPTOR USB_DEVICE_DESCRIPTOR
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
Definition: usb.h:97
NTSTATUS NTAPI USBH_FdoSyncSubmitUrb(IN PDEVICE_OBJECT FdoDevice, IN PURB Urb)
Definition: usbhub.c:355

Referenced by USBH_StartHubFdoDevice().

◆ USBH_GetDeviceType()

NTSTATUS NTAPI USBH_GetDeviceType ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_DEVICE_HANDLE  DeviceHandle,
OUT USB_DEVICE_TYPE OutDeviceType 
)

Definition at line 608 of file usbhub.c.

611{
616 ULONG dummy;
618
619 DPRINT("USBH_GetDeviceType: ... \n");
620
621 QueryDeviceInformation = HubExtension->BusInterface.QueryDeviceInformation;
622
624 {
625 DPRINT1("USBH_GetDeviceType: no QueryDeviceInformation()\n");
627 }
628
630
631 while (TRUE)
632 {
636
637 if (!DeviceInfo)
638 {
639 DPRINT1("USBH_GetDeviceType: ExAllocatePoolWithTag() failed\n");
641 break;
642 }
643
645
646 DeviceInfo->InformationLevel = 0;
647
648 Status = QueryDeviceInformation(HubExtension->BusInterface.BusContext,
652 &dummy);
653
655 {
656 if (NT_SUCCESS(Status))
657 {
658 DeviceType = DeviceInfo->DeviceType;
659 }
660
662 break;
663 }
664
667 }
668
669 if (OutDeviceType)
670 {
671 *OutDeviceType = DeviceType;
672 DPRINT("USBH_GetDeviceType: DeviceType - %x\n", DeviceType);
673 }
674
675 return Status;
676}
_In_ PUSB_DEVICE_HANDLE _In_ ULONG DeviceInformationBufferLength
Definition: hubbusif.h:181
DeviceType
Definition: mmdrv.h:42
@ Usb11Device
Definition: usb200.h:37
enum _USB_DEVICE_TYPE USB_DEVICE_TYPE

Referenced by USBH_StartHubFdoDevice().

◆ USBH_GetPortStatus()

NTSTATUS NTAPI USBH_GetPortStatus ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PULONG  PortStatus 
)

Definition at line 1992 of file usbhub.c.

1994{
1995 PIRP Irp;
1996 PIO_STACK_LOCATION IoStack;
1998 KEVENT Event;
2000
2001 DPRINT("USBH_GetPortStatus ... \n");
2002
2003 *PortStatus = 0;
2004
2006
2008 HubExtension->LowerDevice,
2009 NULL,
2010 0,
2011 NULL,
2012 0,
2013 TRUE,
2014 &Event,
2015 &IoStatusBlock);
2016
2017 if (!Irp)
2018 {
2020 }
2021
2022 IoStack = IoGetNextIrpStackLocation(Irp);
2023 IoStack->Parameters.Others.Argument1 = PortStatus;
2024
2025 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
2026
2027 if (Status == STATUS_PENDING)
2028 {
2030 Suspended,
2031 KernelMode,
2032 FALSE,
2033 NULL);
2034 }
2035 else
2036 {
2038 }
2039
2040 return IoStatusBlock.Status;
2041}
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
Definition: usbioctl.h:44

Referenced by USBH_ResetHub().

◆ USBH_GetRootHubExtension()

PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 699 of file usbhub.c.

700{
702 PUSBHUB_FDO_EXTENSION RootHubExtension;
703
704 DPRINT("USBH_GetRootHubExtension: HubExtension - %p\n", HubExtension);
705
706 RootHubExtension = HubExtension;
707
708 if (HubExtension->LowerPDO != HubExtension->RootHubPdo)
709 {
710 Device = HubExtension->RootHubPdo;
711
712 do
713 {
714 Device = Device->AttachedDevice;
715 }
716 while (Device->DriverObject != HubExtension->Common.SelfDevice->DriverObject);
717
718 RootHubExtension = Device->DeviceExtension;
719 }
720
721 DPRINT("USBH_GetRootHubExtension: RootHubExtension - %p\n", RootHubExtension);
722
723 return RootHubExtension;
724}
PDEVICE_OBJECT RootHubPdo
Definition: usbhub.h:151
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474

Referenced by USBH_CheckHubIdle(), USBH_FdoPower(), USBH_HubSetD0(), and USBH_HubStartESDRecovery().

◆ USBH_GetSerialNumberString()

NTSTATUS NTAPI USBH_GetSerialNumberString ( IN PDEVICE_OBJECT  DeviceObject,
IN LPWSTR OutSerialNumber,
IN PUSHORT  OutDescriptorLength,
IN USHORT  LanguageId,
IN UCHAR  Index 
)

Definition at line 4319 of file usbhub.c.

4324{
4327 LPWSTR SerialNumberBuffer = NULL;
4328 UCHAR StringLength;
4329 UCHAR Length;
4330
4331 DPRINT("USBH_GetSerialNumberString: ... \n");
4332
4333 *OutSerialNumber = NULL;
4334 *OutDescriptorLength = 0;
4335
4338 USB_HUB_TAG);
4339
4340 if (!Descriptor)
4341 {
4343 }
4344
4346
4348
4349 if (!NT_SUCCESS(Status))
4350 {
4351 goto Exit;
4352 }
4353
4355 Index,
4356 LanguageId,
4357 Descriptor,
4359 NULL,
4360 TRUE);
4361
4362 if (!NT_SUCCESS(Status) ||
4363 Descriptor->bLength <= sizeof(USB_COMMON_DESCRIPTOR))
4364 {
4366 goto Exit;
4367 }
4368
4369 StringLength = Descriptor->bLength -
4371
4372 Length = StringLength + sizeof(UNICODE_NULL);
4373
4374 SerialNumberBuffer = ExAllocatePoolWithTag(PagedPool, Length, USB_HUB_TAG);
4375
4376 if (!SerialNumberBuffer)
4377 {
4378 goto Exit;
4379 }
4380
4381 RtlZeroMemory(SerialNumberBuffer, Length);
4382 RtlCopyMemory(SerialNumberBuffer, Descriptor->bString, StringLength);
4383
4384 *OutSerialNumber = SerialNumberBuffer;
4385 *OutDescriptorLength = Length;
4386
4387Exit:
4389 return Status;
4390}
#define UNICODE_NULL
NTSTATUS NTAPI USBH_CheckDeviceLanguage(IN PDEVICE_OBJECT DeviceObject, IN USHORT LanguageId)
Definition: usbhub.c:4257
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by USBH_CreateDevice().

◆ USBH_HubCancelIdleIrp()

VOID NTAPI USBH_HubCancelIdleIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  IdleIrp 
)

Definition at line 3221 of file usbhub.c.

3223{
3224 DPRINT("USBH_HubCancelIdleIrp ... \n");
3225
3226 IoCancelIrp(IdleIrp);
3227
3228 if (InterlockedExchange(&HubExtension->IdleRequestLock, 1))
3229 {
3230 IoFreeIrp(IdleIrp);
3231 }
3232}
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1101

Referenced by USBH_FdoCleanup(), USBH_FdoIdleNotificationCallback(), USBH_HubQueuePortIdleIrps(), and USBH_PortIdleNotificationCancelRoutine().

◆ USBH_HubCompletePortIdleIrps()

VOID NTAPI USBH_HubCompletePortIdleIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN NTSTATUS  NtStatus 
)

Definition at line 3200 of file usbhub.c.

3202{
3203 LIST_ENTRY IdleList;
3204
3205 DPRINT("USBH_HubCompletePortIdleIrps ... \n");
3206
3207 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
3208 {
3209 USBH_HubQueuePortIdleIrps(HubExtension, &IdleList);
3210
3212 &IdleList,
3213 NtStatus);
3214
3215 USBH_FlushPortPwrList(HubExtension);
3216 }
3217}

Referenced by USBH_FdoIdleNotificationCallback(), and USBH_IdleCompletePowerHubWorker().

◆ USBH_HubCompleteQueuedPortIdleIrps()

VOID NTAPI USBH_HubCompleteQueuedPortIdleIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PLIST_ENTRY  IdleList,
IN NTSTATUS  NtStatus 
)

Definition at line 3125 of file usbhub.c.

3128{
3129 DPRINT("USBH_HubCompleteQueuedPortIdleIrps ... \n");
3130
3131 while (!IsListEmpty(IdleList))
3132 {
3133 DPRINT1("USBH_HubCompleteQueuedPortIdleIrps: IdleList not Empty. FIXME\n");
3134 DbgBreakPoint();
3135 }
3136}
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954

Referenced by USBH_CompletePortIdleIrpsWorker(), and USBH_HubCompletePortIdleIrps().

◆ USBH_HubDispatch()

NTSTATUS NTAPI USBH_HubDispatch ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 5049 of file usbhub.c.

5051{
5052 PCOMMON_DEVICE_EXTENSION DeviceExtension;
5053 ULONG ExtensionType;
5055
5056
5057 DeviceExtension = DeviceObject->DeviceExtension;
5058 ExtensionType = DeviceExtension->ExtensionType;
5059
5060 if (ExtensionType == USBH_EXTENSION_TYPE_HUB)
5061 {
5062 DPRINT("USBH_HubDispatch: DeviceObject - %p, Irp - %p\n",
5064 Irp);
5065
5066 Status = USBH_FdoDispatch((PUSBHUB_FDO_EXTENSION)DeviceExtension, Irp);
5067 }
5068 else if (ExtensionType == USBH_EXTENSION_TYPE_PORT)
5069 {
5072 BOOLEAN IsDprint = TRUE;
5073
5075 {
5076 ULONG ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
5077
5079 {
5080 IsDprint = FALSE;
5081 }
5082 }
5083
5084 if (IsDprint)
5085 {
5086 DPRINT("USBH_HubDispatch: DeviceObject - %p, Irp - %p\n",
5088 Irp);
5089 }
5090
5092 }
5093 else
5094 {
5095 DPRINT1("USBH_HubDispatch: Unknown ExtensionType - %x\n", ExtensionType);
5096 DbgBreakPoint();
5098 }
5099
5100 return Status;
5101}
#define STATUS_ASSERTION_FAILURE
Definition: ntstatus.h:1099
NTSTATUS NTAPI USBH_FdoDispatch(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: usbhub.c:4911
NTSTATUS NTAPI USBH_PdoDispatch(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: usbhub.c:4824
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55

Referenced by DriverEntry().

◆ USBH_HubIsBusPowered()

BOOLEAN NTAPI USBH_HubIsBusPowered ( IN PDEVICE_OBJECT  DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR  HubConfigDescriptor 
)

Definition at line 1589 of file usbhub.c.

1591{
1593 USHORT UsbStatus;
1595
1596 DPRINT("USBH_HubIsBusPowered: ... \n");
1597
1599 &UsbStatus,
1601 0);
1602
1603 if (!NT_SUCCESS(Status))
1604 {
1605 Result = (HubConfigDescriptor->bmAttributes & USB_CONFIG_POWERED_MASK)
1607 }
1608 else
1609 {
1610 Result = (UsbStatus & USB_GETSTATUS_SELF_POWERED) == 0;
1611 }
1612
1613 return Result;
1614}
#define USB_GETSTATUS_SELF_POWERED
Definition: usb100.h:45
#define USB_CONFIG_BUS_POWERED
Definition: usb100.h:69
#define USB_CONFIG_POWERED_MASK
Definition: usb100.h:68
#define URB_FUNCTION_GET_STATUS_FROM_DEVICE
Definition: usb.h:105
NTSTATUS NTAPI USBH_SyncGetStatus(IN PDEVICE_OBJECT DeviceObject, IN PUSHORT OutStatus, IN USHORT Function, IN USHORT RequestIndex)
Definition: usbhub.c:1323

Referenced by USBH_IoctlGetNodeInformation(), and USBH_StartHubFdoDevice().

◆ USBH_HubQueuePortIdleIrps()

VOID NTAPI USBH_HubQueuePortIdleIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PLIST_ENTRY  IdleList 
)

Definition at line 3067 of file usbhub.c.

3069{
3070 PDEVICE_OBJECT PortDevice;
3071 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3072 PIRP IdleIrp;
3073 PIRP HubIdleIrp;
3074 ULONG NumPorts;
3075 ULONG Port;
3076 KIRQL Irql;
3077
3078 DPRINT("USBH_HubQueuePortIdleIrps ... \n");
3079
3080 InitializeListHead(IdleList);
3081
3083
3084 NumPorts = HubExtension->HubDescriptor->bNumberOfPorts;
3085
3086 for (Port = 0; Port < NumPorts; ++Port)
3087 {
3088 PortDevice = HubExtension->PortData[Port].DeviceObject;
3089
3090 if (PortDevice)
3091 {
3092 PortExtension = PortDevice->DeviceExtension;
3093
3094 IdleIrp = PortExtension->IdleNotificationIrp;
3095 PortExtension->IdleNotificationIrp = NULL;
3096
3097 if (IdleIrp && IoSetCancelRoutine(IdleIrp, NULL))
3098 {
3099 DPRINT1("USBH_HubQueuePortIdleIrps: IdleIrp != NULL. FIXME\n");
3100 DbgBreakPoint();
3101 }
3102 }
3103 }
3104
3105 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST)
3106 {
3107 HubIdleIrp = HubExtension->PendingIdleIrp;
3108 HubExtension->PendingIdleIrp = NULL;
3109 }
3110 else
3111 {
3112 HubIdleIrp = NULL;
3113 }
3114
3116
3117 if (HubIdleIrp)
3118 {
3119 USBH_HubCancelIdleIrp(HubExtension, HubIdleIrp);
3120 }
3121}
IoSetCancelRoutine(Irp, CancelRoutine)

Referenced by USBH_FdoIdleNotificationRequestComplete(), and USBH_HubCompletePortIdleIrps().

◆ USBH_HubSetDWakeCompletion()

VOID NTAPI USBH_HubSetDWakeCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 3055 of file usbhub.c.

3060{
3061 DPRINT("USBH_HubSetDWakeCompletion: ... \n");
3063}

Referenced by USBH_FdoIdleNotificationCallback().

◆ USBH_IdleCompletePowerHubWorker()

VOID NTAPI USBH_IdleCompletePowerHubWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 3622 of file usbhub.c.

3624{
3625 PUSBHUB_IDLE_HUB_CONTEXT HubWorkItemBuffer;
3626
3627 DPRINT("USBH_IdleCompletePowerHubWorker ... \n");
3628
3629 if (HubExtension &&
3630 HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
3631 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
3632 {
3633 USBH_HubSetD0(HubExtension);
3634 }
3635
3636 HubWorkItemBuffer = Context;
3637
3638 USBH_HubCompletePortIdleIrps(HubExtension, HubWorkItemBuffer->Status);
3639
3640}
NTSTATUS NTAPI USBH_HubSetD0(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:104

Referenced by USBH_FdoIdleNotificationRequestComplete().

◆ USBH_PassIrp()

NTSTATUS NTAPI USBH_PassIrp ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 79 of file usbhub.c.

81{
82 DPRINT_PNP("USBH_PassIrp: DeviceObject - %p, Irp - %p\n",
84 Irp);
85
88}
#define DPRINT_PNP(...)
Definition: dbg_uhub.h:109
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421

Referenced by USBH_DeviceControl(), USBH_FdoDispatch(), USBH_FdoPnP(), USBH_FdoQueryBusRelations(), USBH_FdoRemoveDevice(), USBH_PdoInternalControl(), USBH_PdoIoctlSubmitUrb(), USBH_PdoPnP(), and USBH_PdoUrbFilter().

◆ USBH_PdoDispatch()

NTSTATUS NTAPI USBH_PdoDispatch ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PIRP  Irp 
)

Definition at line 4824 of file usbhub.c.

4826{
4827 PIO_STACK_LOCATION IoStack;
4829 BOOLEAN ShouldCompleteIrp;
4832
4834 MajorFunction = IoStack->MajorFunction;
4835
4836 switch (MajorFunction)
4837 {
4838 case IRP_MJ_CREATE:
4839 case IRP_MJ_CLOSE:
4840 DPRINT("USBH_PdoDispatch: IRP_MJ_CREATE / IRP_MJ_CLOSE (%d)\n",
4844 break;
4845
4847 ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
4848 DPRINT("USBH_PdoDispatch: IRP_MJ_DEVICE_CONTROL ControlCode - %x\n",
4849 ControlCode);
4850
4852 {
4855 break;
4856 }
4857
4859 {
4860 DPRINT1("USBH_PdoDispatch: IOCTL_KS_PROPERTY FIXME\n");
4861 DbgBreakPoint();
4864 break;
4865 }
4866
4867 Status = Irp->IoStatus.Status;
4869 break;
4870
4872 Status = USBH_PdoInternalControl(PortExtension, Irp);
4873 break;
4874
4875 case IRP_MJ_PNP:
4876 Status = USBH_PdoPnP(PortExtension,
4877 Irp,
4878 IoStack->MinorFunction,
4879 &ShouldCompleteIrp);
4880
4881 if (ShouldCompleteIrp)
4882 {
4884 }
4885
4886 break;
4887
4888 case IRP_MJ_POWER:
4889 Status = USBH_PdoPower(PortExtension, Irp, IoStack->MinorFunction);
4890 break;
4891
4893 DPRINT1("USBH_PdoDispatch: USBH_SystemControl() UNIMPLEMENTED. FIXME\n");
4894 //USBH_PortSystemControl(PortExtension, Irp);
4895 Status = Irp->IoStatus.Status;
4897 break;
4898
4899 default:
4900 DPRINT("USBH_PdoDispatch: Unhandled MajorFunction - %d\n", MajorFunction);
4901 Status = Irp->IoStatus.Status;
4903 break;
4904 }
4905
4906 return Status;
4907}
NTSTATUS NTAPI USBH_PdoInternalControl(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: ioctl.c:1280
NTSTATUS NTAPI USBH_PdoPnP(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor, OUT BOOLEAN *IsCompleteIrp)
Definition: pnp.c:2594
NTSTATUS NTAPI USBH_PdoPower(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor)
Definition: power.c:848
#define IOCTL_KS_PROPERTY
Definition: ks.h:127
#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
Definition: ntddstor.h:151

Referenced by USBH_HubDispatch().

◆ USBH_PdoSetCapabilities()

VOID NTAPI USBH_PdoSetCapabilities ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension)

Definition at line 3996 of file usbhub.c.

3997{
3998 PUSBHUB_FDO_EXTENSION HubExtension;
3999 ULONG State;
4001 PDEVICE_POWER_STATE pDeviceState;
4002
4003 DPRINT("USBH_PdoSetCapabilities ... \n");
4004
4005 HubExtension = PortExtension->HubExtension;
4006
4007 PortExtension->Capabilities.Size = 64;
4008 PortExtension->Capabilities.Version = 1;
4009
4010 PortExtension->Capabilities.Removable = 1;
4011 PortExtension->Capabilities.Address = PortExtension->PortNumber;
4012
4013 if (PortExtension->SerialNumber)
4014 {
4015 PortExtension->Capabilities.UniqueID = 1;
4016 }
4017 else
4018 {
4019 PortExtension->Capabilities.UniqueID = 0;
4020 }
4021
4022 PortExtension->Capabilities.RawDeviceOK = 0;
4023
4024 RtlCopyMemory(PortExtension->Capabilities.DeviceState,
4025 HubExtension->DeviceState,
4026 (PowerSystemMaximum + 2) * sizeof(POWER_STATE));
4027
4028 PortExtension->Capabilities.DeviceState[1] = PowerDeviceD0;
4029
4030 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REMOTE_WAKEUP)
4031 {
4032 PortExtension->Capabilities.DeviceWake = PowerDeviceD2;
4033
4034 PortExtension->Capabilities.DeviceD1 = 1;
4035 PortExtension->Capabilities.DeviceD2 = 1;
4036
4037 PortExtension->Capabilities.WakeFromD0 = 1;
4038 PortExtension->Capabilities.WakeFromD1 = 1;
4039 PortExtension->Capabilities.WakeFromD2 = 1;
4040
4041 pDeviceState = &PortExtension->Capabilities.DeviceState[2];
4042
4043 for (State = 2; State <= 5; State++)
4044 {
4046
4047 if (PortExtension->Capabilities.SystemWake < SystemPowerState)
4048 {
4049 *pDeviceState = PowerDeviceD3;
4050 }
4051 else
4052 {
4053 *pDeviceState = PowerDeviceD2;
4054 }
4055
4056 ++pDeviceState;
4057 }
4058 }
4059 else
4060 {
4061 PortExtension->Capabilities.DeviceWake = PowerDeviceD0;
4062 PortExtension->Capabilities.DeviceState[2] = PowerDeviceD3;
4063 PortExtension->Capabilities.DeviceState[3] = PowerDeviceD3;
4064 PortExtension->Capabilities.DeviceState[4] = PowerDeviceD3;
4065 PortExtension->Capabilities.DeviceState[5] = PowerDeviceD3;
4066 }
4067}
@ PowerSystemMaximum
Definition: ntpoapi.h:42
enum _DEVICE_POWER_STATE * PDEVICE_POWER_STATE
@ PowerDeviceD2
Definition: ntpoapi.h:51
@ PowerDeviceD3
Definition: ntpoapi.h:52
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
DEVICE_POWER_STATE DeviceState[POWER_SYSTEM_MAXIMUM]
Definition: usbhub.h:157
#define USBHUB_PDO_FLAG_REMOTE_WAKEUP
Definition: usbhub.h:65

Referenced by USBH_CreateDevice().

◆ USBH_ProcessDeviceInformation()

NTSTATUS NTAPI USBH_ProcessDeviceInformation ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension)

Definition at line 4071 of file usbhub.c.

4072{
4076
4077 DPRINT("USBH_ProcessDeviceInformation ... \n");
4078
4080
4081 RtlZeroMemory(&PortExtension->InterfaceDescriptor,
4082 sizeof(PortExtension->InterfaceDescriptor));
4083
4084 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_HUB_DEVICE;
4085
4086 Status = USBH_GetConfigurationDescriptor(PortExtension->Common.SelfDevice,
4088
4089 if (!NT_SUCCESS(Status))
4090 {
4091 if (ConfigDescriptor)
4092 {
4094 }
4095
4096 return Status;
4097 }
4098
4099 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REMOTE_WAKEUP;
4100
4101 if (ConfigDescriptor->bmAttributes & 0x20)
4102 {
4103 /* device configuration supports remote wakeup */
4104 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_REMOTE_WAKEUP;
4105 }
4106
4107 USBHUB_DumpingDeviceDescriptor(&PortExtension->DeviceDescriptor);
4109
4110 DPRINT_PNP("USBH_ProcessDeviceInformation: Class - %x, SubClass - %x, Protocol - %x\n",
4111 PortExtension->DeviceDescriptor.bDeviceClass,
4112 PortExtension->DeviceDescriptor.bDeviceSubClass,
4113 PortExtension->DeviceDescriptor.bDeviceProtocol);
4114
4115 DPRINT_PNP("USBH_ProcessDeviceInformation: bNumConfigurations - %x, bNumInterfaces - %x\n",
4116 PortExtension->DeviceDescriptor.bNumConfigurations,
4117 ConfigDescriptor->bNumInterfaces);
4118
4119
4120 /* Enumeration of USB Composite Devices (msdn):
4121 1) The device class field of the device descriptor (bDeviceClass) must contain a value of zero,
4122 or the class (bDeviceClass), subclass (bDeviceSubClass), and protocol (bDeviceProtocol)
4123 fields of the device descriptor must have the values 0xEF, 0x02 and 0x01 respectively,
4124 as explained in USB Interface Association Descriptor.
4125 2) The device must have multiple interfaces
4126 3) The device must have a single configuration.
4127 */
4128
4129 if (((PortExtension->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_RESERVED) ||
4130 (PortExtension->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_MISCELLANEOUS &&
4131 PortExtension->DeviceDescriptor.bDeviceSubClass == 0x02 &&
4132 PortExtension->DeviceDescriptor.bDeviceProtocol == 0x01)) &&
4133 (ConfigDescriptor->bNumInterfaces > 1) &&
4134 (PortExtension->DeviceDescriptor.bNumConfigurations < 2))
4135 {
4136 DPRINT("USBH_ProcessDeviceInformation: Multi-Interface configuration\n");
4137
4138 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_MULTI_INTERFACE;
4139
4140 if (ConfigDescriptor)
4141 {
4143 }
4144
4145 return Status;
4146 }
4147
4150 -1,
4151 -1,
4152 -1,
4153 -1,
4154 -1);
4155 if (Pid)
4156 {
4157 RtlCopyMemory(&PortExtension->InterfaceDescriptor,
4158 Pid,
4159 sizeof(PortExtension->InterfaceDescriptor));
4160
4162 {
4163 PortExtension->PortPdoFlags |= (USBHUB_PDO_FLAG_HUB_DEVICE |
4165 }
4166 }
4167 else
4168 {
4170 }
4171
4172 if (ConfigDescriptor)
4173 {
4175 }
4176
4177 return Status;
4178}
VOID NTAPI USBHUB_DumpingConfiguration(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor)
Definition: debug.c:41
VOID NTAPI USBHUB_DumpingDeviceDescriptor(IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor)
Definition: debug.c:15
#define USB_DEVICE_CLASS_HUB
Definition: usb100.h:99
#define USB_DEVICE_CLASS_RESERVED
Definition: usb100.h:90
#define USB_DEVICE_CLASS_MISCELLANEOUS
Definition: usb200.h:310
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
Definition: usbd.c:496
NTSTATUS NTAPI USBH_GetConfigurationDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR *OutDescriptor)
Definition: usbhub.c:974
#define USBHUB_PDO_FLAG_MULTI_INTERFACE
Definition: usbhub.h:62

Referenced by USBH_CreateDevice().

◆ USBH_ProcessHubStateChange()

VOID NTAPI USBH_ProcessHubStateChange ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_HUB_STATUS_AND_CHANGE  HubStatus 
)

Definition at line 1841 of file usbhub.c.

1843{
1844 USB_HUB_CHANGE HubStatusChange;
1845
1846 DPRINT_SCE("USBH_ProcessHubStateChange: HubStatus - %lx\n", HubStatus->AsUlong32);
1847
1848 HubStatusChange = HubStatus->HubChange;
1849
1850 if (HubStatusChange.LocalPowerChange)
1851 {
1852 DPRINT1("USBH_ProcessHubStateChange: LocalPowerChange\n");
1853 USBH_SyncClearHubStatus(HubExtension,
1855 }
1856 /*
1857 * Per USB 2.0 spec multiple hub change bits may be set simultaneously.
1858 * Handle OverCurrentChange independently so we don’t miss clearing it
1859 * when LocalPowerChange is also set.
1860 */
1861 if (HubStatusChange.OverCurrentChange)
1862 {
1863 USBH_SyncClearHubStatus(HubExtension,
1865 if (HubStatus->HubStatus.OverCurrent)
1866 {
1867 DPRINT1("USBH_ProcessHubStateChange: OverCurrent UNIMPLEMENTED. FIXME\n");
1868 DbgBreakPoint();
1869 }
1870 }
1871}
USHORT OverCurrentChange
Definition: usb200.h:262
USHORT LocalPowerChange
Definition: usb200.h:261
NTSTATUS NTAPI USBH_SyncClearHubStatus(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT RequestValue)
Definition: usbhub.c:1389
#define USBHUB_FEATURE_C_HUB_LOCAL_POWER
Definition: usbhub.h:88
#define USBHUB_FEATURE_C_HUB_OVER_CURRENT
Definition: usbhub.h:89

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_ProcessPortStateChange()

VOID NTAPI USBH_ProcessPortStateChange ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN PUSB_PORT_STATUS_AND_CHANGE  PortStatus 
)

Definition at line 1875 of file usbhub.c.

1878{
1879 PUSBHUB_PORT_DATA PortData;
1880 USB_20_PORT_CHANGE PortStatusChange;
1881 PDEVICE_OBJECT PortDevice;
1882 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
1885 USHORT RequestValue;
1886 KIRQL Irql;
1887
1888 DPRINT_SCE("USBH_ProcessPortStateChange ... \n");
1889
1890 ASSERT(Port > 0);
1891 PortData = &HubExtension->PortData[Port - 1];
1892
1893 PortStatusChange = PortStatus->PortChange.Usb20PortChange;
1894
1895 if (PortStatusChange.ConnectStatusChange)
1896 {
1897 PortData->PortStatus = *PortStatus;
1898
1899 USBH_SyncClearPortStatus(HubExtension,
1900 Port,
1902
1903 PortData = &HubExtension->PortData[Port - 1];
1904
1905 PortDevice = PortData->DeviceObject;
1906
1907 if (!PortDevice)
1908 {
1909 IoInvalidateDeviceRelations(HubExtension->LowerPDO, BusRelations);
1910 return;
1911 }
1912
1913 PortExtension = PortDevice->DeviceExtension;
1914
1916 {
1917 return;
1918 }
1919
1920 KeAcquireSpinLock(&HubExtension->RelationsWorkerSpinLock, &Irql);
1921
1922 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_POWER_D3)
1923 {
1924 KeReleaseSpinLock(&HubExtension->RelationsWorkerSpinLock, Irql);
1925 IoInvalidateDeviceRelations(HubExtension->LowerPDO, BusRelations);
1926 return;
1927 }
1928
1929 PortData->DeviceObject = NULL;
1931
1932 HubExtension->HubFlags |= USBHUB_FDO_FLAG_STATE_CHANGING;
1933
1934 InsertTailList(&HubExtension->PdoList, &PortExtension->PortLink);
1935
1936 KeReleaseSpinLock(&HubExtension->RelationsWorkerSpinLock, Irql);
1937
1939 NULL);
1940
1941 if (SerialNumber)
1942 {
1944 }
1945
1947 NULL);
1948
1949 if (DeviceHandle)
1950 {
1951 USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
1952 USBH_SyncDisablePort(HubExtension, Port);
1953 }
1954
1955 IoInvalidateDeviceRelations(HubExtension->LowerPDO, BusRelations);
1956 return;
1957 }
1958
1959 /*
1960 * Multiple port change bits can be set at once (e.g. enable + reset).
1961 * Handle each independently.
1962 */
1963 if (PortStatusChange.PortEnableDisableChange)
1964 {
1965 RequestValue = USBHUB_FEATURE_C_PORT_ENABLE;
1966 PortData->PortStatus = *PortStatus;
1967 USBH_SyncClearPortStatus(HubExtension, Port, RequestValue);
1968 }
1969
1970 if (PortStatusChange.SuspendChange)
1971 {
1972 DPRINT1("USBH_ProcessPortStateChange: SuspendChange UNIMPLEMENTED. FIXME\n");
1973 DbgBreakPoint();
1974 }
1975
1976 if (PortStatusChange.OverCurrentIndicatorChange)
1977 {
1978 DPRINT1("USBH_ProcessPortStateChange: OverCurrentIndicatorChange UNIMPLEMENTED. FIXME\n");
1979 DbgBreakPoint();
1980 }
1981
1982 if (PortStatusChange.ResetChange)
1983 {
1984 RequestValue = USBHUB_FEATURE_C_PORT_RESET;
1985 PortData->PortStatus = *PortStatus;
1986 USBH_SyncClearPortStatus(HubExtension, Port, RequestValue);
1987 }
1988}
#define InsertTailList(ListHead, Entry)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
USB_CONNECTION_STATUS ConnectionStatus
Definition: usbhub.h:120
USHORT SuspendChange
Definition: usb200.h:165
USHORT OverCurrentIndicatorChange
Definition: usb200.h:166
USHORT ConnectStatusChange
Definition: usb200.h:163
NTSTATUS NTAPI USBH_SyncDisablePort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port)
Definition: usbhub.c:1553
NTSTATUS NTAPI USBH_SyncClearPortStatus(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN USHORT RequestValue)
Definition: usbhub.c:1442
#define USBHUB_PDO_FLAG_OVERCURRENT_PORT
Definition: usbhub.h:75
#define USBHUB_FEATURE_C_PORT_CONNECTION
Definition: usbhub.h:98
#define USBHUB_PDO_FLAG_POWER_D3
Definition: usbhub.h:69
@ NoDeviceConnected
Definition: usbioctl.h:278
@ BusRelations
Definition: iotypes.h:2154

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_QueueWorkItem()

VOID NTAPI USBH_QueueWorkItem ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSBHUB_IO_WORK_ITEM  HubIoWorkItem 
)

Definition at line 2932 of file usbhub.c.

2934{
2935 DPRINT("USBH_QueueWorkItem: ... \n");
2936
2937 InterlockedIncrement(&HubExtension->PendingRequestCount);
2938 InterlockedIncrement(&HubIoWorkItem->HubWorkerQueued);
2939
2940 ExInterlockedInsertTailList(&HubExtension->WorkItemList,
2941 &HubIoWorkItem->HubWorkItemLink,
2942 &HubExtension->WorkItemSpinLock);
2943
2944 IoQueueWorkItem(HubIoWorkItem->HubWorkItem,
2946 HubIoWorkItem->HubWorkItemType,
2947 HubIoWorkItem);
2948}
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
VOID NTAPI USBH_Worker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Definition: usbhub.c:2887

Referenced by USBH_ChangeIndicationProcessChange(), USBH_ChangeIndicationQueryChange(), USBH_CheckIdleDeferred(), USBH_FdoIdleNotificationRequestComplete(), USBH_PdoIoctlResetPort(), and USBH_PortIdleNotificationCancelRoutine().

◆ USBH_RegQueryGenericUSBDeviceString()

NTSTATUS NTAPI USBH_RegQueryGenericUSBDeviceString ( PVOID  USBDeviceString)

Definition at line 5105 of file usbhub.c.

5106{
5108
5109 DPRINT("USBH_RegQueryGenericUSBDeviceString ... \n");
5110
5112
5115 QueryTable[0].Name = L"GenericUSBDeviceString";
5116 QueryTable[0].EntryContext = USBDeviceString;
5118 QueryTable[0].DefaultData = 0;
5120
5122 L"usbflags",
5123 QueryTable,
5124 NULL,
5125 NULL);
5126}
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4211
#define RTL_REGISTRY_CONTROL
Definition: nt_native.h:163
#define RTL_QUERY_REGISTRY_REQUIRED
Definition: nt_native.h:132
#define REG_NONE
Definition: nt_native.h:1495
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
Definition: nt_native.h:109
NTSTATUS NTAPI USBH_GetConfigValue(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
Definition: usbhub.c:34

Referenced by DriverEntry().

◆ USBH_ResetDevice()

NTSTATUS NTAPI USBH_ResetDevice ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN BOOLEAN  IsKeepDeviceData,
IN BOOLEAN  IsWait 
)

Definition at line 4630 of file usbhub.c.

4634{
4636 PUSBHUB_PORT_DATA PortData;
4637 PDEVICE_OBJECT PortDevice;
4638 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4640 PVOID Handle;
4644
4645 DPRINT("USBH_ResetDevice: HubExtension - %p, Port - %x, IsKeepDeviceData - %x, IsWait - %x\n",
4646 HubExtension,
4647 Port,
4648 IsKeepDeviceData,
4649 IsWait);
4650
4651 Status = USBH_SyncGetPortStatus(HubExtension,
4652 Port,
4653 &PortStatus,
4655
4656 if (!NT_SUCCESS(Status) ||
4657 !(PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus))
4658 {
4659 return STATUS_UNSUCCESSFUL;
4660 }
4661
4662 InterlockedIncrement(&HubExtension->PendingRequestCount);
4663
4664 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
4665 Executive,
4666 KernelMode,
4667 FALSE,
4668 NULL);
4669
4670 ASSERT(Port > 0);
4671 PortData = &HubExtension->PortData[Port-1];
4672
4673 PortDevice = PortData->DeviceObject;
4674
4675 if (!PortDevice)
4676 {
4678
4679 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
4681 1,
4682 FALSE);
4683
4684 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
4685 {
4686 KeSetEvent(&HubExtension->PendingRequestEvent,
4688 FALSE);
4689 }
4690
4691 return Status;
4692 }
4693
4694 PortExtension = PortDevice->DeviceExtension;
4695 DeviceHandle = &PortExtension->DeviceHandle;
4696
4698 NULL);
4699
4700 if (OldDeviceHandle)
4701 {
4702 if (!(PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REMOVING_PORT_PDO))
4703 {
4704 Status = USBD_RemoveDeviceEx(HubExtension,
4706 IsKeepDeviceData);
4707
4709 }
4710 }
4711 else
4712 {
4714 }
4715
4716 if (!NT_SUCCESS(Status))
4717 {
4718 goto ErrorExit;
4719 }
4720
4721 Status = USBH_SyncResetPort(HubExtension, Port);
4722
4723 if (!NT_SUCCESS(Status))
4724 {
4725 goto ErrorExit;
4726 }
4727
4728 Status = USBH_SyncGetPortStatus(HubExtension,
4729 Port,
4730 &PortStatus,
4732
4733 if (!NT_SUCCESS(Status))
4734 {
4735 goto ErrorExit;
4736 }
4737
4738 Status = USBD_CreateDeviceEx(HubExtension,
4740 PortStatus.PortStatus,
4741 Port);
4742
4743 if (!NT_SUCCESS(Status))
4744 {
4745 goto ErrorExit;
4746 }
4747
4748 Status = USBH_SyncResetPort(HubExtension, Port);
4749
4750 if (IsWait)
4751 {
4752 USBH_Wait(50);
4753 }
4754
4755 if (!NT_SUCCESS(Status))
4756 {
4757 goto ErrorExit;
4758 }
4759
4760 Status = USBD_InitializeDeviceEx(HubExtension,
4761 *DeviceHandle,
4762 &PortExtension->DeviceDescriptor.bLength,
4763 sizeof(PortExtension->DeviceDescriptor),
4764 &PortExtension->ConfigDescriptor.bLength,
4765 sizeof(PortExtension->ConfigDescriptor));
4766
4767 if (NT_SUCCESS(Status))
4768 {
4769 if (IsKeepDeviceData)
4770 {
4771 Status = USBD_RestoreDeviceEx(HubExtension,
4773 *DeviceHandle);
4774
4775 if (!NT_SUCCESS(Status))
4776 {
4778
4779 USBD_RemoveDeviceEx(HubExtension, Handle, 0);
4780 USBH_SyncDisablePort(HubExtension, Port);
4781
4783 }
4784 }
4785 else
4786 {
4787 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REMOVING_PORT_PDO;
4788 }
4789
4790 goto Exit;
4791 }
4792
4793 *DeviceHandle = NULL;
4794
4795ErrorExit:
4796
4799
4800 if (NewDeviceHandle)
4801 {
4802 Status = USBD_RemoveDeviceEx(HubExtension, NewDeviceHandle, 0);
4803 }
4804
4805Exit:
4806
4807 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
4809 1,
4810 FALSE);
4811
4812 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
4813 {
4814 KeSetEvent(&HubExtension->PendingRequestEvent,
4816 FALSE);
4817 }
4818
4819 return Status;
4820}
ULONG Handle
Definition: gdb_input.c:15
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
NTSTATUS NTAPI USBD_RestoreDeviceEx(IN PUSBHUB_FDO_EXTENSION HubExtension, IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle, IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle)
Definition: usbhub.c:2776
#define USBHUB_PDO_FLAG_REMOVING_PORT_PDO
Definition: usbhub.h:76

Referenced by USBH_ResetPortWorker(), and USBH_RestoreDevice().

◆ USBH_ResetHub()

NTSTATUS NTAPI USBH_ResetHub ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2130 of file usbhub.c.

2131{
2133 ULONG PortStatusFlags = 0;
2134
2135 DPRINT("USBH_ResetHub: ... \n");
2136
2137 Status = USBH_GetPortStatus(HubExtension, &PortStatusFlags);
2138
2139 if (!NT_SUCCESS(Status))
2140 {
2141 return Status;
2142 }
2143
2144 if (!(PortStatusFlags & USBD_PORT_ENABLED))
2145 {
2146 if (PortStatusFlags & USBD_PORT_CONNECTED)
2147 {
2148 USBH_EnableParentPort(HubExtension);
2149 }
2150 }
2151
2152 Status = USBH_ResetInterruptPipe(HubExtension);
2153
2154 return Status;
2155}
NTSTATUS NTAPI USBH_GetPortStatus(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PULONG PortStatus)
Definition: usbhub.c:1992
NTSTATUS NTAPI USBH_EnableParentPort(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2045
NTSTATUS NTAPI USBH_ResetInterruptPipe(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2091
#define USBD_PORT_ENABLED
Definition: usbioctl.h:41
#define USBD_PORT_CONNECTED
Definition: usbioctl.h:42

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_ResetInterruptPipe()

NTSTATUS NTAPI USBH_ResetInterruptPipe ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2091 of file usbhub.c.

2092{
2093 struct _URB_PIPE_REQUEST * Urb;
2095
2096 DPRINT("USBH_ResetInterruptPipe ... \n");
2097
2099 sizeof(struct _URB_PIPE_REQUEST),
2100 USB_HUB_TAG);
2101
2102 if (Urb)
2103 {
2104 RtlZeroMemory(Urb, sizeof(struct _URB_PIPE_REQUEST));
2105
2106 Urb->Hdr.Length = sizeof(struct _URB_PIPE_REQUEST);
2108 Urb->PipeHandle = HubExtension->PipeInfo.PipeHandle;
2109
2110 Status = USBH_FdoSyncSubmitUrb(HubExtension->Common.SelfDevice,
2111 (PURB)Urb);
2112
2114 }
2115 else
2116 {
2118 }
2119
2120 if (NT_SUCCESS(Status))
2121 {
2122 HubExtension->RequestErrors = 0;
2123 }
2124
2125 return Status;
2126}
#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
Definition: usb.h:116

Referenced by USBH_ResetHub().

◆ USBH_SetPdoRegistryParameter()

NTSTATUS NTAPI USBH_SetPdoRegistryParameter ( IN PDEVICE_OBJECT  DeviceObject,
IN PCWSTR  ValueName,
IN PVOID  Data,
IN ULONG  DataSize,
IN ULONG  Type,
IN ULONG  DevInstKeyType 
)

Definition at line 213 of file usbhub.c.

219{
221 UNICODE_STRING ValueNameString;
223
224 DPRINT("USBH_SetPdoRegistryParameter ... \n");
225
226 RtlInitUnicodeString(&ValueNameString, ValueName);
227
231 &KeyHandle);
232
233 if (NT_SUCCESS(Status))
234 {
235 ZwSetValueKey(KeyHandle,
236 &ValueNameString,
237 0,
238 Type,
239 Data,
240 DataSize);
241
243 }
244
245 return Status;
246}
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
Definition: pnpmgr.c:1621
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_In_ ULONG DevInstKeyType
Definition: iofuncs.h:1125

Referenced by USBH_SymbolicLink().

◆ USBH_SubmitStatusChangeTransfer()

NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2457 of file usbhub.c.

2458{
2459 PIRP Irp;
2462 PIO_STACK_LOCATION IoStack;
2463
2464 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: HubExtension - %p, SCEIrp - %p\n",
2465 HubExtension,
2466 HubExtension->SCEIrp);
2467
2468 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_NOT_D0_STATE)
2469 {
2470 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: USBHUB_FDO_FLAG_NOT_D0_STATE\n");
2471 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: HubFlags - %lX\n",
2472 HubExtension->HubFlags);
2473
2475 }
2476
2477 Irp = HubExtension->SCEIrp;
2478
2479 if (!Irp)
2480 {
2482 }
2483
2484 Urb = (struct _URB_BULK_OR_INTERRUPT_TRANSFER *)&HubExtension->SCEWorkerUrb;
2485
2486 Urb->Hdr.Length = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
2488 Urb->Hdr.UsbdDeviceHandle = NULL;
2489
2490 Urb->PipeHandle = HubExtension->PipeInfo.PipeHandle;
2491 Urb->TransferFlags = USBD_SHORT_TRANSFER_OK;
2492 Urb->TransferBuffer = HubExtension->SCEBitmap;
2493 Urb->TransferBufferLength = HubExtension->SCEBitmapLength;
2494 Urb->TransferBufferMDL = NULL;
2495 Urb->UrbLink = NULL;
2496
2498 IoSizeOfIrp(HubExtension->LowerDevice->StackSize),
2499 HubExtension->LowerDevice->StackSize);
2500
2501 IoStack = IoGetNextIrpStackLocation(Irp);
2502
2504 IoStack->Parameters.Others.Argument1 = &HubExtension->SCEWorkerUrb;
2506
2509 HubExtension,
2510 TRUE,
2511 TRUE,
2512 TRUE);
2513
2514 KeClearEvent(&HubExtension->StatusChangeEvent);
2515
2516 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
2517
2518 return Status;
2519}
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
Definition: usb.h:95
NTSTATUS NTAPI USBH_ChangeIndication(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: usbhub.c:2334
#define USBHUB_FDO_FLAG_NOT_D0_STATE
Definition: usbhub.h:43

Referenced by USBH_ChangeIndicationAckChangeComplete(), USBH_ChangeIndicationWorker(), USBH_FdoPower(), USBH_PowerIrpCompletion(), USBH_StartHubFdoDevice(), and USBHUB_RootHubCallBack().

◆ USBH_SyncClearHubStatus()

NTSTATUS NTAPI USBH_SyncClearHubStatus ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  RequestValue 
)

Definition at line 1389 of file usbhub.c.

1391{
1393
1394 DPRINT("USBH_SyncClearHubStatus: RequestValue - %x\n", RequestValue);
1395
1396 RequestType.B = 0;
1397 RequestType.Recipient = BMREQUEST_TO_DEVICE;
1400
1401 return USBH_Transact(HubExtension,
1402 NULL,
1403 0,
1408 RequestValue,
1409 0);
1410}
#define BMREQUEST_TO_DEVICE
Definition: usb100.h:38
#define URB_FUNCTION_CLASS_DEVICE
Definition: usb.h:112
NTSTATUS NTAPI USBH_Transact(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID TransferBuffer, IN ULONG BufferLen, IN BOOLEAN IsDeviceToHost, IN USHORT Function, IN BM_REQUEST_TYPE RequestType, IN UCHAR Request, IN USHORT RequestValue, IN USHORT RequestIndex)
Definition: usbhub.c:370

Referenced by USBH_ProcessHubStateChange().

◆ USBH_SyncClearPortStatus()

NTSTATUS NTAPI USBH_SyncClearPortStatus ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN USHORT  RequestValue 
)

Definition at line 1442 of file usbhub.c.

1445{
1447
1448 DPRINT("USBH_SyncClearPortStatus: Port - %x, RequestValue - %x\n",
1449 Port,
1450 RequestValue);
1451
1452 RequestType.B = 0;
1453 RequestType.Recipient = BMREQUEST_TO_OTHER;
1456
1457 return USBH_Transact(HubExtension,
1458 NULL,
1459 0,
1464 RequestValue,
1465 Port);
1466}

Referenced by USBH_ProcessPortStateChange(), and USBH_StartHubFdoDevice().

◆ USBH_SyncDisablePort()

NTSTATUS NTAPI USBH_SyncDisablePort ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port 
)

Definition at line 1553 of file usbhub.c.

1555{
1556 PUSBHUB_PORT_DATA PortData;
1559
1560 DPRINT("USBH_SyncDisablePort ... \n");
1561
1562 PortData = &HubExtension->PortData[Port - 1];
1563
1564 RequestType.B = 0;
1565 RequestType.Recipient = BMREQUEST_TO_DEVICE;
1568
1569 Status = USBH_Transact(HubExtension,
1570 NULL,
1571 0,
1577 Port);
1578
1579 if (NT_SUCCESS(Status))
1580 {
1582 }
1583
1584 return Status;
1585}
USHORT PortEnabledDisabled
Definition: usb200.h:134
USB_PORT_STATUS PortStatus
Definition: usb200.h:240
USB_20_PORT_STATUS Usb20PortStatus
Definition: usb200.h:223
#define USBHUB_FEATURE_PORT_ENABLE
Definition: usbhub.h:92

Referenced by USBH_FdoCleanup(), USBH_FdoQueryBusRelations(), USBH_PdoRemoveDevice(), USBH_ProcessPortStateChange(), and USBH_ResetDevice().

◆ USBH_SyncGetDeviceConfigurationDescriptor()

NTSTATUS NTAPI USBH_SyncGetDeviceConfigurationDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR  ConfigDescriptor,
IN ULONG  NumberOfBytes,
IN PULONG  OutLength 
)

Definition at line 913 of file usbhub.c.

917{
918 PCOMMON_DEVICE_EXTENSION DeviceExtension;
921
922 DPRINT("USBH_SyncGetDeviceConfigurationDescriptor: ... \n");
923
924 DeviceExtension = DeviceObject->DeviceExtension;
925
926 if (OutLength)
927 {
928 *OutLength = 0;
929 }
930
932 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
934
935 if (!Urb)
936 {
938 }
939
941
943 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST);
944
945 Urb->TransferBufferLength = NumberOfBytes;
946 Urb->TransferBuffer = ConfigDescriptor;
947 Urb->DescriptorType = USB_CONFIGURATION_DESCRIPTOR_TYPE;
948
949 if (DeviceExtension->ExtensionType == USBH_EXTENSION_TYPE_HUB ||
950 DeviceExtension->ExtensionType == USBH_EXTENSION_TYPE_PARENT)
951 {
953 }
954 else
955 {
957 }
958
959 if (OutLength)
960 {
961 *OutLength = Urb->TransferBufferLength;
962 }
963
964 if (Urb)
965 {
967 }
968
969 return Status;
970}
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
Definition: usb100.h:50
#define USBH_EXTENSION_TYPE_PARENT
Definition: usbhub.h:30
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036

Referenced by USBH_GetConfigurationDescriptor().

◆ USBH_SyncGetDeviceHandle()

PUSB_DEVICE_HANDLE NTAPI USBH_SyncGetDeviceHandle ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 832 of file usbhub.c.

833{
834 PIRP Irp;
838 PIO_STACK_LOCATION IoStack;
839
840 DPRINT("USBH_SyncGetDeviceHandle: ... \n");
841
843
844 Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE,
846 NULL,
847 0,
848 NULL,
849 0,
850 TRUE,
851 &Event,
853
854 if (!Irp)
855 {
856 DPRINT1("USBH_SyncGetDeviceHandle: Irp - NULL!\n");
857 return NULL;
858 }
859
861 IoStack->Parameters.Others.Argument1 = &DeviceHandle;
862
864 {
866 Suspended,
868 FALSE,
869 NULL);
870 }
871
872 return DeviceHandle;
873}

Referenced by USBD_CreateDeviceEx(), USBD_Initialize20Hub(), and USBH_StartHubFdoDevice().

◆ USBH_SyncGetHubCount()

NTSTATUS NTAPI USBH_SyncGetHubCount ( IN PDEVICE_OBJECT  DeviceObject,
IN OUT PULONG  OutHubCount 
)

Definition at line 781 of file usbhub.c.

783{
786 PIRP Irp;
787 PIO_STACK_LOCATION IoStack;
789
790 DPRINT("USBH_SyncGetHubCount: *OutHubCount - %x\n", *OutHubCount);
791
793
796 NULL,
797 0,
798 NULL,
799 0,
800 TRUE,
801 &Event,
803
804 if (!Irp)
805 {
807 }
808
810 IoStack->Parameters.Others.Argument1 = OutHubCount;
811
813
814 if (Status == STATUS_PENDING)
815 {
817 Suspended,
819 FALSE,
820 NULL);
821 }
822 else
823 {
825 }
826
827 return IoStatusBlock.Status;
828}
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT
Definition: usbioctl.h:50

Referenced by USBH_PdoInternalControl(), and USBH_StartHubFdoDevice().

◆ USBH_SyncGetHubDescriptor()

NTSTATUS NTAPI USBH_SyncGetHubDescriptor ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 1048 of file usbhub.c.

1049{
1050 PUSB_EXTHUB_INFORMATION_0 ExtendedHubInfo;
1051 ULONG NumberPorts;
1052 PUSBHUB_PORT_DATA PortData;
1053 USHORT RequestValue;
1056 PUSB_HUB_DESCRIPTOR HubDescriptor = NULL;
1057 ULONG ix;
1058 ULONG Retry;
1059
1060 DPRINT("USBH_SyncGetHubDescriptor: ... \n");
1061
1062 ExtendedHubInfo = ExAllocatePoolWithTag(NonPagedPool,
1064 USB_HUB_TAG);
1065
1066 if (!ExtendedHubInfo)
1067 {
1069 goto ErrorExit;
1070 }
1071
1072 RtlZeroMemory(ExtendedHubInfo, sizeof(USB_EXTHUB_INFORMATION_0));
1073
1074 Status = USBHUB_GetExtendedHubInfo(HubExtension, ExtendedHubInfo);
1075
1076 if (!NT_SUCCESS(Status))
1077 {
1078 ExFreePoolWithTag(ExtendedHubInfo, USB_HUB_TAG);
1079 ExtendedHubInfo = NULL;
1080 }
1081
1083
1084 HubDescriptor = ExAllocatePoolWithTag(NonPagedPool,
1086 USB_HUB_TAG);
1087
1088 if (!HubDescriptor)
1089 {
1091 goto ErrorExit;
1092 }
1093
1094 RtlZeroMemory(HubDescriptor, NumberOfBytes);
1095
1096 RequestValue = 0;
1097 Retry = 0;
1098
1099 while (TRUE)
1100 {
1101 while (Retry <= 5)
1102 {
1104
1105 RequestType.B = 0;
1106 RequestType.Recipient = BMREQUEST_TO_DEVICE;
1109
1110 Status = USBH_Transact(HubExtension,
1111 HubDescriptor,
1117 RequestValue,
1118 0);
1119
1120 if (NT_SUCCESS(Status))
1121 {
1122 break;
1123 }
1124
1125 RequestValue = 0x2900; // Hub DescriptorType - 0x29
1126
1127 Retry++;
1128 }
1129
1130 if (HubDescriptor->bDescriptorLength <= NumberOfBytes)
1131 {
1132 break;
1133 }
1134
1135 NumberOfBytes = HubDescriptor->bDescriptorLength;
1136 ExFreePoolWithTag(HubDescriptor, USB_HUB_TAG);
1137
1138 if (Retry >= 5)
1139 {
1141 HubDescriptor = NULL;
1142 goto ErrorExit;
1143 }
1144
1145 HubDescriptor = ExAllocatePoolWithTag(NonPagedPool,
1147 USB_HUB_TAG);
1148
1149 if (!HubDescriptor)
1150 {
1152 goto ErrorExit;
1153 }
1154
1155 RtlZeroMemory(HubDescriptor, NumberOfBytes);
1156 }
1157
1158 NumberPorts = HubDescriptor->bNumberOfPorts;
1159
1160 if (HubExtension->PortData)
1161 {
1162 PortData = HubExtension->PortData;
1163
1164 for (ix = 0; ix < NumberPorts; ix++)
1165 {
1166 PortData[ix].PortStatus.AsUlong32 = 0;
1167
1168 if (ExtendedHubInfo)
1169 {
1170 PortData[ix].PortAttributes = ExtendedHubInfo->Port[ix].PortAttributes;
1171 }
1172 else
1173 {
1174 PortData[ix].PortAttributes = 0;
1175 }
1176
1177 PortData[ix].ConnectionStatus = NoDeviceConnected;
1178
1179 if (PortData[ix].DeviceObject != NULL)
1180 {
1181 PortData[ix].ConnectionStatus = DeviceConnected;
1182 }
1183 }
1184 }
1185 else
1186 {
1187 PortData = NULL;
1188
1189 if (HubDescriptor->bNumberOfPorts)
1190 {
1192 NumberPorts * sizeof(USBHUB_PORT_DATA),
1193 USB_HUB_TAG);
1194 }
1195
1196 if (!PortData)
1197 {
1199 goto ErrorExit;
1200 }
1201
1202 RtlZeroMemory(PortData, NumberPorts * sizeof(USBHUB_PORT_DATA));
1203
1204 for (ix = 0; ix < NumberPorts; ix++)
1205 {
1206 PortData[ix].ConnectionStatus = NoDeviceConnected;
1207
1208 if (ExtendedHubInfo)
1209 {
1210 PortData[ix].PortAttributes = ExtendedHubInfo->Port[ix].PortAttributes;
1211 }
1212 }
1213 }
1214
1215 if (!NT_SUCCESS(Status))
1216 {
1217 goto ErrorExit;
1218 }
1219
1220 HubExtension->HubDescriptor = HubDescriptor;
1221
1222 HubExtension->PortData = PortData;
1223
1224 if (ExtendedHubInfo)
1225 {
1226 ExFreePoolWithTag(ExtendedHubInfo, USB_HUB_TAG);
1227 }
1228
1229 return Status;
1230
1231ErrorExit:
1232
1233 if (HubDescriptor)
1234 {
1235 ExFreePoolWithTag(HubDescriptor, USB_HUB_TAG);
1236 }
1237
1238 if (ExtendedHubInfo)
1239 {
1240 ExFreePoolWithTag(ExtendedHubInfo, USB_HUB_TAG);
1241 }
1242
1243 return Status;
1244}
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
Definition: classpnp.h:312
ULONG PortAttributes
Definition: usbhub.h:121
USB_EXTPORT_INFORMATION_0 Port[255]
Definition: hubbusif.h:732
UCHAR bDescriptorLength
Definition: usb100.h:171
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb100.h:82
struct _USB_HUB_DESCRIPTOR USB_HUB_DESCRIPTOR
#define BMREQUEST_STANDARD
Definition: usb100.h:34
NTSTATUS NTAPI USBHUB_GetExtendedHubInfo(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_EXTHUB_INFORMATION_0 HubInfoBuffer)
Definition: usbhub.c:680
@ DeviceConnected
Definition: usbioctl.h:279

Referenced by USBH_StartHubFdoDevice().

◆ USBH_SyncGetHubStatus()

NTSTATUS NTAPI USBH_SyncGetHubStatus ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_HUB_STATUS_AND_CHANGE  HubStatus,
IN ULONG  Length 
)

Definition at line 1363 of file usbhub.c.

1366{
1368
1369 DPRINT("USBH_SyncGetHubStatus\n");
1370
1371 RequestType.B = 0;
1372 RequestType.Recipient = BMREQUEST_TO_DEVICE;
1375
1376 return USBH_Transact(HubExtension,
1377 HubStatus,
1378 Length,
1383 0,
1384 0);
1385}

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_SyncGetPortStatus()

NTSTATUS NTAPI USBH_SyncGetPortStatus ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN PUSB_PORT_STATUS_AND_CHANGE  PortStatus,
IN ULONG  Length 
)

Definition at line 1414 of file usbhub.c.

1418{
1420
1421 DPRINT("USBH_SyncGetPortStatus: Port - %x\n", Port);
1422
1423 RequestType.B = 0;
1424 RequestType.Recipient = BMREQUEST_TO_OTHER;
1427
1428 return USBH_Transact(HubExtension,
1429 PortStatus,
1430 Length,
1435 0,
1436 Port);
1437}

Referenced by USBH_ChangeIndicationWorker(), USBH_FdoQueryBusRelations(), USBH_PdoIoctlGetPortStatus(), USBH_ResetDevice(), USBH_RestoreDevice(), and USBH_SyncResetPort().

◆ USBH_SyncGetRootHubPdo()

NTSTATUS NTAPI USBH_SyncGetRootHubPdo ( IN PDEVICE_OBJECT  DeviceObject,
IN OUT PDEVICE_OBJECT OutPdo1,
IN OUT PDEVICE_OBJECT OutPdo2 
)

Definition at line 728 of file usbhub.c.

731{
734 PIRP Irp;
735 PIO_STACK_LOCATION IoStack;
737
738 DPRINT("USBH_SyncGetRootHubPdo: ... \n");
739
741
744 NULL,
745 0,
746 NULL,
747 0,
748 TRUE,
749 &Event,
751
752 if (!Irp)
753 {
755 }
756
758 IoStack->Parameters.Others.Argument1 = OutPdo1;
759 IoStack->Parameters.Others.Argument2 = OutPdo2;
760
762
763 if (Status == STATUS_PENDING)
764 {
766 Suspended,
768 FALSE,
769 NULL);
770 }
771 else
772 {
774 }
775
776 return IoStatusBlock.Status;
777}
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
Definition: usbioctl.h:38

Referenced by USBH_FdoStartDevice(), and USBH_StartHubFdoDevice().

◆ USBH_SyncGetStatus()

NTSTATUS NTAPI USBH_SyncGetStatus ( IN PDEVICE_OBJECT  DeviceObject,
IN PUSHORT  OutStatus,
IN USHORT  Function,
IN USHORT  RequestIndex 
)

Definition at line 1323 of file usbhub.c.

1327{
1329 NTSTATUS NtStatus;
1330 USHORT UsbStatus;
1331
1332 DPRINT("USBH_SyncGetStatus: ... \n");
1333
1335 sizeof(struct _URB_CONTROL_GET_STATUS_REQUEST),
1336 USB_HUB_TAG);
1337
1338 if (!Urb)
1339 {
1341 }
1342
1344
1345 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_GET_STATUS_REQUEST);
1346 Urb->Hdr.Function = Function;
1347
1348 Urb->TransferBuffer = &UsbStatus;
1349 Urb->TransferBufferLength = sizeof(UsbStatus);
1350 Urb->Index = RequestIndex;
1351
1353
1354 *OutStatus = UsbStatus;
1355
1357
1358 return NtStatus;
1359}
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156

Referenced by USBH_HubIsBusPowered().

◆ USBH_SyncGetStringDescriptor()

NTSTATUS NTAPI USBH_SyncGetStringDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  Index,
IN USHORT  LanguageId,
IN PUSB_STRING_DESCRIPTOR  Descriptor,
IN ULONG  NumberOfBytes,
IN PULONG  OutLength,
IN BOOLEAN  IsValidateLength 
)

Definition at line 1248 of file usbhub.c.

1255{
1257 ULONG TransferedLength;
1259
1260 DPRINT("USBH_SyncGetStringDescriptor: Index - %x, LanguageId - %x\n",
1261 Index,
1262 LanguageId);
1263
1265 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
1266 USB_HUB_TAG);
1267
1268 if (!Urb)
1269 {
1271 }
1272
1274
1276 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST);
1277
1278 Urb->TransferBuffer = Descriptor;
1279 Urb->TransferBufferLength = NumberOfBytes;
1280
1281 Urb->Index = Index;
1282 Urb->DescriptorType = USB_STRING_DESCRIPTOR_TYPE;
1283 Urb->LanguageId = LanguageId;
1284
1286
1287 if (!NT_SUCCESS(Status))
1288 {
1290 return Status;
1291 }
1292
1293 TransferedLength = Urb->TransferBufferLength;
1294
1295 if (TransferedLength > NumberOfBytes)
1296 {
1298 }
1299
1300 if (!NT_SUCCESS(Status))
1301 {
1303 return Status;
1304 }
1305
1306 if (OutLength)
1307 {
1308 *OutLength = TransferedLength;
1309 }
1310
1311 if (IsValidateLength && TransferedLength != Descriptor->bLength)
1312 {
1314 }
1315
1317
1318 return Status;
1319}
#define USB_STRING_DESCRIPTOR_TYPE
Definition: usb100.h:51

Referenced by USBH_CheckDeviceLanguage(), USBH_GetSerialNumberString(), and USBH_PdoQueryDeviceText().

◆ USBH_SyncIrpComplete()

NTSTATUS NTAPI USBH_SyncIrpComplete ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 92 of file usbhub.c.

95{
96 PUSBHUB_URB_TIMEOUT_CONTEXT HubTimeoutContext;
99
100 DPRINT("USBH_SyncIrpComplete: ... \n");
101
102 HubTimeoutContext = Context;
103
104 KeAcquireSpinLock(&HubTimeoutContext->UrbTimeoutSpinLock, &OldIrql);
105 HubTimeoutContext->IsNormalCompleted = TRUE;
106 TimerCancelled = KeCancelTimer(&HubTimeoutContext->UrbTimeoutTimer);
107 KeReleaseSpinLock(&HubTimeoutContext->UrbTimeoutSpinLock, OldIrql);
108
109 if (TimerCancelled)
110 {
111 KeSetEvent(&HubTimeoutContext->UrbTimeoutEvent,
113 FALSE);
114 }
115
116 return STATUS_SUCCESS;
117}
_Out_ _At_ TimerCancelled PBOOLEAN TimerCancelled
Definition: ndis.h:2820
KSPIN_LOCK UrbTimeoutSpinLock
Definition: usbhub.h:242
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206

Referenced by USBH_SyncSubmitUrb().

◆ USBH_SyncPowerOnPort()

NTSTATUS NTAPI USBH_SyncPowerOnPort ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port,
IN BOOLEAN  IsWait 
)

Definition at line 1470 of file usbhub.c.

1473{
1474 PUSBHUB_PORT_DATA PortData;
1475 PUSB_HUB_DESCRIPTOR HubDescriptor;
1479
1480 DPRINT("USBH_SyncPowerOnPort: Port - %x, IsWait - %x\n", Port, IsWait);
1481
1482 ASSERT(Port > 0);
1483 PortData = &HubExtension->PortData[Port - 1];
1484 PortStatus = &PortData->PortStatus;
1485
1486 if (PortStatus->PortStatus.Usb20PortStatus.CurrentConnectStatus == 1)
1487 {
1488 return Status;
1489 }
1490
1491 RequestType.B = 0;
1492 RequestType.Recipient = BMREQUEST_TO_DEVICE;
1495
1496 Status = USBH_Transact(HubExtension,
1497 NULL,
1498 0,
1504 Port);
1505
1506 if (NT_SUCCESS(Status))
1507 {
1508 if (IsWait)
1509 {
1510 HubDescriptor = HubExtension->HubDescriptor;
1511 USBH_Wait(2 * HubDescriptor->bPowerOnToPowerGood);
1512 }
1513
1514 PortStatus->PortStatus.Usb20PortStatus.CurrentConnectStatus = 1;
1515 }
1516
1517 return Status;
1518}
UCHAR bPowerOnToPowerGood
Definition: usb100.h:175
#define USB_REQUEST_SET_FEATURE
Definition: usb100.h:80
#define USBHUB_FEATURE_PORT_POWER
Definition: usbhub.h:96

Referenced by USBH_SyncPowerOnPorts().

◆ USBH_SyncPowerOnPorts()

NTSTATUS NTAPI USBH_SyncPowerOnPorts ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 1522 of file usbhub.c.

1523{
1524 PUSB_HUB_DESCRIPTOR HubDescriptor;
1526 USHORT Port;
1528
1529 DPRINT("USBH_SyncPowerOnPorts: ... \n");
1530
1531 HubDescriptor = HubExtension->HubDescriptor;
1532 NumberOfPorts = HubDescriptor->bNumberOfPorts;
1533
1534 for (Port = 1; Port <= NumberOfPorts; ++Port)
1535 {
1536 Status = USBH_SyncPowerOnPort(HubExtension, Port, 0);
1537
1538 if (!NT_SUCCESS(Status))
1539 {
1540 DPRINT1("USBH_SyncPowerOnPorts: USBH_SyncPowerOnPort() failed - %lX\n",
1541 Status);
1542 break;
1543 }
1544 }
1545
1546 USBH_Wait(2 * HubDescriptor->bPowerOnToPowerGood);
1547
1548 return Status;
1549}
#define NumberOfPorts()
Definition: portcls.h:444
NTSTATUS NTAPI USBH_SyncPowerOnPort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN BOOLEAN IsWait)
Definition: usbhub.c:1470

Referenced by USBH_StartHubFdoDevice().

◆ USBH_SyncResetPort()

NTSTATUS NTAPI USBH_SyncResetPort ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN USHORT  Port 
)

Definition at line 471 of file usbhub.c.

473{
477 ULONG ResetRetry = 0;
479
480 DPRINT("USBH_SyncResetPort: Port - %x\n", Port);
481
482 InterlockedIncrement(&HubExtension->PendingRequestCount);
483
484 KeWaitForSingleObject(&HubExtension->HubPortSemaphore,
485 Executive,
487 FALSE,
488 NULL);
489
490 Status = USBH_SyncGetPortStatus(HubExtension,
491 Port,
492 &PortStatus,
494
495 if (NT_SUCCESS(Status) &&
496 (PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus == 0))
497 {
499 goto Exit;
500 }
501
502 HubExtension->HubFlags |= USBHUB_FDO_FLAG_RESET_PORT_LOCK;
503
504 while (TRUE)
505 {
507
509
510 InterlockedExchangePointer((PVOID)&HubExtension->pResetPortEvent,
511 &Event);
512
513 RequestType.B = 0;
517
518 Status = USBH_Transact(HubExtension,
519 NULL,
520 0,
526 Port);
527
528 Timeout.QuadPart = -5000 * 10000;
529
530 if (!NT_SUCCESS(Status))
531 {
532 InterlockedExchangePointer((PVOID)&HubExtension->pResetPortEvent,
533 NULL);
534
535 USBH_Wait(10);
536 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_RESET_PORT_LOCK;
537
538 goto Exit;
539 }
540
542 Suspended,
544 FALSE,
545 &Timeout);
546
547 if (Status != STATUS_TIMEOUT)
548 {
549 break;
550 }
551
552 Status = USBH_SyncGetPortStatus(HubExtension,
553 Port,
554 &PortStatus,
556
557 if (!NT_SUCCESS(Status) ||
558 (PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus == 0) ||
559 ResetRetry >= USBHUB_RESET_PORT_MAX_RETRY)
560 {
561 InterlockedExchangePointer((PVOID)&HubExtension->pResetPortEvent,
562 NULL);
563
564 USBH_Wait(10);
565 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_RESET_PORT_LOCK;
566
568 goto Exit;
569 }
570
571 ResetRetry++;
572 }
573
574 Status = USBH_SyncGetPortStatus(HubExtension,
575 Port,
576 &PortStatus,
578
579 if ((PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus == 0) &&
581 HubExtension->HubFlags & USBHUB_FDO_FLAG_USB20_HUB)
582 {
584 }
585
586 USBH_Wait(10);
587 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_RESET_PORT_LOCK;
588
589Exit:
590
591 KeReleaseSemaphore(&HubExtension->HubPortSemaphore,
593 1,
594 FALSE);
595
596 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
597 {
598 KeSetEvent(&HubExtension->PendingRequestEvent,
600 FALSE);
601 }
602
603 return Status;
604}
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
static ULONG Timeout
Definition: ping.c:61
#define USBHUB_FDO_FLAG_USB20_HUB
Definition: usbhub.h:47
#define USBHUB_RESET_PORT_MAX_RETRY
Definition: usbhub.h:107
#define USBHUB_FEATURE_PORT_RESET
Definition: usbhub.h:95
#define USBHUB_FDO_FLAG_RESET_PORT_LOCK
Definition: usbhub.h:40

Referenced by USBH_CreateDevice(), USBH_FdoQueryBusRelations(), and USBH_ResetDevice().

◆ USBH_SyncSubmitUrb()

NTSTATUS NTAPI USBH_SyncSubmitUrb ( IN PDEVICE_OBJECT  DeviceObject,
IN PURB  Urb 
)

Definition at line 250 of file usbhub.c.

252{
255 PIRP Irp;
256 PIO_STACK_LOCATION IoStack;
257 PUSBHUB_URB_TIMEOUT_CONTEXT HubTimeoutContext;
258 BOOLEAN IsWaitTimeout = FALSE;
261
262 DPRINT("USBH_SyncSubmitUrb: ... \n");
263
264 Urb->UrbHeader.UsbdDeviceHandle = NULL;
265
267
270 NULL,
271 0,
272 NULL,
273 0,
274 TRUE,
275 &Event,
277
278 if (!Irp)
279 {
281 }
282
284 IoStack->Parameters.Others.Argument1 = Urb;
285
286 HubTimeoutContext = ExAllocatePoolWithTag(NonPagedPool,
289
290 if (HubTimeoutContext)
291 {
292 RtlZeroMemory(HubTimeoutContext, sizeof(USBHUB_URB_TIMEOUT_CONTEXT));
293
294 HubTimeoutContext->Irp = Irp;
295 HubTimeoutContext->IsNormalCompleted = FALSE;
296
297 KeInitializeEvent(&HubTimeoutContext->UrbTimeoutEvent,
299 FALSE);
300
301 KeInitializeSpinLock(&HubTimeoutContext->UrbTimeoutSpinLock);
302 KeInitializeTimer(&HubTimeoutContext->UrbTimeoutTimer);
303
304 KeInitializeDpc(&HubTimeoutContext->UrbTimeoutDPC,
306 HubTimeoutContext);
307
308 DueTime.QuadPart = -5000 * 10000; // Timeout 5 sec.
309
310 KeSetTimer(&HubTimeoutContext->UrbTimeoutTimer,
311 DueTime,
312 &HubTimeoutContext->UrbTimeoutDPC);
313
316 HubTimeoutContext,
317 TRUE,
318 TRUE,
319 TRUE);
320
321 IsWaitTimeout = TRUE;
322 }
323
325
326 if (Status == STATUS_PENDING)
327 {
329 Suspended,
331 FALSE,
332 NULL);
333 }
334 else
335 {
337 }
338
339 if (IsWaitTimeout)
340 {
341 KeWaitForSingleObject(&HubTimeoutContext->UrbTimeoutEvent,
342 Suspended,
344 FALSE,
345 NULL);
346
347 ExFreePoolWithTag(HubTimeoutContext, USB_HUB_TAG);
348 }
349
350 return IoStatusBlock.Status;
351}
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
NTSTATUS NTAPI USBH_SyncIrpComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: usbhub.c:92
VOID NTAPI USBH_UrbTimeoutDPC(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: usbhub.c:184
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190

Referenced by USBH_FdoSyncSubmitUrb(), USBH_IoctlGetDescriptor(), USBH_SyncGetDeviceConfigurationDescriptor(), and USBH_SyncGetStringDescriptor().

◆ USBH_Transact()

NTSTATUS NTAPI USBH_Transact ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  TransferBuffer,
IN ULONG  BufferLen,
IN BOOLEAN  IsDeviceToHost,
IN USHORT  Function,
IN BM_REQUEST_TYPE  RequestType,
IN UCHAR  Request,
IN USHORT  RequestValue,
IN USHORT  RequestIndex 
)

Definition at line 370 of file usbhub.c.

379{
382 PVOID Buffer = NULL;
385
386 DPRINT("USBH_Transact: ... \n");
387
388 if (BufferLen)
389 {
390 Length = ALIGN_DOWN_BY(BufferLen + sizeof(ULONG), sizeof(ULONG));
391
393
394 if (!Buffer)
395 {
397 }
398
400 }
401
405
406 if (!Urb)
407 {
408 if (Buffer)
409 {
411 }
412
414 }
415
417
418 if (IsDeviceToHost)
419 {
420 if (BufferLen)
421 {
422 RtlZeroMemory(TransferBuffer, BufferLen);
423 }
424
426 }
427 else
428 {
429 if (BufferLen)
430 {
432 }
433
435 }
436
437 Urb->Hdr.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
438 Urb->Hdr.Function = Function;
439 Urb->Hdr.UsbdDeviceHandle = NULL;
440
441 Urb->TransferFlags = TransferFlags;
442 Urb->TransferBuffer = BufferLen != 0 ? Buffer : NULL;
443 Urb->TransferBufferLength = BufferLen;
444 Urb->TransferBufferMDL = NULL;
445 Urb->UrbLink = NULL;
446
447 Urb->RequestTypeReservedBits = RequestType.B;
448 Urb->Request = Request;
449 Urb->Value = RequestValue;
450 Urb->Index = RequestIndex;
451
452 Status = USBH_FdoSyncSubmitUrb(HubExtension->Common.SelfDevice, (PURB)Urb);
453
454 if (IsDeviceToHost && BufferLen)
455 {
457 }
458
459 if (Buffer)
460 {
462 }
463
465
466 return Status;
467}
#define ALIGN_DOWN_BY(size, align)
Definition: bufpool.h:45
#define USBD_TRANSFER_DIRECTION_OUT
Definition: usb.h:159
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547

Referenced by USBH_SyncClearHubStatus(), USBH_SyncClearPortStatus(), USBH_SyncDisablePort(), USBH_SyncGetHubDescriptor(), USBH_SyncGetHubStatus(), USBH_SyncGetPortStatus(), USBH_SyncPowerOnPort(), and USBH_SyncResetPort().

◆ USBH_UrbTimeoutDPC()

VOID NTAPI USBH_UrbTimeoutDPC ( IN PKDPC  Dpc,
IN PVOID  DeferredContext,
IN PVOID  SystemArgument1,
IN PVOID  SystemArgument2 
)

Definition at line 184 of file usbhub.c.

188{
189 PUSBHUB_URB_TIMEOUT_CONTEXT HubTimeoutContext;
191 BOOL IsCompleted;
192
193 DPRINT("USBH_TimeoutDPC ... \n");
194
195 HubTimeoutContext = DeferredContext;
196
197 KeAcquireSpinLock(&HubTimeoutContext->UrbTimeoutSpinLock, &OldIrql);
198 IsCompleted = HubTimeoutContext->IsNormalCompleted;
199 KeReleaseSpinLock(&HubTimeoutContext->UrbTimeoutSpinLock, OldIrql);
200
201 if (!IsCompleted)
202 {
203 IoCancelIrp(HubTimeoutContext->Irp);
204 }
205
206 KeSetEvent(&HubTimeoutContext->UrbTimeoutEvent,
208 FALSE);
209}
unsigned int BOOL
Definition: ntddk_ex.h:94
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:739

Referenced by USBH_SyncSubmitUrb().

◆ USBH_ValidateSerialNumberString()

BOOLEAN NTAPI USBH_ValidateSerialNumberString ( IN PUSHORT  SerialNumberString)

Definition at line 4234 of file usbhub.c.

4235{
4236 USHORT ix;
4237 USHORT Symbol;
4238
4239 DPRINT("USBH_ValidateSerialNumberString: ... \n");
4240
4241 for (ix = 0; SerialNumberString[ix] != UNICODE_NULL; ix++)
4242 {
4243 Symbol = SerialNumberString[ix];
4244
4245 if (Symbol < 0x20 || Symbol > 0x7F || Symbol == 0x2C) // ','
4246 {
4247 return FALSE;
4248 }
4249 }
4250
4251 return TRUE;
4252}
Definition: Symbol.h:9

Referenced by USBH_CreateDevice().

◆ USBH_Wait()

NTSTATUS NTAPI USBH_Wait ( IN ULONG  Milliseconds)

Definition at line 23 of file usbhub.c.

24{
26
27 DPRINT("USBH_Wait: Milliseconds - %x\n", Milliseconds);
28 Interval.QuadPart = -10000LL * Milliseconds - ((ULONGLONG)KeQueryTimeIncrement() - 1);
30}
#define KeDelayExecutionThread(mode, foo, t)
Definition: env_spec_w32.h:484
DWORD Interval
Definition: netstat.c:30
ULONG NTAPI KeQueryTimeIncrement(VOID)
Definition: clock.c:153
uint64_t ULONGLONG
Definition: typedefs.h:67

Referenced by USBH_CreateDevice(), USBH_FdoQueryBusRelations(), USBH_HubSetD0(), USBH_ResetDevice(), USBH_RestoreDevice(), USBH_SyncPowerOnPort(), USBH_SyncPowerOnPorts(), and USBH_SyncResetPort().

◆ USBH_Worker()

VOID NTAPI USBH_Worker ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  Context 
)

Definition at line 2887 of file usbhub.c.

2889{
2890 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
2891 PUSBHUB_FDO_EXTENSION HubExtension;
2892 KIRQL OldIrql;
2894
2895 DPRINT("USBH_Worker: HubIoWorkItem - %p\n", Context);
2896
2897 HubIoWorkItem = Context;
2898
2899 InterlockedDecrement(&HubIoWorkItem->HubWorkerQueued);
2900
2901 HubExtension = HubIoWorkItem->HubExtension;
2902 WorkItem = HubIoWorkItem->HubWorkItem;
2903
2904 HubIoWorkItem->HubWorkerRoutine(HubIoWorkItem->HubExtension,
2905 HubIoWorkItem->HubWorkItemBuffer);
2906
2907 KeAcquireSpinLock(&HubExtension->WorkItemSpinLock, &OldIrql);
2908 RemoveEntryList(&HubIoWorkItem->HubWorkItemLink);
2910
2911 if (HubIoWorkItem->HubWorkItemBuffer)
2912 {
2914 }
2915
2916 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2917
2918 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
2919 {
2920 KeSetEvent(&HubExtension->PendingRequestEvent,
2922 FALSE);
2923 }
2924
2926
2927 DPRINT("USBH_Worker: HubIoWorkItem %p complete\n", Context);
2928}
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
KSPIN_LOCK WorkItemSpinLock
Definition: usbhub.h:191
LIST_ENTRY HubWorkItemLink
Definition: usbhub.h:133

Referenced by USBH_QueueWorkItem().

◆ USBH_WriteFailReasonID()

NTSTATUS NTAPI USBH_WriteFailReasonID ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  FailReason 
)

Definition at line 153 of file usbhub.c.

155{
159
160 DPRINT("USBH_WriteFailReason: ID - %x\n", FailReason);
161
165 &KeyHandle);
166
167 if (NT_SUCCESS(Status))
168 {
169 ZwSetValueKey(KeyHandle,
170 &ValueName,
171 0,
172 REG_DWORD,
173 &FailReason,
174 sizeof(FailReason));
175
177 }
178
179 return Status;
180}
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define PLUGPLAY_REGKEY_DEVICE
Definition: iofuncs.h:2786

Referenced by USBH_StartHubFdoDevice().

◆ USBHUB_FlushAllTransfers()

VOID NTAPI USBHUB_FlushAllTransfers ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2638 of file usbhub.c.

2639{
2640 PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
2641
2642 DPRINT("USBHUB_FlushAllTransfers ... \n");
2643
2644 FlushTransfers = HubExtension->BusInterface.FlushTransfers;
2645
2646 if (FlushTransfers)
2647 {
2648 FlushTransfers(HubExtension->BusInterface.BusContext, NULL);
2649 }
2650}
USB_BUSIFFN_FLUSH_TRANSFERS * PUSB_BUSIFFN_FLUSH_TRANSFERS
Definition: hubbusif.h:287

Referenced by USBH_PdoRemoveDevice().

◆ USBHUB_GetExtendedHubInfo()

NTSTATUS NTAPI USBHUB_GetExtendedHubInfo ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PUSB_EXTHUB_INFORMATION_0  HubInfoBuffer 
)

Definition at line 680 of file usbhub.c.

682{
683 PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
684 ULONG dummy = 0;
685
686 DPRINT("USBHUB_GetExtendedHubInfo: ... \n");
687
688 GetExtendedHubInformation = HubExtension->BusInterface.GetExtendedHubInformation;
689
690 return GetExtendedHubInformation(HubExtension->BusInterface.BusContext,
691 HubExtension->LowerPDO,
692 HubInfoBuffer,
694 &dummy);
695}
USB_BUSIFFN_GET_EXTENDED_HUB_INFO * PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO
Definition: hubbusif.h:214

Referenced by USBH_SyncGetHubDescriptor().

◆ USBHUB_RootHubCallBack()

VOID NTAPI USBHUB_RootHubCallBack ( IN PVOID  Context)

Definition at line 2972 of file usbhub.c.

2973{
2974 PUSBHUB_FDO_EXTENSION HubExtension;
2975
2976 DPRINT("USBHUB_RootHubCallBack: ... \n");
2977
2978 HubExtension = Context;
2979
2980 if (HubExtension->SCEIrp)
2981 {
2982 HubExtension->HubFlags |= (USBHUB_FDO_FLAG_DO_ENUMERATION |
2984
2985 USBH_SubmitStatusChangeTransfer(HubExtension);
2986
2988 }
2989 else
2990 {
2992 }
2993
2994 KeSetEvent(&HubExtension->RootHubNotificationEvent,
2996 FALSE);
2997}
KEVENT RootHubNotificationEvent
Definition: usbhub.h:174

Referenced by USBD_RegisterRootHubCallBack().

◆ USBHUB_SetDeviceHandleData()

VOID NTAPI USBHUB_SetDeviceHandleData ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PDEVICE_OBJECT  UsbDevicePdo,
IN PVOID  DeviceHandle 
)

Definition at line 2616 of file usbhub.c.

2619{
2620 PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
2621
2622 DPRINT("USBHUB_SetDeviceHandleData ... \n");
2623
2624 SetDeviceHandleData = HubExtension->BusInterface.SetDeviceHandleData;
2625
2626 if (!SetDeviceHandleData)
2627 {
2628 return;
2629 }
2630
2631 SetDeviceHandleData(HubExtension->BusInterface.BusContext,
2633 UsbDevicePdo);
2634}
_In_ PVOID _In_ PDEVICE_OBJECT UsbDevicePdo
Definition: hubbusif.h:322
USB_BUSIFFN_SET_DEVHANDLE_DATA * PUSB_BUSIFFN_SET_DEVHANDLE_DATA
Definition: hubbusif.h:323

Referenced by USBH_PdoStartDevice().

Variable Documentation

◆ GenericUSBDeviceString

PWSTR GenericUSBDeviceString = NULL

Definition at line 19 of file usbhub.c.

Referenced by DriverEntry(), USBH_DriverUnload(), and USBH_PdoQueryDeviceText().