ReactOS 0.4.16-dev-1946-g52006dd
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 5128 of file usbhub.c.

5130{
5131 DPRINT("USBHUB: DriverEntry - %wZ\n", RegistryPath);
5132
5133 DriverObject->DriverExtension->AddDevice = USBH_AddDevice;
5134 DriverObject->DriverUnload = USBH_DriverUnload;
5135
5137 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBH_HubDispatch;
5138
5141
5142 DriverObject->MajorFunction[IRP_MJ_PNP] = USBH_HubDispatch;
5143 DriverObject->MajorFunction[IRP_MJ_POWER] = USBH_HubDispatch;
5145
5147
5148 return STATUS_SUCCESS;
5149}
#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:4960
NTSTATUS NTAPI USBH_HubDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: usbhub.c:5047
PWSTR GenericUSBDeviceString
Definition: usbhub.c:19
NTSTATUS NTAPI USBH_RegQueryGenericUSBDeviceString(PVOID USBDeviceString)
Definition: usbhub.c:5103
VOID NTAPI USBH_DriverUnload(IN PDRIVER_OBJECT DriverObject)
Definition: usbhub.c:5034
_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 2521 of file usbhub.c.

2525{
2527 PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
2528
2529 DPRINT("USBD_CreateDeviceEx: Port - %x, UsbPortStatus - 0x%04X\n",
2530 Port,
2531 UsbPortStatus.AsUshort16);
2532
2533 CreateUsbDevice = HubExtension->BusInterface.CreateUsbDevice;
2534
2535 if (!CreateUsbDevice)
2536 {
2538 }
2539
2540 HubDeviceHandle = USBH_SyncGetDeviceHandle(HubExtension->LowerDevice);
2541
2542 return CreateUsbDevice(HubExtension->BusInterface.BusContext,
2543 OutDeviceHandle,
2545 UsbPortStatus.AsUshort16,
2546 Port);
2547}
#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 2652 of file usbhub.c.

2657{
2660 SIZE_T DeviceInfoLength;
2661 PUSB_NODE_CONNECTION_INFORMATION_EX NodeInfo;
2662 SIZE_T NodeInfoLength;
2663 ULONG PipeNumber;
2664 ULONG dummy;
2666
2667 DPRINT("USBD_GetDeviceInformationEx ... \n");
2668
2669 QueryDeviceInformation = HubExtension->BusInterface.QueryDeviceInformation;
2670
2672 {
2674 return Status;
2675 }
2676
2677 DeviceInfoLength = sizeof(USB_DEVICE_INFORMATION_0);
2678
2679 while (TRUE)
2680 {
2682 DeviceInfoLength,
2683 USB_HUB_TAG);
2684
2685 if (!DeviceInfo)
2686 {
2688 }
2689
2690 RtlZeroMemory(DeviceInfo, DeviceInfoLength);
2691
2692 DeviceInfo->InformationLevel = 0;
2693
2694 Status = QueryDeviceInformation(HubExtension->BusInterface.BusContext,
2696 DeviceInfo,
2697 DeviceInfoLength,
2698 &dummy);
2699
2701 {
2702 break;
2703 }
2704
2705 DeviceInfoLength = DeviceInfo->ActualLength;
2706
2708 }
2709
2710 NodeInfo = NULL;
2711 NodeInfoLength = 0;
2712
2713 if (NT_SUCCESS(Status))
2714 {
2715 NodeInfoLength = (sizeof(USB_NODE_CONNECTION_INFORMATION_EX) - sizeof(USB_PIPE_INFO)) +
2716 DeviceInfo->NumberOfOpenPipes * sizeof(USB_PIPE_INFO);
2717
2718 NodeInfo = ExAllocatePoolWithTag(PagedPool, NodeInfoLength, USB_HUB_TAG);
2719
2720 if (!NodeInfo)
2721 {
2724 }
2725
2726 RtlZeroMemory(NodeInfo, NodeInfoLength);
2727
2728 NodeInfo->ConnectionIndex = Info->ConnectionIndex;
2729
2730 RtlCopyMemory(&NodeInfo->DeviceDescriptor,
2731 &DeviceInfo->DeviceDescriptor,
2732 sizeof(USB_DEVICE_DESCRIPTOR));
2733
2734 NodeInfo->CurrentConfigurationValue = DeviceInfo->CurrentConfigurationValue;
2735 NodeInfo->Speed = DeviceInfo->DeviceSpeed;
2736 NodeInfo->DeviceIsHub = PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_HUB_DEVICE;
2737 NodeInfo->DeviceAddress = DeviceInfo->DeviceAddress;
2738 NodeInfo->NumberOfOpenPipes = DeviceInfo->NumberOfOpenPipes;
2739 NodeInfo->ConnectionStatus = Info->ConnectionStatus;
2740
2741 for (PipeNumber = 0;
2742 PipeNumber < DeviceInfo->NumberOfOpenPipes;
2743 PipeNumber++)
2744 {
2745 RtlCopyMemory(&NodeInfo->PipeList[PipeNumber],
2746 &DeviceInfo->PipeList[PipeNumber],
2747 sizeof(USB_PIPE_INFO));
2748 }
2749 }
2750
2752
2753 if (NodeInfo)
2754 {
2755 if (NodeInfoLength <= Length)
2756 {
2757 Length = NodeInfoLength;
2758 }
2759 else
2760 {
2762 }
2763
2764 RtlCopyMemory(Info, NodeInfo, Length);
2765
2766 ExFreePoolWithTag(NodeInfo, USB_HUB_TAG);
2767 }
2768
2769 return Status;
2770}
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 2575 of file usbhub.c.

2581{
2583 PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
2584 PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
2585
2586 DPRINT("USBD_InitializeDeviceEx: ... \n");
2587
2588 InitializeUsbDevice = HubExtension->BusInterface.InitializeUsbDevice;
2589 GetUsbDescriptors = HubExtension->BusInterface.GetUsbDescriptors;
2590
2591 if (!InitializeUsbDevice || !GetUsbDescriptors)
2592 {
2594 }
2595
2596 Status = InitializeUsbDevice(HubExtension->BusInterface.BusContext,
2597 DeviceHandle);
2598
2599 if (!NT_SUCCESS(Status))
2600 {
2601 return Status;
2602 }
2603
2604 return GetUsbDescriptors(HubExtension->BusInterface.BusContext,
2610}
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 2999 of file usbhub.c.

3000{
3001 PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
3002
3003 DPRINT("USBD_RegisterRootHubCallBack: ... \n");
3004
3005 RootHubInitNotification = HubExtension->BusInterface.RootHubInitNotification;
3006
3007 if (!RootHubInitNotification)
3008 {
3010 }
3011
3012 KeClearEvent(&HubExtension->RootHubNotificationEvent);
3013
3014 return RootHubInitNotification(HubExtension->BusInterface.BusContext,
3015 HubExtension,
3017}
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:2970

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 2551 of file usbhub.c.

2554{
2555 PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
2556
2557 DPRINT("USBD_RemoveDeviceEx: DeviceHandle - %p, Flags - %X\n",
2559 Flags);
2560
2561 RemoveUsbDevice = HubExtension->BusInterface.RemoveUsbDevice;
2562
2563 if (!RemoveUsbDevice)
2564 {
2566 }
2567
2568 return RemoveUsbDevice(HubExtension->BusInterface.BusContext,
2570 Flags);
2571}
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 2774 of file usbhub.c.

2777{
2778 PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
2780
2781 DPRINT("USBD_RestoreDeviceEx: HubExtension - %p, OldDeviceHandle - %p, NewDeviceHandle - %p\n",
2782 HubExtension,
2785
2786 RestoreUsbDevice = HubExtension->BusInterface.RestoreUsbDevice;
2787
2788 if (RestoreUsbDevice)
2789 {
2790 Status = RestoreUsbDevice(HubExtension->BusInterface.BusContext,
2793 }
2794 else
2795 {
2797 }
2798
2799 return Status;
2800}
_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 3021 of file usbhub.c.

3022{
3023 PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
3025
3026 DPRINT("USBD_UnRegisterRootHubCallBack ... \n");
3027
3028 RootHubInitNotification = HubExtension->BusInterface.RootHubInitNotification;
3029
3030 if (!RootHubInitNotification)
3031 {
3033 }
3034
3035 Status = RootHubInitNotification(HubExtension->BusInterface.BusContext,
3036 NULL,
3037 NULL);
3038
3039 if (!NT_SUCCESS(Status))
3040 {
3041 KeWaitForSingleObject(&HubExtension->RootHubNotificationEvent,
3042 Executive,
3043 KernelMode,
3044 FALSE,
3045 NULL);
3046 }
3047
3048 return Status;
3049}
#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 4960 of file usbhub.c.

4962{
4965 PUSBHUB_FDO_EXTENSION HubExtension;
4966 PDEVICE_OBJECT LowerDevice;
4967
4968 DPRINT("USBH_AddDevice: DriverObject - %p, LowerPDO - %p\n",
4970 LowerPDO);
4971
4973
4975 sizeof(USBHUB_FDO_EXTENSION),
4976 NULL,
4977 0x8600,
4979 FALSE,
4980 &DeviceObject);
4981
4982 if (!NT_SUCCESS(Status))
4983 {
4984 DPRINT1("USBH_AddDevice: IoCreateDevice() fail\n");
4985
4986 if (DeviceObject)
4987 {
4989 }
4990
4991 return Status;
4992 }
4993
4994 DPRINT("USBH_AddDevice: DeviceObject - %p\n", DeviceObject);
4995
4996 HubExtension = DeviceObject->DeviceExtension;
4997 RtlZeroMemory(HubExtension, sizeof(USBHUB_FDO_EXTENSION));
4998
5000
5001 LowerDevice = IoAttachDeviceToDeviceStack(DeviceObject, LowerPDO);
5002
5003 if (!LowerDevice)
5004 {
5005 DPRINT1("USBH_AddDevice: IoAttachDeviceToDeviceStack() fail\n");
5006
5007 if (DeviceObject)
5008 {
5010 }
5011
5012 return STATUS_UNSUCCESSFUL;
5013 }
5014
5015 DPRINT("USBH_AddDevice: LowerDevice - %p\n", LowerDevice);
5016
5017 HubExtension->Common.SelfDevice = DeviceObject;
5018
5019 HubExtension->LowerPDO = LowerPDO;
5020 HubExtension->LowerDevice = LowerDevice;
5021
5022 KeInitializeSemaphore(&HubExtension->IdleSemaphore, 1, 1);
5023
5025 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
5026
5027 DPRINT("USBH_AddDevice: call IoWMIRegistrationControl() UNIMPLEMENTED. FIXME\n");
5028
5029 return Status;
5030}
#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 2804 of file usbhub.c.

2810{
2811 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
2813 PVOID WorkItemBuffer;
2814
2815 DPRINT("USBH_AllocateWorkItem: ... \n");
2816
2817 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_WITEM_INIT))
2818 {
2820 }
2821
2822 HubIoWorkItem = ExAllocatePoolWithTag(NonPagedPool,
2823 sizeof(USBHUB_IO_WORK_ITEM),
2824 USB_HUB_TAG);
2825
2826 if (!HubIoWorkItem)
2827 {
2829 }
2830
2831 RtlZeroMemory(HubIoWorkItem, sizeof(USBHUB_IO_WORK_ITEM));
2832
2834
2835 HubIoWorkItem->HubWorkItem = WorkItem;
2836
2837 if (!WorkItem)
2838 {
2839 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2841 }
2842
2843 if (BufferLength && OutHubWorkItemBuffer)
2844 {
2845 WorkItemBuffer = ExAllocatePoolWithTag(NonPagedPool,
2847 USB_HUB_TAG);
2848
2849 HubIoWorkItem->HubWorkItemBuffer = WorkItemBuffer;
2850
2851 if (!WorkItemBuffer)
2852 {
2853 IoFreeWorkItem(HubIoWorkItem->HubWorkItem);
2854 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2855
2857 }
2858
2859 RtlZeroMemory(WorkItemBuffer, BufferLength);
2860 }
2861 else
2862 {
2863 HubIoWorkItem->HubWorkItemBuffer = NULL;
2864 }
2865
2866 HubIoWorkItem->HubWorkItemType = Type;
2867 HubIoWorkItem->HubExtension = HubExtension;
2868 HubIoWorkItem->HubWorkerRoutine = WorkerRoutine;
2869
2870 if (OutHubIoWorkItem)
2871 {
2872 *OutHubIoWorkItem = HubIoWorkItem;
2873 }
2874
2875 if (OutHubWorkItemBuffer)
2876 {
2877 *OutHubWorkItemBuffer = HubIoWorkItem->HubWorkItemBuffer;
2878 }
2879
2880 return STATUS_SUCCESS;
2881}
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 2332 of file usbhub.c.

2335{
2336 PUSBHUB_FDO_EXTENSION HubExtension;
2337 USBD_STATUS UrbStatus;
2338 BOOLEAN IsErrors = FALSE;
2339 PUSBHUB_IO_WORK_ITEM HubWorkItem;
2340 PUSBHUB_STATUS_CHANGE_CONTEXT HubWorkItemBuffer;
2341 USHORT NumPorts;
2342 USHORT Port;
2344 PVOID Bitmap;
2346
2347 HubExtension = Context;
2348 UrbStatus = HubExtension->SCEWorkerUrb.Hdr.Status;
2349
2350 DPRINT_SCE("USBH_ChangeIndication: IrpStatus - %x, UrbStatus - %x, HubFlags - %lX\n",
2351 Irp->IoStatus.Status,
2352 UrbStatus,
2353 HubExtension->HubFlags);
2354
2355 if (NT_ERROR(Irp->IoStatus.Status) || USBD_ERROR(UrbStatus) ||
2356 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED) ||
2357 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING))
2358 {
2359 HubExtension->RequestErrors++;
2360
2361 IsErrors = TRUE;
2362
2363 KeSetEvent(&HubExtension->StatusChangeEvent,
2365 FALSE);
2366
2367 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING ||
2368 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED ||
2369 HubExtension->RequestErrors > USBHUB_MAX_REQUEST_ERRORS ||
2370 Irp->IoStatus.Status == STATUS_DELETE_PENDING)
2371 {
2372 DPRINT_SCE("USBH_ChangeIndication: HubExtension->RequestErrors - %x\n",
2373 HubExtension->RequestErrors);
2374
2376 }
2377
2378 DPRINT_SCE("USBH_ChangeIndication: HubExtension->RequestErrors - %x\n",
2379 HubExtension->RequestErrors);
2380 }
2381 else
2382 {
2383 HubExtension->RequestErrors = 0;
2384 }
2385
2387 HubExtension->SCEBitmapLength;
2388
2389 Status = USBH_AllocateWorkItem(HubExtension,
2390 &HubWorkItem,
2393 (PVOID *)&HubWorkItemBuffer,
2395
2396 if (!NT_SUCCESS(Status))
2397 {
2399 }
2400
2401 RtlZeroMemory(HubWorkItemBuffer, BufferLength);
2402
2403 HubWorkItemBuffer->IsRequestErrors = FALSE;
2404
2405 if (IsErrors)
2406 {
2407 HubWorkItemBuffer->IsRequestErrors = TRUE;
2408 }
2409
2410 if (InterlockedIncrement(&HubExtension->ResetRequestCount) == 1)
2411 {
2412 KeClearEvent(&HubExtension->ResetEvent);
2413 }
2414
2415 HubWorkItemBuffer->HubExtension = HubExtension;
2416
2417 HubExtension->WorkItemToQueue = HubWorkItem;
2418
2419 Bitmap = HubWorkItemBuffer + 1;
2420
2422 HubExtension->SCEBitmap,
2423 HubExtension->SCEBitmapLength);
2424
2425 NumPorts = HubExtension->HubDescriptor->bNumberOfPorts;
2426
2427 for (Port = 0; Port <= NumPorts; ++Port)
2428 {
2429 if (IsBitSet(Bitmap, Port))
2430 {
2431 break;
2432 }
2433 }
2434
2435 if (Port > NumPorts)
2436 {
2437 Port = 0;
2438 }
2439
2441 HubExtension->ResetPortIrp,
2442 &HubExtension->SCEWorkerUrb,
2443 Port);
2444
2445 if (NT_ERROR(Status))
2446 {
2447 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_FAILED;
2448 }
2449
2451}
#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:2804
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::@4278::@4317 Others
struct _IO_STACK_LOCATION::@1694::@1695 DeviceIoControl
union _IO_STACK_LOCATION::@1694 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:2455

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:2950
VOID NTAPI USBH_QueueWorkItem(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
Definition: usbhub.c:2930
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 DPRINT1("USBH_ChangeIndicationWorker: USBHUB_FDO_FLAG_ESD_RECOVERING FIXME\n");
2238 DbgBreakPoint();
2239
2240 goto Exit;
2241 }
2242
2243Enum:
2244
2245 if (WorkItem->IsRequestErrors)
2246 {
2247 USBH_ResetHub(HubExtension);
2248 }
2249 else
2250 {
2251 for (Port = 0;
2252 Port < HubExtension->HubDescriptor->bNumberOfPorts;
2253 Port++)
2254 {
2255 if (IsBitSet((PUCHAR)(WorkItem + 1), Port))
2256 {
2257 break;
2258 }
2259 }
2260
2261 if (Port)
2262 {
2263 Status = USBH_SyncGetPortStatus(HubExtension,
2264 Port,
2265 &PortStatus,
2266 sizeof(PortStatus));
2267 }
2268 else
2269 {
2270 Status = USBH_SyncGetHubStatus(HubExtension,
2271 &HubStatus,
2272 sizeof(HubStatus));
2273 }
2274
2275 if (NT_SUCCESS(Status))
2276 {
2277 if (Port)
2278 {
2279 USBH_ProcessPortStateChange(HubExtension,
2280 Port,
2281 &PortStatus);
2282 }
2283 else
2284 {
2285 USBH_ProcessHubStateChange(HubExtension,
2286 &HubStatus);
2287 }
2288 }
2289 else
2290 {
2291 HubExtension->RequestErrors++;
2292
2293 if (HubExtension->RequestErrors > USBHUB_MAX_REQUEST_ERRORS)
2294 {
2295 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_FAILED;
2296 goto Exit;
2297 }
2298 }
2299 }
2300
2301 USBH_SubmitStatusChangeTransfer(HubExtension);
2302
2303Exit:
2304
2305 KeReleaseSemaphore(&HubExtension->HubSemaphore,
2307 1,
2308 FALSE);
2309
2310 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
2311 {
2312 KeSetEvent(&HubExtension->PendingRequestEvent,
2314 FALSE);
2315 }
2316
2317 if (!InterlockedDecrement((PLONG)&HubExtension->ResetRequestCount))
2318 {
2319 KeSetEvent(&HubExtension->ResetEvent,
2321 FALSE);
2322
2323 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEFER_CHECK_IDLE)
2324 {
2325 USBH_CheckHubIdle(HubExtension);
2326 }
2327 }
2328}
MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR *DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey)
Definition: mmixer.c:220
_Outptr_ PUSB_DEVICE_HANDLE _In_ PUSB_DEVICE_HANDLE _In_ USHORT PortStatus
Definition: hubbusif.h:42
NTSYSAPI void WINAPI DbgBreakPoint(void)
#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:3821
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 4180 of file usbhub.c.

4185{
4186 PDEVICE_OBJECT PortDevice;
4187 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4188 ULONG Port;
4189 SIZE_T NumberBytes;
4190
4191 DPRINT("USBH_CheckDeviceIDUnique: idVendor - 0x%04X, idProduct - 0x%04X\n",
4192 idVendor,
4193 idProduct);
4194
4195 if (!HubExtension->HubDescriptor->bNumberOfPorts)
4196 {
4197 return TRUE;
4198 }
4199
4200 for (Port = 0; Port < HubExtension->HubDescriptor->bNumberOfPorts; Port++)
4201 {
4202 PortDevice = HubExtension->PortData[Port].DeviceObject;
4203
4204 if (PortDevice)
4205 {
4206 PortExtension = PortDevice->DeviceExtension;
4207
4208 if (PortExtension->DeviceDescriptor.idVendor == idVendor &&
4209 PortExtension->DeviceDescriptor.idProduct == idProduct &&
4210 PortExtension->SN_DescriptorLength == SN_DescriptorLength)
4211 {
4212 if (PortExtension->SerialNumber)
4213 {
4214 NumberBytes = RtlCompareMemory(PortExtension->SerialNumber,
4216 SN_DescriptorLength);
4217
4218 if (NumberBytes == SN_DescriptorLength)
4219 {
4220 return FALSE;
4221 }
4222 }
4223 }
4224 }
4225 }
4226
4227 return TRUE;
4228}
#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 4255 of file usbhub.c.

4257{
4260 ULONG NumSymbols;
4261 ULONG ix;
4262 PWCHAR pSymbol;
4263 ULONG Length;
4264
4265 DPRINT("USBH_CheckDeviceLanguage: LanguageId - 0x%04X\n", LanguageId);
4266
4269 USB_HUB_TAG);
4270
4271 if (!Descriptor)
4272 {
4274 }
4275
4277
4279 0,
4280 0,
4281 Descriptor,
4283 &Length,
4284 TRUE);
4285
4286 if (!NT_SUCCESS(Status) ||
4287 Length < sizeof(USB_COMMON_DESCRIPTOR))
4288 {
4289 goto Exit;
4290 }
4291
4292 NumSymbols = (Length -
4293 FIELD_OFFSET(USB_STRING_DESCRIPTOR, bString)) / sizeof(WCHAR);
4294
4295 pSymbol = Descriptor->bString;
4296
4297 for (ix = 1; ix < NumSymbols; ix++)
4298 {
4299 if (*pSymbol == (WCHAR)LanguageId)
4300 {
4302 goto Exit;
4303 }
4304
4305 pSymbol++;
4306 }
4307
4309
4310Exit:
4312 return Status;
4313}
#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 3821 of file usbhub.c.

3822{
3823 PDEVICE_OBJECT PdoDevice;
3824 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3825 PUSBHUB_PORT_DATA PortData;
3826 ULONG HubFlags;
3827 ULONG Port;
3828 KIRQL Irql;
3829 BOOLEAN IsHubIdle = FALSE;
3830 BOOLEAN IsAllPortsIdle;
3831 BOOLEAN IsHubCheck = TRUE;
3832
3833 DPRINT("USBH_CheckHubIdle: FIXME !!! HubExtension - %p\n", HubExtension);
3834
3835return; //HACK: delete it line after fixing Power Manager!!!
3836
3837 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3838
3839 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_CHECK_IDLE_LOCK)
3840 {
3841 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3842 return;
3843 }
3844
3845 HubExtension->HubFlags |= USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3846 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3847
3848 if (USBH_GetRootHubExtension(HubExtension)->SystemPowerState.SystemState != PowerSystemWorking)
3849 {
3850 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3851 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3852 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3853 return;
3854 }
3855
3856 HubFlags = HubExtension->HubFlags;
3857 DPRINT("USBH_CheckHubIdle: HubFlags - %lX\n", HubFlags);
3858
3859 if (!(HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED) ||
3860 !(HubFlags & USBHUB_FDO_FLAG_DO_ENUMERATION))
3861 {
3862 goto Exit;
3863 }
3864
3865 if (HubFlags & USBHUB_FDO_FLAG_NOT_ENUMERATED ||
3867 HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED ||
3869 HubFlags & USBHUB_FDO_FLAG_DEVICE_REMOVED ||
3870 HubFlags & USBHUB_FDO_FLAG_STATE_CHANGING ||
3871 HubFlags & USBHUB_FDO_FLAG_WAKEUP_START ||
3873 {
3874 goto Exit;
3875 }
3876
3877 if (HubExtension->ResetRequestCount)
3878 {
3879 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEFER_CHECK_IDLE;
3880 goto Exit;
3881 }
3882
3883 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DEFER_CHECK_IDLE;
3884
3885 InterlockedIncrement(&HubExtension->PendingRequestCount);
3886
3887 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
3888 Executive,
3889 KernelMode,
3890 FALSE,
3891 NULL);
3892
3894
3895 IsAllPortsIdle = TRUE;
3896
3897 PortData = HubExtension->PortData;
3898
3899 for (Port = 0;
3900 Port < HubExtension->HubDescriptor->bNumberOfPorts;
3901 Port++)
3902 {
3903 PdoDevice = PortData[Port].DeviceObject;
3904
3905 if (PdoDevice)
3906 {
3907 PortExtension = PdoDevice->DeviceExtension;
3908
3909 if (!PortExtension->IdleNotificationIrp)
3910 {
3911 DPRINT("USBH_CheckHubIdle: PortExtension - %p\n",
3912 PortExtension);
3913
3914 IsAllPortsIdle = FALSE;
3915 IsHubCheck = FALSE;
3916
3917 break;
3918 }
3919 }
3920 }
3921
3922 if (IsHubCheck &&
3923 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST))
3924 {
3925 KeClearEvent(&HubExtension->IdleEvent);
3926 HubExtension->HubFlags |= USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3927 IsHubIdle = TRUE;
3928 }
3929
3931
3932 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
3934 1,
3935 FALSE);
3936
3937 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3938 {
3939 KeSetEvent(&HubExtension->PendingRequestEvent,
3941 FALSE);
3942 }
3943
3944 DPRINT("USBH_CheckHubIdle: IsAllPortsIdle - %x, IsHubIdle - %x\n",
3945 IsAllPortsIdle,
3946 IsHubIdle);
3947
3948 if (IsAllPortsIdle && IsHubIdle)
3949 {
3950 USBH_FdoSubmitIdleRequestIrp(HubExtension);
3951 }
3952
3953Exit:
3954 KeAcquireSpinLock(&HubExtension->CheckIdleSpinLock, &Irql);
3955 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_CHECK_IDLE_LOCK;
3956 KeReleaseSpinLock(&HubExtension->CheckIdleSpinLock, Irql);
3957}
_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:3735
#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 3234 of file usbhub.c.

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

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

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 3961 of file usbhub.c.

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

Referenced by USBH_CheckIdleDeferred().

◆ USBH_CompleteIrp()

◆ USBH_CompletePortIdleIrpsWorker()

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

Definition at line 3589 of file usbhub.c.

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

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 4392 of file usbhub.c.

4396{
4397 ULONG PdoNumber = 0;
4398 WCHAR CharDeviceName[64];
4401 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4403 LPWSTR SerialNumberBuffer;
4404 BOOLEAN IsHsDevice;
4405 BOOLEAN IsLsDevice;
4406 BOOLEAN IgnoringHwSerial = FALSE;
4409
4410 DPRINT("USBH_CreateDevice: Port - %x, UsbPortStatus - %lX\n",
4411 Port,
4412 UsbPortStatus.AsUshort16);
4413
4414 do
4415 {
4416 RtlStringCbPrintfW(CharDeviceName,
4417 sizeof(CharDeviceName),
4418 L"\\Device\\USBPDO-%d",
4419 PdoNumber);
4420
4421 RtlInitUnicodeString(&DeviceName, CharDeviceName);
4422
4423 Status = IoCreateDevice(HubExtension->Common.SelfDevice->DriverObject,
4425 &DeviceName,
4427 0,
4428 FALSE,
4429 &DeviceObject);
4430
4431 ++PdoNumber;
4432 }
4434
4435 if (!NT_SUCCESS(Status))
4436 {
4437 ASSERT(Port > 0);
4438 HubExtension->PortData[Port-1].DeviceObject = DeviceObject;
4439 return Status;
4440 }
4441
4442 DeviceObject->StackSize = HubExtension->RootHubPdo2->StackSize;
4443
4444 PortExtension = DeviceObject->DeviceExtension;
4445
4446 DPRINT("USBH_CreateDevice: PortDevice - %p, <%wZ>\n", DeviceObject, &DeviceName);
4447 DPRINT("USBH_CreateDevice: PortExtension - %p\n", PortExtension);
4448
4449 RtlZeroMemory(PortExtension, sizeof(USBHUB_PORT_PDO_EXTENSION));
4450
4452 PortExtension->Common.SelfDevice = DeviceObject;
4453
4454 PortExtension->HubExtension = HubExtension;
4455 PortExtension->RootHubExtension = HubExtension;
4456
4457 PortExtension->PortNumber = Port;
4459 PortExtension->IgnoringHwSerial = FALSE;
4460
4462
4463 InitializeListHead(&PortExtension->PortPowerList);
4465
4466 PortExtension->PoRequestCounter = 0;
4467 PortExtension->PendingSystemPoRequest = 0;
4468 PortExtension->PendingDevicePoRequest = 0;
4469 PortExtension->StateBehindD2 = 0;
4470
4471 SerialNumberBuffer = NULL;
4472
4473 IsHsDevice = UsbPortStatus.Usb20PortStatus.HighSpeedDeviceAttached;
4474 IsLsDevice = UsbPortStatus.Usb20PortStatus.LowSpeedDeviceAttached;
4475
4476 if (IsLsDevice == 0)
4477 {
4478 if (IsHsDevice)
4479 {
4481 }
4482 }
4483 else
4484 {
4486 }
4487
4488 /* Initialize PortExtension->InstanceID */
4492
4494 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
4495
4496 if (!NT_SUCCESS(Status))
4497 {
4498 DPRINT1("USBH_CreateDevice: IoCreateDevice() failed - %lX\n", Status);
4499 goto ErrorExit;
4500 }
4501
4502 Status = USBD_CreateDeviceEx(HubExtension,
4503 &PortExtension->DeviceHandle,
4504 UsbPortStatus,
4505 Port);
4506
4507 if (!NT_SUCCESS(Status))
4508 {
4509 DPRINT1("USBH_CreateDevice: USBD_CreateDeviceEx() failed - %lX\n", Status);
4510 goto ErrorExit;
4511 }
4512
4513 Status = USBH_SyncResetPort(HubExtension, Port);
4514
4515 if (!NT_SUCCESS(Status))
4516 {
4517 DPRINT1("USBH_CreateDevice: USBH_SyncResetPort() failed - %lX\n", Status);
4518 goto ErrorExit;
4519 }
4520
4521 if (IsWait)
4522 {
4523 USBH_Wait(50);
4524 }
4525
4526 Status = USBD_InitializeDeviceEx(HubExtension,
4527 PortExtension->DeviceHandle,
4528 (PUCHAR)&PortExtension->DeviceDescriptor,
4529 sizeof(USB_DEVICE_DESCRIPTOR),
4530 (PUCHAR)&PortExtension->ConfigDescriptor,
4532
4533 if (!NT_SUCCESS(Status))
4534 {
4535 DPRINT1("USBH_CreateDevice: USBD_InitializeDeviceEx() failed - %lX\n", Status);
4536 PortExtension->DeviceHandle = NULL;
4537 goto ErrorExit;
4538 }
4539
4540 DPRINT1("USBH_RegQueryDeviceIgnoreHWSerNumFlag UNIMPLEMENTED. FIXME\n");
4541 //Status = USBH_RegQueryDeviceIgnoreHWSerNumFlag(PortExtension->DeviceDescriptor.idVendor,
4542 // PortExtension->DeviceDescriptor.idProduct,
4543 // &IgnoringHwSerial);
4544
4545 if (TRUE)//Status == STATUS_OBJECT_NAME_NOT_FOUND)
4546 {
4547 IgnoringHwSerial = FALSE;
4548 }
4549
4550 if (IgnoringHwSerial)
4551 {
4552 PortExtension->IgnoringHwSerial = TRUE;
4553 }
4554
4555 if (PortExtension->DeviceDescriptor.iSerialNumber &&
4556 !PortExtension->IgnoringHwSerial)
4557 {
4559
4561 &SerialNumberBuffer,
4562 &PortExtension->SN_DescriptorLength,
4564 PortExtension->DeviceDescriptor.iSerialNumber);
4565
4566 if (SerialNumberBuffer)
4567 {
4568 if (!USBH_ValidateSerialNumberString((PUSHORT)SerialNumberBuffer))
4569 {
4570 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4571 SerialNumberBuffer = NULL;
4572 }
4573
4574 if (SerialNumberBuffer &&
4575 !USBH_CheckDeviceIDUnique(HubExtension,
4576 PortExtension->DeviceDescriptor.idVendor,
4577 PortExtension->DeviceDescriptor.idProduct,
4578 SerialNumberBuffer,
4579 PortExtension->SN_DescriptorLength))
4580 {
4581 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4582 SerialNumberBuffer = NULL;
4583 }
4584 }
4585
4587 SerialNumberBuffer);
4588 }
4589
4590 Status = USBH_ProcessDeviceInformation(PortExtension);
4591
4592 USBH_PdoSetCapabilities(PortExtension);
4593
4594 if (NT_SUCCESS(Status))
4595 {
4596 goto Exit;
4597 }
4598
4599ErrorExit:
4600
4602
4604 NULL);
4605
4606 if (DeviceHandle)
4607 {
4608 USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
4609 }
4610
4611 SerialNumberBuffer = InterlockedExchangePointer((PVOID)&PortExtension->SerialNumber,
4612 NULL);
4613
4614 if (SerialNumberBuffer)
4615 {
4616 ExFreePoolWithTag(SerialNumberBuffer, USB_HUB_TAG);
4617 }
4618
4619Exit:
4620
4621 ASSERT(Port > 0);
4622 HubExtension->PortData[Port-1].DeviceObject = DeviceObject;
4623 return Status;
4624}
#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:3994
NTSTATUS NTAPI USBD_RemoveDeviceEx(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_DEVICE_HANDLE DeviceHandle, IN ULONG Flags)
Definition: usbhub.c:2551
NTSTATUS NTAPI USBH_ProcessDeviceInformation(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension)
Definition: usbhub.c:4069
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:2575
BOOLEAN NTAPI USBH_ValidateSerialNumberString(IN PUSHORT SerialNumberString)
Definition: usbhub.c:4232
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:2521
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:4180
NTSTATUS NTAPI USBH_GetSerialNumberString(IN PDEVICE_OBJECT DeviceObject, IN LPWSTR *OutSerialNumber, IN PUSHORT OutDescriptorLength, IN USHORT LanguageId, IN UCHAR Index)
Definition: usbhub.c:4317
#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 5034 of file usbhub.c.

5035{
5036 DPRINT("USBH_DriverUnload: UNIMPLEMENTED\n");
5037
5039 {
5042 }
5043}
#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 4909 of file usbhub.c.

4911{
4912 PIO_STACK_LOCATION IoStack;
4915
4917
4918 DPRINT("USBH_FdoDispatch: HubExtension - %p, Irp - %p, MajorFunction - %X\n",
4919 HubExtension,
4920 Irp,
4921 IoStack->MajorFunction);
4922
4923 MajorFunction = IoStack->MajorFunction;
4924
4925 switch (MajorFunction)
4926 {
4927 case IRP_MJ_CREATE:
4928 case IRP_MJ_CLOSE:
4931 break;
4932
4934 Status = USBH_DeviceControl(HubExtension, Irp);
4935 break;
4936
4937 case IRP_MJ_PNP:
4938 Status = USBH_FdoPnP(HubExtension, Irp, IoStack->MinorFunction);
4939 break;
4940
4941 case IRP_MJ_POWER:
4942 Status = USBH_FdoPower(HubExtension, Irp, IoStack->MinorFunction);
4943 break;
4944
4946 DPRINT1("USBH_FdoDispatch: USBH_SystemControl() UNIMPLEMENTED. FIXME\n");
4947 /* fall through */
4948
4950 default:
4951 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
4952 break;
4953 }
4954
4955 return Status;
4956}
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:460
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 3378 of file usbhub.c.

3379{
3380 PUSBHUB_FDO_EXTENSION HubExtension;
3381 PUSBHUB_PORT_DATA PortData;
3382 PDEVICE_OBJECT PortDevice;
3383 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3384 PIRP Irp = NULL;
3385 PIRP IdleIrp;
3387 KEVENT Event;
3388 ULONG Port;
3389 PIO_STACK_LOCATION IoStack;
3390 PUSB_IDLE_CALLBACK_INFO CallbackInfo;
3391 BOOLEAN IsReady;
3392 KIRQL OldIrql;
3394
3395 HubExtension = Context;
3396
3397 DPRINT("USBH_FdoIdleNotificationCallback: HubExtension - %p, HubFlags - %lX\n",
3398 HubExtension,
3399 HubExtension->HubFlags);
3400
3401 if (HubExtension->HubFlags & (USBHUB_FDO_FLAG_ENUM_POST_RECOVER |
3408 {
3409 DbgBreakPoint();
3410 return;
3411 }
3412
3413 HubExtension->HubFlags |= USBHUB_FDO_FLAG_GOING_IDLE;
3414
3415 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP))
3416 {
3417 Status = USBH_FdoSubmitWaitWakeIrp(HubExtension);
3418
3419 if (Status != STATUS_PENDING)
3420 {
3421 DPRINT("Status != STATUS_PENDING. DbgBreakPoint()\n");
3422 DbgBreakPoint();
3423 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_GOING_IDLE;
3424 return;
3425 }
3426 }
3427
3429
3431 Executive,
3432 KernelMode,
3433 FALSE,
3434 NULL);
3435
3436 PortData = HubExtension->PortData;
3437 IsReady = TRUE;
3438
3439 for (Port = 0;
3440 Port < HubExtension->HubDescriptor->bNumberOfPorts;
3441 Port++)
3442 {
3443 PortDevice = PortData[Port].DeviceObject;
3444
3445 if (PortDevice)
3446 {
3447 PortExtension = PortDevice->DeviceExtension;
3448
3449 IdleIrp = PortExtension->IdleNotificationIrp;
3450
3451 if (!IdleIrp)
3452 {
3453 IsReady = FALSE;
3454 goto IdleHub;
3455 }
3456
3457 IoStack = IoGetCurrentIrpStackLocation(IdleIrp);
3458
3459 CallbackInfo = IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
3460
3461 if (!CallbackInfo)
3462 {
3463 IsReady = FALSE;
3464 goto IdleHub;
3465 }
3466
3467 if (!CallbackInfo->IdleCallback)
3468 {
3469 IsReady = FALSE;
3470 goto IdleHub;
3471 }
3472
3473 if (PortExtension->PendingSystemPoRequest)
3474 {
3475 IsReady = FALSE;
3476 goto IdleHub;
3477 }
3478
3479 if (InterlockedCompareExchange(&PortExtension->StateBehindD2,
3480 1,
3481 0))
3482 {
3483 IsReady = FALSE;
3484 goto IdleHub;
3485 }
3486
3487 DPRINT("USBH_FdoIdleNotificationCallback: IdleContext - %p\n",
3488 CallbackInfo->IdleContext);
3489
3490 CallbackInfo->IdleCallback(CallbackInfo->IdleContext);
3491
3492 if (PortExtension->CurrentPowerState.DeviceState == PowerDeviceD0)
3493 {
3494 IsReady = FALSE;
3495 goto IdleHub;
3496 }
3497 }
3498 }
3499
3500 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING) &&
3501 (USBH_CheckIdleAbort(HubExtension, FALSE, FALSE) == TRUE))
3502 {
3503 IsReady = FALSE;
3504 }
3505
3506IdleHub:
3507
3510 1,
3511 FALSE);
3512
3513 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3514 {
3515 KeSetEvent(&HubExtension->PendingRequestEvent,
3517 FALSE);
3518 }
3519
3520 if (!IsReady ||
3522 {
3523 DPRINT1("USBH_FdoIdleNotificationCallback: HubFlags - %lX\n",
3524 HubExtension->HubFlags);
3525
3526 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_DEVICE_SUSPENDED |
3528
3529 /* Aborting Idle for Hub */
3531
3532 if (HubExtension->PendingIdleIrp)
3533 {
3534 Irp = HubExtension->PendingIdleIrp;
3535 HubExtension->PendingIdleIrp = NULL;
3536 }
3537
3539
3540 if (Irp)
3541 {
3542 USBH_HubCancelIdleIrp(HubExtension, Irp);
3543 }
3544
3545 DbgBreakPoint();
3547 }
3548 else
3549 {
3550 PowerState.DeviceState = HubExtension->DeviceWake;
3551
3552 KeWaitForSingleObject(&HubExtension->IdleSemaphore,
3553 Executive,
3554 KernelMode,
3555 FALSE,
3556 NULL);
3557
3558 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_GOING_IDLE;
3559 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DO_SUSPENSE;
3560
3562
3563 DPRINT("USBH_FdoIdleNotificationCallback: LowerPdo - %p\n",
3564 HubExtension->LowerPDO);
3565
3566 DPRINT("USBH_FdoIdleNotificationCallback: PowerState.DeviceState - %x\n",
3567 PowerState.DeviceState);
3568
3569 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
3571 PowerState,
3573 &Event,
3574 NULL);
3575
3576 if (Status == STATUS_PENDING)
3577 {
3579 Executive,
3580 KernelMode,
3581 FALSE,
3582 NULL);
3583 }
3584 }
3585}
#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:3198
VOID NTAPI USBH_HubCancelIdleIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP IdleIrp)
Definition: usbhub.c:3219
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:3053
NTSTATUS NTAPI USBH_FdoSubmitWaitWakeIrp(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3326
BOOLEAN NTAPI USBH_CheckIdleAbort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
Definition: usbhub.c:3234
#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 3642 of file usbhub.c.

3645{
3646 PUSBHUB_FDO_EXTENSION HubExtension;
3647 NTSTATUS NtStatus;
3648 PVOID IdleIrp;
3649 KIRQL Irql;
3651 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
3652
3654
3655 HubExtension = Context;
3656 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3657
3658 IdleIrp = InterlockedExchangePointer((PVOID)&HubExtension->PendingIdleIrp,
3659 NULL);
3660
3661 DPRINT("USBH_FdoIdleNotificationRequestComplete: IdleIrp - %p\n", IdleIrp);
3662
3663 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3664 {
3666 }
3667
3669
3670 NtStatus = Irp->IoStatus.Status;
3671
3672 DPRINT("USBH_FdoIdleNotificationRequestComplete: NtStatus - %lX\n",
3673 NtStatus);
3674
3675 if (!NT_SUCCESS(NtStatus) &&
3676 NtStatus != STATUS_POWER_STATE_INVALID &&
3677 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_REMOVED) &&
3678 !(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
3679 {
3680 DPRINT("USBH_FdoIdleNotificationRequestComplete: DeviceState - %x\n",
3681 HubExtension->CurrentPowerState.DeviceState);
3682
3683 if (HubExtension->CurrentPowerState.DeviceState == PowerDeviceD0)
3684 {
3685 PUSBHUB_IDLE_PORT_CONTEXT HubWorkItemBuffer;
3686
3687 Status = USBH_AllocateWorkItem(HubExtension,
3688 &HubIoWorkItem,
3691 (PVOID *)&HubWorkItemBuffer,
3693
3694 if (NT_SUCCESS(Status))
3695 {
3696 HubWorkItemBuffer->Status = NtStatus;
3697
3698 USBH_HubQueuePortIdleIrps(HubExtension,
3699 &HubWorkItemBuffer->PwrList);
3700
3701 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3702 }
3703 }
3704 else
3705 {
3706 PUSBHUB_IDLE_HUB_CONTEXT HubWorkItemBuffer;
3707
3708 Status = USBH_AllocateWorkItem(HubExtension,
3709 &HubIoWorkItem,
3712 (PVOID *)&HubWorkItemBuffer,
3714
3715 if (NT_SUCCESS(Status))
3716 {
3717 HubWorkItemBuffer->Status = NtStatus;
3718 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3719 }
3720 }
3721 }
3722
3723 if (IdleIrp ||
3724 InterlockedExchange((PLONG)&HubExtension->IdleRequestLock, 1))
3725 {
3726 DPRINT("USBH_FdoIdleNotificationRequestComplete: Irp - %p\n", Irp);
3727 IoFreeIrp(Irp);
3728 }
3729
3731}
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:3620
VOID NTAPI USBH_CompletePortIdleIrpsWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:3589
VOID NTAPI USBH_HubQueuePortIdleIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY IdleList)
Definition: usbhub.c:3065
#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 3735 of file usbhub.c.

3736{
3738 ULONG HubFlags;
3739 PDEVICE_OBJECT LowerPDO;
3740 PIRP Irp;
3741 PIO_STACK_LOCATION IoStack;
3742 KIRQL Irql;
3743
3744 DPRINT("USBH_FdoSubmitIdleRequestIrp: HubExtension - %p, PendingIdleIrp - %p\n",
3745 HubExtension,
3746 HubExtension->PendingIdleIrp);
3747
3748 if (HubExtension->PendingIdleIrp)
3749 {
3751 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3752 return Status;
3753 }
3754
3755 HubFlags = HubExtension->HubFlags;
3756
3757 if (HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPING ||
3759 {
3760 HubExtension->HubFlags = HubFlags & ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3761 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3762 return STATUS_DEVICE_REMOVED;
3763 }
3764
3765 LowerPDO = HubExtension->LowerPDO;
3766
3767 HubExtension->IdleCallbackInfo.IdleCallback = USBH_FdoIdleNotificationCallback;
3768 HubExtension->IdleCallbackInfo.IdleContext = HubExtension;
3769
3770 Irp = IoAllocateIrp(LowerPDO->StackSize, FALSE);
3771
3772 if (!Irp)
3773 {
3774 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST;
3776
3777 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3778 return Status;
3779 }
3780
3781 IoStack = IoGetNextIrpStackLocation(Irp);
3782
3784
3785 IoStack->Parameters.DeviceIoControl.InputBufferLength = sizeof(USB_IDLE_CALLBACK_INFO);
3786 IoStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION;
3787 IoStack->Parameters.DeviceIoControl.Type3InputBuffer = &HubExtension->IdleCallbackInfo;
3788
3791 HubExtension,
3792 TRUE,
3793 TRUE,
3794 TRUE);
3795
3796 InterlockedIncrement(&HubExtension->PendingRequestCount);
3797 InterlockedExchange(&HubExtension->IdleRequestLock, 0);
3798
3799 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_DEVICE_SUSPENDED |
3801
3802 Status = IoCallDriver(HubExtension->LowerPDO, Irp);
3803
3805
3806 if (Status == STATUS_PENDING &&
3807 HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST)
3808 {
3809 HubExtension->PendingIdleIrp = Irp;
3810 }
3811
3813
3814 KeSetEvent(&HubExtension->IdleEvent, EVENT_INCREMENT, FALSE);
3815
3816 return Status;
3817}
#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:3642
VOID NTAPI USBH_FdoIdleNotificationCallback(IN PVOID Context)
Definition: usbhub.c:3378

Referenced by USBH_CheckHubIdle().

◆ USBH_FdoSubmitWaitWakeIrp()

NTSTATUS NTAPI USBH_FdoSubmitWaitWakeIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3326 of file usbhub.c.

3327{
3330 PIRP Irp = NULL;
3331 KIRQL Irql;
3332
3333 DPRINT("USBH_FdoSubmitWaitWakeIrp: ... \n");
3334
3335 PowerState.SystemState = HubExtension->SystemWake;
3336 HubExtension->HubFlags |= USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
3337
3338 InterlockedIncrement(&HubExtension->PendingRequestCount);
3339 InterlockedExchange(&HubExtension->FdoWaitWakeLock, 0);
3340
3341 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
3343 PowerState,
3345 HubExtension,
3346 &Irp);
3347
3349
3350 if (Status == STATUS_PENDING)
3351 {
3352 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP)
3353 {
3354 HubExtension->PendingWakeIrp = Irp;
3355 DPRINT("USBH_FdoSubmitWaitWakeIrp: PendingWakeIrp - %p\n",
3356 HubExtension->PendingWakeIrp);
3357 }
3358 }
3359 else
3360 {
3361 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
3362
3363 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
3364 {
3365 KeSetEvent(&HubExtension->PendingRequestEvent,
3367 FALSE);
3368 }
3369 }
3370
3372
3373 return Status;
3374}
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:3315
#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 3315 of file usbhub.c.

3320{
3321 DPRINT("USBH_FdoWaitWakeIrpCompletion ... \n");
3322}

Referenced by USBH_FdoSubmitWaitWakeIrp().

◆ USBH_FlushPortPwrList()

VOID NTAPI USBH_FlushPortPwrList ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3138 of file usbhub.c.

3139{
3140 PDEVICE_OBJECT PortDevice;
3141 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
3143 ULONG Port;
3144
3145 DPRINT("USBH_FlushPortPwrList ... \n");
3146
3147 InterlockedIncrement((PLONG)&HubExtension->PendingRequestCount);
3148
3149 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
3150 Executive,
3151 KernelMode,
3152 FALSE,
3153 NULL);
3154
3155 for (Port = 0; Port < HubExtension->HubDescriptor->bNumberOfPorts; ++Port)
3156 {
3157 PortDevice = HubExtension->PortData[Port].DeviceObject;
3158
3159 if (!PortDevice)
3160 {
3161 continue;
3162 }
3163
3164 PortExtension = PortDevice->DeviceExtension;
3165
3166 InterlockedExchange((PLONG)&PortExtension->StateBehindD2, 0);
3167
3168 while (TRUE)
3169 {
3171 &PortExtension->PortPowerListSpinLock);
3172
3173 if (!Entry)
3174 {
3175 break;
3176 }
3177
3178 DPRINT1("USBH_FlushPortPwrList: PortPowerList FIXME\n");
3179 DbgBreakPoint();
3180 }
3181 }
3182
3183 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
3185 1,
3186 FALSE);
3187
3188 if (!InterlockedDecrement((PLONG)&HubExtension->PendingRequestCount))
3189 {
3190 KeSetEvent(&HubExtension->PendingRequestEvent,
3192 FALSE);
3193 }
3194}
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 2950 of file usbhub.c.

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

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(), and USBH_HubSetD0().

◆ 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 4317 of file usbhub.c.

4322{
4325 LPWSTR SerialNumberBuffer = NULL;
4326 UCHAR StringLength;
4327 UCHAR Length;
4328
4329 DPRINT("USBH_GetSerialNumberString: ... \n");
4330
4331 *OutSerialNumber = NULL;
4332 *OutDescriptorLength = 0;
4333
4336 USB_HUB_TAG);
4337
4338 if (!Descriptor)
4339 {
4341 }
4342
4344
4346
4347 if (!NT_SUCCESS(Status))
4348 {
4349 goto Exit;
4350 }
4351
4353 Index,
4354 LanguageId,
4355 Descriptor,
4357 NULL,
4358 TRUE);
4359
4360 if (!NT_SUCCESS(Status) ||
4361 Descriptor->bLength <= sizeof(USB_COMMON_DESCRIPTOR))
4362 {
4364 goto Exit;
4365 }
4366
4367 StringLength = Descriptor->bLength -
4369
4370 Length = StringLength + sizeof(UNICODE_NULL);
4371
4372 SerialNumberBuffer = ExAllocatePoolWithTag(PagedPool, Length, USB_HUB_TAG);
4373
4374 if (!SerialNumberBuffer)
4375 {
4376 goto Exit;
4377 }
4378
4379 RtlZeroMemory(SerialNumberBuffer, Length);
4380 RtlCopyMemory(SerialNumberBuffer, Descriptor->bString, StringLength);
4381
4382 *OutSerialNumber = SerialNumberBuffer;
4383 *OutDescriptorLength = Length;
4384
4385Exit:
4387 return Status;
4388}
#define UNICODE_NULL
NTSTATUS NTAPI USBH_CheckDeviceLanguage(IN PDEVICE_OBJECT DeviceObject, IN USHORT LanguageId)
Definition: usbhub.c:4255
_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 3219 of file usbhub.c.

3221{
3222 DPRINT("USBH_HubCancelIdleIrp ... \n");
3223
3224 IoCancelIrp(IdleIrp);
3225
3226 if (InterlockedExchange(&HubExtension->IdleRequestLock, 1))
3227 {
3228 IoFreeIrp(IdleIrp);
3229 }
3230}
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 3198 of file usbhub.c.

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

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 3123 of file usbhub.c.

3126{
3127 DPRINT("USBH_HubCompleteQueuedPortIdleIrps ... \n");
3128
3129 while (!IsListEmpty(IdleList))
3130 {
3131 DPRINT1("USBH_HubCompleteQueuedPortIdleIrps: IdleList not Empty. FIXME\n");
3132 DbgBreakPoint();
3133 }
3134}
#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 5047 of file usbhub.c.

5049{
5050 PCOMMON_DEVICE_EXTENSION DeviceExtension;
5051 ULONG ExtensionType;
5053
5054
5055 DeviceExtension = DeviceObject->DeviceExtension;
5056 ExtensionType = DeviceExtension->ExtensionType;
5057
5058 if (ExtensionType == USBH_EXTENSION_TYPE_HUB)
5059 {
5060 DPRINT("USBH_HubDispatch: DeviceObject - %p, Irp - %p\n",
5062 Irp);
5063
5064 Status = USBH_FdoDispatch((PUSBHUB_FDO_EXTENSION)DeviceExtension, Irp);
5065 }
5066 else if (ExtensionType == USBH_EXTENSION_TYPE_PORT)
5067 {
5070 BOOLEAN IsDprint = TRUE;
5071
5073 {
5074 ULONG ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
5075
5077 {
5078 IsDprint = FALSE;
5079 }
5080 }
5081
5082 if (IsDprint)
5083 {
5084 DPRINT("USBH_HubDispatch: DeviceObject - %p, Irp - %p\n",
5086 Irp);
5087 }
5088
5090 }
5091 else
5092 {
5093 DPRINT1("USBH_HubDispatch: Unknown ExtensionType - %x\n", ExtensionType);
5094 DbgBreakPoint();
5096 }
5097
5098 return Status;
5099}
#define STATUS_ASSERTION_FAILURE
Definition: ntstatus.h:1099
NTSTATUS NTAPI USBH_FdoDispatch(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: usbhub.c:4909
NTSTATUS NTAPI USBH_PdoDispatch(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: usbhub.c:4822
_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 3065 of file usbhub.c.

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

3058{
3059 DPRINT("USBH_HubSetDWakeCompletion: ... \n");
3061}

Referenced by USBH_FdoIdleNotificationCallback().

◆ USBH_IdleCompletePowerHubWorker()

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

Definition at line 3620 of file usbhub.c.

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

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 4822 of file usbhub.c.

4824{
4825 PIO_STACK_LOCATION IoStack;
4827 BOOLEAN ShouldCompleteIrp;
4830
4832 MajorFunction = IoStack->MajorFunction;
4833
4834 switch (MajorFunction)
4835 {
4836 case IRP_MJ_CREATE:
4837 case IRP_MJ_CLOSE:
4838 DPRINT("USBH_PdoDispatch: IRP_MJ_CREATE / IRP_MJ_CLOSE (%d)\n",
4842 break;
4843
4845 ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
4846 DPRINT("USBH_PdoDispatch: IRP_MJ_DEVICE_CONTROL ControlCode - %x\n",
4847 ControlCode);
4848
4850 {
4853 break;
4854 }
4855
4857 {
4858 DPRINT1("USBH_PdoDispatch: IOCTL_KS_PROPERTY FIXME\n");
4859 DbgBreakPoint();
4862 break;
4863 }
4864
4865 Status = Irp->IoStatus.Status;
4867 break;
4868
4870 Status = USBH_PdoInternalControl(PortExtension, Irp);
4871 break;
4872
4873 case IRP_MJ_PNP:
4874 Status = USBH_PdoPnP(PortExtension,
4875 Irp,
4876 IoStack->MinorFunction,
4877 &ShouldCompleteIrp);
4878
4879 if (ShouldCompleteIrp)
4880 {
4882 }
4883
4884 break;
4885
4886 case IRP_MJ_POWER:
4887 Status = USBH_PdoPower(PortExtension, Irp, IoStack->MinorFunction);
4888 break;
4889
4891 DPRINT1("USBH_PdoDispatch: USBH_SystemControl() UNIMPLEMENTED. FIXME\n");
4892 //USBH_PortSystemControl(PortExtension, Irp);
4893 Status = Irp->IoStatus.Status;
4895 break;
4896
4897 default:
4898 DPRINT("USBH_PdoDispatch: Unhandled MajorFunction - %d\n", MajorFunction);
4899 Status = Irp->IoStatus.Status;
4901 break;
4902 }
4903
4904 return Status;
4905}
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:757
#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 3994 of file usbhub.c.

3995{
3996 PUSBHUB_FDO_EXTENSION HubExtension;
3997 ULONG State;
3999 PDEVICE_POWER_STATE pDeviceState;
4000
4001 DPRINT("USBH_PdoSetCapabilities ... \n");
4002
4003 HubExtension = PortExtension->HubExtension;
4004
4005 PortExtension->Capabilities.Size = 64;
4006 PortExtension->Capabilities.Version = 1;
4007
4008 PortExtension->Capabilities.Removable = 1;
4009 PortExtension->Capabilities.Address = PortExtension->PortNumber;
4010
4011 if (PortExtension->SerialNumber)
4012 {
4013 PortExtension->Capabilities.UniqueID = 1;
4014 }
4015 else
4016 {
4017 PortExtension->Capabilities.UniqueID = 0;
4018 }
4019
4020 PortExtension->Capabilities.RawDeviceOK = 0;
4021
4022 RtlCopyMemory(PortExtension->Capabilities.DeviceState,
4023 HubExtension->DeviceState,
4024 (PowerSystemMaximum + 2) * sizeof(POWER_STATE));
4025
4026 PortExtension->Capabilities.DeviceState[1] = PowerDeviceD0;
4027
4028 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REMOTE_WAKEUP)
4029 {
4030 PortExtension->Capabilities.DeviceWake = PowerDeviceD2;
4031
4032 PortExtension->Capabilities.DeviceD1 = 1;
4033 PortExtension->Capabilities.DeviceD2 = 1;
4034
4035 PortExtension->Capabilities.WakeFromD0 = 1;
4036 PortExtension->Capabilities.WakeFromD1 = 1;
4037 PortExtension->Capabilities.WakeFromD2 = 1;
4038
4039 pDeviceState = &PortExtension->Capabilities.DeviceState[2];
4040
4041 for (State = 2; State <= 5; State++)
4042 {
4044
4045 if (PortExtension->Capabilities.SystemWake < SystemPowerState)
4046 {
4047 *pDeviceState = PowerDeviceD3;
4048 }
4049 else
4050 {
4051 *pDeviceState = PowerDeviceD2;
4052 }
4053
4054 ++pDeviceState;
4055 }
4056 }
4057 else
4058 {
4059 PortExtension->Capabilities.DeviceWake = PowerDeviceD0;
4060 PortExtension->Capabilities.DeviceState[2] = PowerDeviceD3;
4061 PortExtension->Capabilities.DeviceState[3] = PowerDeviceD3;
4062 PortExtension->Capabilities.DeviceState[4] = PowerDeviceD3;
4063 PortExtension->Capabilities.DeviceState[5] = PowerDeviceD3;
4064 }
4065}
@ 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 4069 of file usbhub.c.

4070{
4074
4075 DPRINT("USBH_ProcessDeviceInformation ... \n");
4076
4078
4079 RtlZeroMemory(&PortExtension->InterfaceDescriptor,
4080 sizeof(PortExtension->InterfaceDescriptor));
4081
4082 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_HUB_DEVICE;
4083
4084 Status = USBH_GetConfigurationDescriptor(PortExtension->Common.SelfDevice,
4086
4087 if (!NT_SUCCESS(Status))
4088 {
4089 if (ConfigDescriptor)
4090 {
4092 }
4093
4094 return Status;
4095 }
4096
4097 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REMOTE_WAKEUP;
4098
4099 if (ConfigDescriptor->bmAttributes & 0x20)
4100 {
4101 /* device configuration supports remote wakeup */
4102 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_REMOTE_WAKEUP;
4103 }
4104
4105 USBHUB_DumpingDeviceDescriptor(&PortExtension->DeviceDescriptor);
4107
4108 DPRINT_PNP("USBH_ProcessDeviceInformation: Class - %x, SubClass - %x, Protocol - %x\n",
4109 PortExtension->DeviceDescriptor.bDeviceClass,
4110 PortExtension->DeviceDescriptor.bDeviceSubClass,
4111 PortExtension->DeviceDescriptor.bDeviceProtocol);
4112
4113 DPRINT_PNP("USBH_ProcessDeviceInformation: bNumConfigurations - %x, bNumInterfaces - %x\n",
4114 PortExtension->DeviceDescriptor.bNumConfigurations,
4115 ConfigDescriptor->bNumInterfaces);
4116
4117
4118 /* Enumeration of USB Composite Devices (msdn):
4119 1) The device class field of the device descriptor (bDeviceClass) must contain a value of zero,
4120 or the class (bDeviceClass), subclass (bDeviceSubClass), and protocol (bDeviceProtocol)
4121 fields of the device descriptor must have the values 0xEF, 0x02 and 0x01 respectively,
4122 as explained in USB Interface Association Descriptor.
4123 2) The device must have multiple interfaces
4124 3) The device must have a single configuration.
4125 */
4126
4127 if (((PortExtension->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_RESERVED) ||
4128 (PortExtension->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_MISCELLANEOUS &&
4129 PortExtension->DeviceDescriptor.bDeviceSubClass == 0x02 &&
4130 PortExtension->DeviceDescriptor.bDeviceProtocol == 0x01)) &&
4131 (ConfigDescriptor->bNumInterfaces > 1) &&
4132 (PortExtension->DeviceDescriptor.bNumConfigurations < 2))
4133 {
4134 DPRINT("USBH_ProcessDeviceInformation: Multi-Interface configuration\n");
4135
4136 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_MULTI_INTERFACE;
4137
4138 if (ConfigDescriptor)
4139 {
4141 }
4142
4143 return Status;
4144 }
4145
4148 -1,
4149 -1,
4150 -1,
4151 -1,
4152 -1);
4153 if (Pid)
4154 {
4155 RtlCopyMemory(&PortExtension->InterfaceDescriptor,
4156 Pid,
4157 sizeof(PortExtension->InterfaceDescriptor));
4158
4160 {
4161 PortExtension->PortPdoFlags |= (USBHUB_PDO_FLAG_HUB_DEVICE |
4163 }
4164 }
4165 else
4166 {
4168 }
4169
4170 if (ConfigDescriptor)
4171 {
4173 }
4174
4175 return Status;
4176}
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 2930 of file usbhub.c.

2932{
2933 DPRINT("USBH_QueueWorkItem: ... \n");
2934
2935 InterlockedIncrement(&HubExtension->PendingRequestCount);
2936 InterlockedIncrement(&HubIoWorkItem->HubWorkerQueued);
2937
2938 ExInterlockedInsertTailList(&HubExtension->WorkItemList,
2939 &HubIoWorkItem->HubWorkItemLink,
2940 &HubExtension->WorkItemSpinLock);
2941
2942 IoQueueWorkItem(HubIoWorkItem->HubWorkItem,
2944 HubIoWorkItem->HubWorkItemType,
2945 HubIoWorkItem);
2946}
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:2885

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 5103 of file usbhub.c.

5104{
5106
5107 DPRINT("USBH_RegQueryGenericUSBDeviceString ... \n");
5108
5110
5113 QueryTable[0].Name = L"GenericUSBDeviceString";
5114 QueryTable[0].EntryContext = USBDeviceString;
5116 QueryTable[0].DefaultData = 0;
5118
5120 L"usbflags",
5121 QueryTable,
5122 NULL,
5123 NULL);
5124}
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 4628 of file usbhub.c.

4632{
4634 PUSBHUB_PORT_DATA PortData;
4635 PDEVICE_OBJECT PortDevice;
4636 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
4638 PVOID Handle;
4642
4643 DPRINT("USBH_ResetDevice: HubExtension - %p, Port - %x, IsKeepDeviceData - %x, IsWait - %x\n",
4644 HubExtension,
4645 Port,
4646 IsKeepDeviceData,
4647 IsWait);
4648
4649 Status = USBH_SyncGetPortStatus(HubExtension,
4650 Port,
4651 &PortStatus,
4653
4654 if (!NT_SUCCESS(Status) ||
4655 !(PortStatus.PortStatus.Usb20PortStatus.CurrentConnectStatus))
4656 {
4657 return STATUS_UNSUCCESSFUL;
4658 }
4659
4660 InterlockedIncrement(&HubExtension->PendingRequestCount);
4661
4662 KeWaitForSingleObject(&HubExtension->ResetDeviceSemaphore,
4663 Executive,
4664 KernelMode,
4665 FALSE,
4666 NULL);
4667
4668 ASSERT(Port > 0);
4669 PortData = &HubExtension->PortData[Port-1];
4670
4671 PortDevice = PortData->DeviceObject;
4672
4673 if (!PortDevice)
4674 {
4676
4677 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
4679 1,
4680 FALSE);
4681
4682 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
4683 {
4684 KeSetEvent(&HubExtension->PendingRequestEvent,
4686 FALSE);
4687 }
4688
4689 return Status;
4690 }
4691
4692 PortExtension = PortDevice->DeviceExtension;
4693 DeviceHandle = &PortExtension->DeviceHandle;
4694
4696 NULL);
4697
4698 if (OldDeviceHandle)
4699 {
4700 if (!(PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REMOVING_PORT_PDO))
4701 {
4702 Status = USBD_RemoveDeviceEx(HubExtension,
4704 IsKeepDeviceData);
4705
4707 }
4708 }
4709 else
4710 {
4712 }
4713
4714 if (!NT_SUCCESS(Status))
4715 {
4716 goto ErrorExit;
4717 }
4718
4719 Status = USBH_SyncResetPort(HubExtension, Port);
4720
4721 if (!NT_SUCCESS(Status))
4722 {
4723 goto ErrorExit;
4724 }
4725
4726 Status = USBH_SyncGetPortStatus(HubExtension,
4727 Port,
4728 &PortStatus,
4730
4731 if (!NT_SUCCESS(Status))
4732 {
4733 goto ErrorExit;
4734 }
4735
4736 Status = USBD_CreateDeviceEx(HubExtension,
4738 PortStatus.PortStatus,
4739 Port);
4740
4741 if (!NT_SUCCESS(Status))
4742 {
4743 goto ErrorExit;
4744 }
4745
4746 Status = USBH_SyncResetPort(HubExtension, Port);
4747
4748 if (IsWait)
4749 {
4750 USBH_Wait(50);
4751 }
4752
4753 if (!NT_SUCCESS(Status))
4754 {
4755 goto ErrorExit;
4756 }
4757
4758 Status = USBD_InitializeDeviceEx(HubExtension,
4759 *DeviceHandle,
4760 &PortExtension->DeviceDescriptor.bLength,
4761 sizeof(PortExtension->DeviceDescriptor),
4762 &PortExtension->ConfigDescriptor.bLength,
4763 sizeof(PortExtension->ConfigDescriptor));
4764
4765 if (NT_SUCCESS(Status))
4766 {
4767 if (IsKeepDeviceData)
4768 {
4769 Status = USBD_RestoreDeviceEx(HubExtension,
4771 *DeviceHandle);
4772
4773 if (!NT_SUCCESS(Status))
4774 {
4776
4777 USBD_RemoveDeviceEx(HubExtension, Handle, 0);
4778 USBH_SyncDisablePort(HubExtension, Port);
4779
4781 }
4782 }
4783 else
4784 {
4785 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REMOVING_PORT_PDO;
4786 }
4787
4788 goto Exit;
4789 }
4790
4791 *DeviceHandle = NULL;
4792
4793ErrorExit:
4794
4797
4798 if (NewDeviceHandle)
4799 {
4800 Status = USBD_RemoveDeviceEx(HubExtension, NewDeviceHandle, 0);
4801 }
4802
4803Exit:
4804
4805 KeReleaseSemaphore(&HubExtension->ResetDeviceSemaphore,
4807 1,
4808 FALSE);
4809
4810 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
4811 {
4812 KeSetEvent(&HubExtension->PendingRequestEvent,
4814 FALSE);
4815 }
4816
4817 return Status;
4818}
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:2774
#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 2455 of file usbhub.c.

2456{
2457 PIRP Irp;
2460 PIO_STACK_LOCATION IoStack;
2461
2462 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: HubExtension - %p, SCEIrp - %p\n",
2463 HubExtension,
2464 HubExtension->SCEIrp);
2465
2466 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_NOT_D0_STATE)
2467 {
2468 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: USBHUB_FDO_FLAG_NOT_D0_STATE\n");
2469 DPRINT_SCE("USBH_SubmitStatusChangeTransfer: HubFlags - %lX\n",
2470 HubExtension->HubFlags);
2471
2473 }
2474
2475 Irp = HubExtension->SCEIrp;
2476
2477 if (!Irp)
2478 {
2480 }
2481
2482 Urb = (struct _URB_BULK_OR_INTERRUPT_TRANSFER *)&HubExtension->SCEWorkerUrb;
2483
2484 Urb->Hdr.Length = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
2486 Urb->Hdr.UsbdDeviceHandle = NULL;
2487
2488 Urb->PipeHandle = HubExtension->PipeInfo.PipeHandle;
2489 Urb->TransferFlags = USBD_SHORT_TRANSFER_OK;
2490 Urb->TransferBuffer = HubExtension->SCEBitmap;
2491 Urb->TransferBufferLength = HubExtension->SCEBitmapLength;
2492 Urb->TransferBufferMDL = NULL;
2493 Urb->UrbLink = NULL;
2494
2496 IoSizeOfIrp(HubExtension->LowerDevice->StackSize),
2497 HubExtension->LowerDevice->StackSize);
2498
2499 IoStack = IoGetNextIrpStackLocation(Irp);
2500
2502 IoStack->Parameters.Others.Argument1 = &HubExtension->SCEWorkerUrb;
2504
2507 HubExtension,
2508 TRUE,
2509 TRUE,
2510 TRUE);
2511
2512 KeClearEvent(&HubExtension->StatusChangeEvent);
2513
2514 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
2515
2516 return Status;
2517}
#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:2332
#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 4232 of file usbhub.c.

4233{
4234 USHORT ix;
4235 USHORT Symbol;
4236
4237 DPRINT("USBH_ValidateSerialNumberString: ... \n");
4238
4239 for (ix = 0; SerialNumberString[ix] != UNICODE_NULL; ix++)
4240 {
4241 Symbol = SerialNumberString[ix];
4242
4243 if (Symbol < 0x20 || Symbol > 0x7F || Symbol == 0x2C) // ','
4244 {
4245 return FALSE;
4246 }
4247 }
4248
4249 return TRUE;
4250}
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 2885 of file usbhub.c.

2887{
2888 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
2889 PUSBHUB_FDO_EXTENSION HubExtension;
2890 KIRQL OldIrql;
2892
2893 DPRINT("USBH_Worker: HubIoWorkItem - %p\n", Context);
2894
2895 HubIoWorkItem = Context;
2896
2897 InterlockedDecrement(&HubIoWorkItem->HubWorkerQueued);
2898
2899 HubExtension = HubIoWorkItem->HubExtension;
2900 WorkItem = HubIoWorkItem->HubWorkItem;
2901
2902 HubIoWorkItem->HubWorkerRoutine(HubIoWorkItem->HubExtension,
2903 HubIoWorkItem->HubWorkItemBuffer);
2904
2905 KeAcquireSpinLock(&HubExtension->WorkItemSpinLock, &OldIrql);
2906 RemoveEntryList(&HubIoWorkItem->HubWorkItemLink);
2908
2909 if (HubIoWorkItem->HubWorkItemBuffer)
2910 {
2912 }
2913
2914 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2915
2916 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
2917 {
2918 KeSetEvent(&HubExtension->PendingRequestEvent,
2920 FALSE);
2921 }
2922
2924
2925 DPRINT("USBH_Worker: HubIoWorkItem %p complete\n", Context);
2926}
#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 2636 of file usbhub.c.

2637{
2638 PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
2639
2640 DPRINT("USBHUB_FlushAllTransfers ... \n");
2641
2642 FlushTransfers = HubExtension->BusInterface.FlushTransfers;
2643
2644 if (FlushTransfers)
2645 {
2646 FlushTransfers(HubExtension->BusInterface.BusContext, NULL);
2647 }
2648}
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 2970 of file usbhub.c.

2971{
2972 PUSBHUB_FDO_EXTENSION HubExtension;
2973
2974 DPRINT("USBHUB_RootHubCallBack: ... \n");
2975
2976 HubExtension = Context;
2977
2978 if (HubExtension->SCEIrp)
2979 {
2980 HubExtension->HubFlags |= (USBHUB_FDO_FLAG_DO_ENUMERATION |
2982
2983 USBH_SubmitStatusChangeTransfer(HubExtension);
2984
2986 }
2987 else
2988 {
2990 }
2991
2992 KeSetEvent(&HubExtension->RootHubNotificationEvent,
2994 FALSE);
2995}
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 2614 of file usbhub.c.

2617{
2618 PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
2619
2620 DPRINT("USBHUB_SetDeviceHandleData ... \n");
2621
2622 SetDeviceHandleData = HubExtension->BusInterface.SetDeviceHandleData;
2623
2624 if (!SetDeviceHandleData)
2625 {
2626 return;
2627 }
2628
2629 SetDeviceHandleData(HubExtension->BusInterface.BusContext,
2631 UsbDevicePdo);
2632}
_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().