ReactOS 0.4.16-dev-2208-g6350669
usbhub.h File Reference
#include <ntddk.h>
#include <windef.h>
#include <stdio.h>
#include <wmistr.h>
#include <wmilib.h>
#include <wdmguid.h>
#include <ntstrsafe.h>
#include <usb.h>
#include <usbioctl.h>
#include <hubbusif.h>
#include <usbbusif.h>
#include <usbdlib.h>
#include <ks.h>
#include <drivers/usbport/usbmport.h>
Include dependency graph for usbhub.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _USBHUB_PORT_DATA
 
struct  _USBHUB_IO_WORK_ITEM
 
struct  _COMMON_DEVICE_EXTENSION
 
struct  _USBHUB_FDO_EXTENSION
 
struct  _USBHUB_PORT_PDO_EXTENSION
 
struct  _USBHUB_URB_TIMEOUT_CONTEXT
 
struct  _USBHUB_STATUS_CHANGE_CONTEXT
 
struct  _USBHUB_IDLE_HUB_CONTEXT
 
struct  _USBHUB_IDLE_PORT_CONTEXT
 
struct  _USBHUB_IDLE_PORT_CANCEL_CONTEXT
 
struct  _USBHUB_RESET_PORT_CONTEXT
 

Macros

#define USB_HUB_TAG   'BUHU'
 
#define USBH_EXTENSION_TYPE_HUB   0x01
 
#define USBH_EXTENSION_TYPE_PORT   0x02
 
#define USBH_EXTENSION_TYPE_PARENT   0x04
 
#define USBH_EXTENSION_TYPE_FUNCTION   0x08
 
#define USBHUB_FDO_FLAG_DEVICE_STARTED   (1 << 0)
 
#define USBHUB_FDO_FLAG_DEVICE_STOPPING   (1 << 2)
 
#define USBHUB_FDO_FLAG_DEVICE_FAILED   (1 << 3)
 
#define USBHUB_FDO_FLAG_REMOTE_WAKEUP   (1 << 4)
 
#define USBHUB_FDO_FLAG_DEVICE_STOPPED   (1 << 5)
 
#define USBHUB_FDO_FLAG_HUB_BUSY   (1 << 6)
 
#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP   (1 << 7)
 
#define USBHUB_FDO_FLAG_RESET_PORT_LOCK   (1 << 8)
 
#define USBHUB_FDO_FLAG_ESD_RECOVERING   (1 << 9)
 
#define USBHUB_FDO_FLAG_SET_D0_STATE   (1 << 10)
 
#define USBHUB_FDO_FLAG_NOT_D0_STATE   (1 << 11)
 
#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST   (1 << 12)
 
#define USBHUB_FDO_FLAG_STATE_CHANGING   (1 << 13)
 
#define USBHUB_FDO_FLAG_DEVICE_REMOVED   (1 << 14)
 
#define USBHUB_FDO_FLAG_USB20_HUB   (1 << 15)
 
#define USBHUB_FDO_FLAG_DEFER_CHECK_IDLE   (1 << 16)
 
#define USBHUB_FDO_FLAG_WAKEUP_START   (1 << 17)
 
#define USBHUB_FDO_FLAG_MULTIPLE_TTS   (1 << 18)
 
#define USBHUB_FDO_FLAG_ENUM_POST_RECOVER   (1 << 19)
 
#define USBHUB_FDO_FLAG_DO_ENUMERATION   (1 << 20)
 
#define USBHUB_FDO_FLAG_CHECK_IDLE_LOCK   (1 << 21)
 
#define USBHUB_FDO_FLAG_HIBERNATE_STATE   (1 << 22)
 
#define USBHUB_FDO_FLAG_NOT_ENUMERATED   (1 << 23)
 
#define USBHUB_FDO_FLAG_DO_SUSPENSE   (1 << 24)
 
#define USBHUB_FDO_FLAG_GOING_IDLE   (1 << 25)
 
#define USBHUB_FDO_FLAG_DEVICE_SUSPENDED   (1 << 26)
 
#define USBHUB_FDO_FLAG_WITEM_INIT   (1 << 27)
 
#define USBHUB_PDO_FLAG_HUB_DEVICE   (1 << 0)
 
#define USBHUB_PDO_FLAG_MULTI_INTERFACE   (1 << 1)
 
#define USBHUB_PDO_FLAG_INIT_PORT_FAILED   (1 << 2)
 
#define USBHUB_PDO_FLAG_PORT_LOW_SPEED   (1 << 3)
 
#define USBHUB_PDO_FLAG_REMOTE_WAKEUP   (1 << 4)
 
#define USBHUB_PDO_FLAG_WAIT_WAKE   (1 << 5)
 
#define USBHUB_PDO_FLAG_NOT_CONNECTED   (1 << 6)
 
#define USBHUB_PDO_FLAG_DELETE_PENDING   (1 << 7)
 
#define USBHUB_PDO_FLAG_POWER_D3   (1 << 8)
 
#define USBHUB_PDO_FLAG_DEVICE_STARTED   (1 << 9)
 
#define USBHUB_PDO_FLAG_HS_USB1_DUALMODE   (1 << 10)
 
#define USBHUB_PDO_FLAG_REG_DEV_INTERFACE   (1 << 11)
 
#define USBHUB_PDO_FLAG_PORT_RESTORE_FAIL   (1 << 12)
 
#define USBHUB_PDO_FLAG_POWER_D1_OR_D2   (1 << 13)
 
#define USBHUB_PDO_FLAG_OVERCURRENT_PORT   (1 << 14)
 
#define USBHUB_PDO_FLAG_REMOVING_PORT_PDO   (1 << 15)
 
#define USBHUB_PDO_FLAG_INSUFFICIENT_PWR   (1 << 16)
 
#define USBHUB_PDO_FLAG_ALLOC_BNDW_FAILED   (1 << 18)
 
#define USBHUB_PDO_FLAG_PORT_RESSETING   (1 << 19)
 
#define USBHUB_PDO_FLAG_IDLE_NOTIFICATION   (1 << 22)
 
#define USBHUB_PDO_FLAG_PORT_HIGH_SPEED   (1 << 23)
 
#define USBHUB_PDO_FLAG_ENUMERATED   (1 << 26)
 
#define USBHUB_ENUM_FLAG_DEVICE_PRESENT   0x01
 
#define USBHUB_ENUM_FLAG_GHOST_DEVICE   0x02
 
#define USBHUB_FEATURE_C_HUB_LOCAL_POWER   0
 
#define USBHUB_FEATURE_C_HUB_OVER_CURRENT   1
 
#define USBHUB_FEATURE_PORT_CONNECTION   0
 
#define USBHUB_FEATURE_PORT_ENABLE   1
 
#define USBHUB_FEATURE_PORT_SUSPEND   2
 
#define USBHUB_FEATURE_PORT_OVER_CURRENT   3
 
#define USBHUB_FEATURE_PORT_RESET   4
 
#define USBHUB_FEATURE_PORT_POWER   8
 
#define USBHUB_FEATURE_PORT_LOW_SPEED   9
 
#define USBHUB_FEATURE_C_PORT_CONNECTION   16
 
#define USBHUB_FEATURE_C_PORT_ENABLE   17
 
#define USBHUB_FEATURE_C_PORT_SUSPEND   18
 
#define USBHUB_FEATURE_C_PORT_OVER_CURRENT   19
 
#define USBHUB_FEATURE_C_PORT_RESET   20
 
#define USBHUB_FEATURE_PORT_TEST   21
 
#define USBHUB_FEATURE_PORT_INDICATOR   22
 
#define USBHUB_MAX_CASCADE_LEVELS   6
 
#define USBHUB_RESET_PORT_MAX_RETRY   3
 
#define USBHUB_MAX_REQUEST_ERRORS   3
 
#define USBHUB_FAIL_NO_FAIL   5
 
#define USBHUB_FAIL_NESTED_TOO_DEEPLY   6
 
#define USBHUB_FAIL_OVERCURRENT   7
 

Typedefs

typedef struct _USBHUB_PORT_DATA USBHUB_PORT_DATA
 
typedef struct _USBHUB_PORT_DATAPUSBHUB_PORT_DATA
 
typedef struct _USBHUB_FDO_EXTENSIONPUSBHUB_FDO_EXTENSION
 
typedef VOID(NTAPIPUSBHUB_WORKER_ROUTINE) (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
typedef struct _USBHUB_IO_WORK_ITEM USBHUB_IO_WORK_ITEM
 
typedef struct _USBHUB_IO_WORK_ITEMPUSBHUB_IO_WORK_ITEM
 
typedef struct _COMMON_DEVICE_EXTENSION COMMON_DEVICE_EXTENSION
 
typedef struct _COMMON_DEVICE_EXTENSIONPCOMMON_DEVICE_EXTENSION
 
typedef struct _USBHUB_FDO_EXTENSION USBHUB_FDO_EXTENSION
 
typedef struct _USBHUB_PORT_PDO_EXTENSION USBHUB_PORT_PDO_EXTENSION
 
typedef struct _USBHUB_PORT_PDO_EXTENSIONPUSBHUB_PORT_PDO_EXTENSION
 
typedef struct _USBHUB_URB_TIMEOUT_CONTEXT USBHUB_URB_TIMEOUT_CONTEXT
 
typedef struct _USBHUB_URB_TIMEOUT_CONTEXTPUSBHUB_URB_TIMEOUT_CONTEXT
 
typedef struct _USBHUB_STATUS_CHANGE_CONTEXT USBHUB_STATUS_CHANGE_CONTEXT
 
typedef struct _USBHUB_STATUS_CHANGE_CONTEXTPUSBHUB_STATUS_CHANGE_CONTEXT
 
typedef struct _USBHUB_IDLE_HUB_CONTEXT USBHUB_IDLE_HUB_CONTEXT
 
typedef struct _USBHUB_IDLE_HUB_CONTEXTPUSBHUB_IDLE_HUB_CONTEXT
 
typedef struct _USBHUB_IDLE_PORT_CONTEXT USBHUB_IDLE_PORT_CONTEXT
 
typedef struct _USBHUB_IDLE_PORT_CONTEXTPUSBHUB_IDLE_PORT_CONTEXT
 
typedef struct _USBHUB_IDLE_PORT_CANCEL_CONTEXT USBHUB_IDLE_PORT_CANCEL_CONTEXT
 
typedef struct _USBHUB_IDLE_PORT_CANCEL_CONTEXTPUSBHUB_IDLE_PORT_CANCEL_CONTEXT
 
typedef struct _USBHUB_RESET_PORT_CONTEXT USBHUB_RESET_PORT_CONTEXT
 
typedef struct _USBHUB_RESET_PORT_CONTEXTPUSBHUB_RESET_PORT_CONTEXT
 

Functions

VOID NTAPI USBHUB_DumpingDeviceDescriptor (IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor)
 
VOID NTAPI USBHUB_DumpingConfiguration (IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor)
 
VOID NTAPI USBHUB_DumpingIDs (IN PVOID Id)
 
NTSTATUS NTAPI USBH_DeviceControl (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_PdoInternalControl (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
 
NTSTATUS NTAPI USBH_PdoRemoveDevice (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_FdoPnP (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
 
NTSTATUS NTAPI USBH_PdoPnP (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor, OUT BOOLEAN *IsCompleteIrp)
 
VOID NTAPI USBH_CompletePowerIrp (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN NTSTATUS NtStatus)
 
NTSTATUS NTAPI USBH_HubSetD0 (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_HubStartESDRecovery (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_FdoPower (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
 
NTSTATUS NTAPI USBH_PdoPower (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor)
 
VOID NTAPI USBH_HubCompletePortWakeIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_HubCancelWakeIrp (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
 
VOID NTAPI USBH_IdleCancelPowerHubWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
NTSTATUS NTAPI USBH_Wait (IN ULONG Milliseconds)
 
VOID NTAPI USBH_CompleteIrp (IN PIRP Irp, IN NTSTATUS CompleteStatus)
 
NTSTATUS NTAPI USBH_PassIrp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI USBH_WriteFailReasonID (IN PDEVICE_OBJECT DeviceObject, IN ULONG Data)
 
NTSTATUS NTAPI USBH_SetPdoRegistryParameter (IN PDEVICE_OBJECT DeviceObject, IN PCWSTR SourceString, 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_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)
 
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_GetConfigurationDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR *pConfigurationDescriptor)
 
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_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_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_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 (IN PUSBHUB_FDO_EXTENSION HubExtension, OUT PUSBHUB_IO_WORK_ITEM *OutHubIoWorkItem, IN PUSBHUB_WORKER_ROUTINE WorkerRoutine, IN SIZE_T BufferLength, OUT PVOID *OutHubWorkItemBuffer, IN WORK_QUEUE_TYPE Type)
 
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)
 
NTSTATUS NTAPI USBD_RegisterRootHubCallBack (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBD_UnRegisterRootHubCallBack (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
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_CheckHubIdle (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_CheckIdleDeferred (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_CheckDeviceLanguage (IN PDEVICE_OBJECT DeviceObject, IN USHORT LanguageId)
 
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 DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
 

Variables

PWSTR GenericUSBDeviceString
 

Macro Definition Documentation

◆ USB_HUB_TAG

#define USB_HUB_TAG   'BUHU'

Definition at line 26 of file usbhub.h.

◆ USBH_EXTENSION_TYPE_FUNCTION

#define USBH_EXTENSION_TYPE_FUNCTION   0x08

Definition at line 31 of file usbhub.h.

◆ USBH_EXTENSION_TYPE_HUB

#define USBH_EXTENSION_TYPE_HUB   0x01

Definition at line 28 of file usbhub.h.

◆ USBH_EXTENSION_TYPE_PARENT

#define USBH_EXTENSION_TYPE_PARENT   0x04

Definition at line 30 of file usbhub.h.

◆ USBH_EXTENSION_TYPE_PORT

#define USBH_EXTENSION_TYPE_PORT   0x02

Definition at line 29 of file usbhub.h.

◆ USBHUB_ENUM_FLAG_DEVICE_PRESENT

#define USBHUB_ENUM_FLAG_DEVICE_PRESENT   0x01

Definition at line 84 of file usbhub.h.

◆ USBHUB_ENUM_FLAG_GHOST_DEVICE

#define USBHUB_ENUM_FLAG_GHOST_DEVICE   0x02

Definition at line 85 of file usbhub.h.

◆ USBHUB_FAIL_NESTED_TOO_DEEPLY

#define USBHUB_FAIL_NESTED_TOO_DEEPLY   6

Definition at line 112 of file usbhub.h.

◆ USBHUB_FAIL_NO_FAIL

#define USBHUB_FAIL_NO_FAIL   5

Definition at line 111 of file usbhub.h.

◆ USBHUB_FAIL_OVERCURRENT

#define USBHUB_FAIL_OVERCURRENT   7

Definition at line 113 of file usbhub.h.

◆ USBHUB_FDO_FLAG_CHECK_IDLE_LOCK

#define USBHUB_FDO_FLAG_CHECK_IDLE_LOCK   (1 << 21)

Definition at line 53 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEFER_CHECK_IDLE

#define USBHUB_FDO_FLAG_DEFER_CHECK_IDLE   (1 << 16)

Definition at line 48 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_FAILED

#define USBHUB_FDO_FLAG_DEVICE_FAILED   (1 << 3)

Definition at line 35 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_REMOVED

#define USBHUB_FDO_FLAG_DEVICE_REMOVED   (1 << 14)

Definition at line 46 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_STARTED

#define USBHUB_FDO_FLAG_DEVICE_STARTED   (1 << 0)

Definition at line 33 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_STOPPED

#define USBHUB_FDO_FLAG_DEVICE_STOPPED   (1 << 5)

Definition at line 37 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_STOPPING

#define USBHUB_FDO_FLAG_DEVICE_STOPPING   (1 << 2)

Definition at line 34 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DEVICE_SUSPENDED

#define USBHUB_FDO_FLAG_DEVICE_SUSPENDED   (1 << 26)

Definition at line 58 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DO_ENUMERATION

#define USBHUB_FDO_FLAG_DO_ENUMERATION   (1 << 20)

Definition at line 52 of file usbhub.h.

◆ USBHUB_FDO_FLAG_DO_SUSPENSE

#define USBHUB_FDO_FLAG_DO_SUSPENSE   (1 << 24)

Definition at line 56 of file usbhub.h.

◆ USBHUB_FDO_FLAG_ENUM_POST_RECOVER

#define USBHUB_FDO_FLAG_ENUM_POST_RECOVER   (1 << 19)

Definition at line 51 of file usbhub.h.

◆ USBHUB_FDO_FLAG_ESD_RECOVERING

#define USBHUB_FDO_FLAG_ESD_RECOVERING   (1 << 9)

Definition at line 41 of file usbhub.h.

◆ USBHUB_FDO_FLAG_GOING_IDLE

#define USBHUB_FDO_FLAG_GOING_IDLE   (1 << 25)

Definition at line 57 of file usbhub.h.

◆ USBHUB_FDO_FLAG_HIBERNATE_STATE

#define USBHUB_FDO_FLAG_HIBERNATE_STATE   (1 << 22)

Definition at line 54 of file usbhub.h.

◆ USBHUB_FDO_FLAG_HUB_BUSY

#define USBHUB_FDO_FLAG_HUB_BUSY   (1 << 6)

Definition at line 38 of file usbhub.h.

◆ USBHUB_FDO_FLAG_MULTIPLE_TTS

#define USBHUB_FDO_FLAG_MULTIPLE_TTS   (1 << 18)

Definition at line 50 of file usbhub.h.

◆ USBHUB_FDO_FLAG_NOT_D0_STATE

#define USBHUB_FDO_FLAG_NOT_D0_STATE   (1 << 11)

Definition at line 43 of file usbhub.h.

◆ USBHUB_FDO_FLAG_NOT_ENUMERATED

#define USBHUB_FDO_FLAG_NOT_ENUMERATED   (1 << 23)

Definition at line 55 of file usbhub.h.

◆ USBHUB_FDO_FLAG_PENDING_WAKE_IRP

#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP   (1 << 7)

Definition at line 39 of file usbhub.h.

◆ USBHUB_FDO_FLAG_REMOTE_WAKEUP

#define USBHUB_FDO_FLAG_REMOTE_WAKEUP   (1 << 4)

Definition at line 36 of file usbhub.h.

◆ USBHUB_FDO_FLAG_RESET_PORT_LOCK

#define USBHUB_FDO_FLAG_RESET_PORT_LOCK   (1 << 8)

Definition at line 40 of file usbhub.h.

◆ USBHUB_FDO_FLAG_SET_D0_STATE

#define USBHUB_FDO_FLAG_SET_D0_STATE   (1 << 10)

Definition at line 42 of file usbhub.h.

◆ USBHUB_FDO_FLAG_STATE_CHANGING

#define USBHUB_FDO_FLAG_STATE_CHANGING   (1 << 13)

Definition at line 45 of file usbhub.h.

◆ USBHUB_FDO_FLAG_USB20_HUB

#define USBHUB_FDO_FLAG_USB20_HUB   (1 << 15)

Definition at line 47 of file usbhub.h.

◆ USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST

#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST   (1 << 12)

Definition at line 44 of file usbhub.h.

◆ USBHUB_FDO_FLAG_WAKEUP_START

#define USBHUB_FDO_FLAG_WAKEUP_START   (1 << 17)

Definition at line 49 of file usbhub.h.

◆ USBHUB_FDO_FLAG_WITEM_INIT

#define USBHUB_FDO_FLAG_WITEM_INIT   (1 << 27)

Definition at line 59 of file usbhub.h.

◆ USBHUB_FEATURE_C_HUB_LOCAL_POWER

#define USBHUB_FEATURE_C_HUB_LOCAL_POWER   0

Definition at line 88 of file usbhub.h.

◆ USBHUB_FEATURE_C_HUB_OVER_CURRENT

#define USBHUB_FEATURE_C_HUB_OVER_CURRENT   1

Definition at line 89 of file usbhub.h.

◆ USBHUB_FEATURE_C_PORT_CONNECTION

#define USBHUB_FEATURE_C_PORT_CONNECTION   16

Definition at line 98 of file usbhub.h.

◆ USBHUB_FEATURE_C_PORT_ENABLE

#define USBHUB_FEATURE_C_PORT_ENABLE   17

Definition at line 99 of file usbhub.h.

◆ USBHUB_FEATURE_C_PORT_OVER_CURRENT

#define USBHUB_FEATURE_C_PORT_OVER_CURRENT   19

Definition at line 101 of file usbhub.h.

◆ USBHUB_FEATURE_C_PORT_RESET

#define USBHUB_FEATURE_C_PORT_RESET   20

Definition at line 102 of file usbhub.h.

◆ USBHUB_FEATURE_C_PORT_SUSPEND

#define USBHUB_FEATURE_C_PORT_SUSPEND   18

Definition at line 100 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_CONNECTION

#define USBHUB_FEATURE_PORT_CONNECTION   0

Definition at line 91 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_ENABLE

#define USBHUB_FEATURE_PORT_ENABLE   1

Definition at line 92 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_INDICATOR

#define USBHUB_FEATURE_PORT_INDICATOR   22

Definition at line 104 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_LOW_SPEED

#define USBHUB_FEATURE_PORT_LOW_SPEED   9

Definition at line 97 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_OVER_CURRENT

#define USBHUB_FEATURE_PORT_OVER_CURRENT   3

Definition at line 94 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_POWER

#define USBHUB_FEATURE_PORT_POWER   8

Definition at line 96 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_RESET

#define USBHUB_FEATURE_PORT_RESET   4

Definition at line 95 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_SUSPEND

#define USBHUB_FEATURE_PORT_SUSPEND   2

Definition at line 93 of file usbhub.h.

◆ USBHUB_FEATURE_PORT_TEST

#define USBHUB_FEATURE_PORT_TEST   21

Definition at line 103 of file usbhub.h.

◆ USBHUB_MAX_CASCADE_LEVELS

#define USBHUB_MAX_CASCADE_LEVELS   6

Definition at line 106 of file usbhub.h.

◆ USBHUB_MAX_REQUEST_ERRORS

#define USBHUB_MAX_REQUEST_ERRORS   3

Definition at line 108 of file usbhub.h.

◆ USBHUB_PDO_FLAG_ALLOC_BNDW_FAILED

#define USBHUB_PDO_FLAG_ALLOC_BNDW_FAILED   (1 << 18)

Definition at line 78 of file usbhub.h.

◆ USBHUB_PDO_FLAG_DELETE_PENDING

#define USBHUB_PDO_FLAG_DELETE_PENDING   (1 << 7)

Definition at line 68 of file usbhub.h.

◆ USBHUB_PDO_FLAG_DEVICE_STARTED

#define USBHUB_PDO_FLAG_DEVICE_STARTED   (1 << 9)

Definition at line 70 of file usbhub.h.

◆ USBHUB_PDO_FLAG_ENUMERATED

#define USBHUB_PDO_FLAG_ENUMERATED   (1 << 26)

Definition at line 82 of file usbhub.h.

◆ USBHUB_PDO_FLAG_HS_USB1_DUALMODE

#define USBHUB_PDO_FLAG_HS_USB1_DUALMODE   (1 << 10)

Definition at line 71 of file usbhub.h.

◆ USBHUB_PDO_FLAG_HUB_DEVICE

#define USBHUB_PDO_FLAG_HUB_DEVICE   (1 << 0)

Definition at line 61 of file usbhub.h.

◆ USBHUB_PDO_FLAG_IDLE_NOTIFICATION

#define USBHUB_PDO_FLAG_IDLE_NOTIFICATION   (1 << 22)

Definition at line 80 of file usbhub.h.

◆ USBHUB_PDO_FLAG_INIT_PORT_FAILED

#define USBHUB_PDO_FLAG_INIT_PORT_FAILED   (1 << 2)

Definition at line 63 of file usbhub.h.

◆ USBHUB_PDO_FLAG_INSUFFICIENT_PWR

#define USBHUB_PDO_FLAG_INSUFFICIENT_PWR   (1 << 16)

Definition at line 77 of file usbhub.h.

◆ USBHUB_PDO_FLAG_MULTI_INTERFACE

#define USBHUB_PDO_FLAG_MULTI_INTERFACE   (1 << 1)

Definition at line 62 of file usbhub.h.

◆ USBHUB_PDO_FLAG_NOT_CONNECTED

#define USBHUB_PDO_FLAG_NOT_CONNECTED   (1 << 6)

Definition at line 67 of file usbhub.h.

◆ USBHUB_PDO_FLAG_OVERCURRENT_PORT

#define USBHUB_PDO_FLAG_OVERCURRENT_PORT   (1 << 14)

Definition at line 75 of file usbhub.h.

◆ USBHUB_PDO_FLAG_PORT_HIGH_SPEED

#define USBHUB_PDO_FLAG_PORT_HIGH_SPEED   (1 << 23)

Definition at line 81 of file usbhub.h.

◆ USBHUB_PDO_FLAG_PORT_LOW_SPEED

#define USBHUB_PDO_FLAG_PORT_LOW_SPEED   (1 << 3)

Definition at line 64 of file usbhub.h.

◆ USBHUB_PDO_FLAG_PORT_RESSETING

#define USBHUB_PDO_FLAG_PORT_RESSETING   (1 << 19)

Definition at line 79 of file usbhub.h.

◆ USBHUB_PDO_FLAG_PORT_RESTORE_FAIL

#define USBHUB_PDO_FLAG_PORT_RESTORE_FAIL   (1 << 12)

Definition at line 73 of file usbhub.h.

◆ USBHUB_PDO_FLAG_POWER_D1_OR_D2

#define USBHUB_PDO_FLAG_POWER_D1_OR_D2   (1 << 13)

Definition at line 74 of file usbhub.h.

◆ USBHUB_PDO_FLAG_POWER_D3

#define USBHUB_PDO_FLAG_POWER_D3   (1 << 8)

Definition at line 69 of file usbhub.h.

◆ USBHUB_PDO_FLAG_REG_DEV_INTERFACE

#define USBHUB_PDO_FLAG_REG_DEV_INTERFACE   (1 << 11)

Definition at line 72 of file usbhub.h.

◆ USBHUB_PDO_FLAG_REMOTE_WAKEUP

#define USBHUB_PDO_FLAG_REMOTE_WAKEUP   (1 << 4)

Definition at line 65 of file usbhub.h.

◆ USBHUB_PDO_FLAG_REMOVING_PORT_PDO

#define USBHUB_PDO_FLAG_REMOVING_PORT_PDO   (1 << 15)

Definition at line 76 of file usbhub.h.

◆ USBHUB_PDO_FLAG_WAIT_WAKE

#define USBHUB_PDO_FLAG_WAIT_WAKE   (1 << 5)

Definition at line 66 of file usbhub.h.

◆ USBHUB_RESET_PORT_MAX_RETRY

#define USBHUB_RESET_PORT_MAX_RETRY   3

Definition at line 107 of file usbhub.h.

Typedef Documentation

◆ COMMON_DEVICE_EXTENSION

◆ PCOMMON_DEVICE_EXTENSION

◆ PUSBHUB_FDO_EXTENSION

Definition at line 124 of file usbhub.h.

◆ PUSBHUB_IDLE_HUB_CONTEXT

◆ PUSBHUB_IDLE_PORT_CANCEL_CONTEXT

◆ PUSBHUB_IDLE_PORT_CONTEXT

◆ PUSBHUB_IO_WORK_ITEM

◆ PUSBHUB_PORT_DATA

◆ PUSBHUB_PORT_PDO_EXTENSION

◆ PUSBHUB_RESET_PORT_CONTEXT

◆ PUSBHUB_STATUS_CHANGE_CONTEXT

◆ PUSBHUB_URB_TIMEOUT_CONTEXT

◆ PUSBHUB_WORKER_ROUTINE

typedef VOID(NTAPI * PUSBHUB_WORKER_ROUTINE) (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)

Definition at line 126 of file usbhub.h.

◆ USBHUB_FDO_EXTENSION

◆ USBHUB_IDLE_HUB_CONTEXT

◆ USBHUB_IDLE_PORT_CANCEL_CONTEXT

◆ USBHUB_IDLE_PORT_CONTEXT

◆ USBHUB_IO_WORK_ITEM

◆ USBHUB_PORT_DATA

◆ USBHUB_PORT_PDO_EXTENSION

◆ USBHUB_RESET_PORT_CONTEXT

◆ USBHUB_STATUS_CHANGE_CONTEXT

◆ USBHUB_URB_TIMEOUT_CONTEXT

Function Documentation

◆ DriverEntry()

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

Definition at line 1604 of file cmbatt.c.

1606{
1610 UNICODE_STRING CallbackName;
1611
1612 /* Allocate registry path */
1617 'MtaB');
1619 {
1620 /* Fail if we're out of memory this early */
1622 DbgPrint("CmBatt: Couldn't allocate pool for registry path.");
1624 }
1625
1626 /* Buffer allocated, copy the string */
1629 DbgPrint("CmBatt DriverEntry - Obj (%08x) Path \"%wZ\"\n",
1631 RegistryPath);
1632
1633 /* Setup the major dispatchers */
1634 DriverObject->MajorFunction[IRP_MJ_CREATE] = CmBattOpenClose;
1635 DriverObject->MajorFunction[IRP_MJ_CLOSE] = CmBattOpenClose;
1638 DriverObject->MajorFunction[IRP_MJ_PNP] = CmBattPnpDispatch;
1640
1641 /* And the unload routine */
1642 DriverObject->DriverUnload = CmBattUnload;
1643
1644 /* And the add device routine */
1645 DriverExtension = DriverObject->DriverExtension;
1646 DriverExtension->AddDevice = CmBattAddDevice;
1647
1648 /* Create a power callback */
1649 RtlInitUnicodeString(&CallbackName, L"\\Callback\\PowerState");
1651 &CallbackName,
1653 NULL,
1654 NULL);
1656 if (!NT_SUCCESS(Status))
1657 {
1658 /* No callback, fail */
1661 DbgPrint("CmBattRegisterPowerCallBack: failed status=0x%08x\n", Status);
1662 }
1663 else
1664 {
1665 /* Register the power callback now */
1668 DriverObject);
1670 {
1671 /* Last thing: setup our DPC and timer for battery wake */
1674 }
1675 else
1676 {
1679 DbgPrint("CmBattRegisterPowerCallBack: ExRegisterCallback failed.\n");
1680 }
1681
1682 /* All good */
1684 }
1685
1686 /* Return failure or success */
1687 return Status;
1688}
LONG NTSTATUS
Definition: precomp.h:26
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
KDPC CmBattWakeDpcObject
Definition: cmbatt.c:22
VOID NTAPI CmBattUnload(IN PDRIVER_OBJECT DriverObject)
Definition: cmbatt.c:254
KTIMER CmBattWakeDpcTimerObject
Definition: cmbatt.c:21
NTSTATUS NTAPI CmBattOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: cmbatt.c:553
NTSTATUS NTAPI CmBattIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: cmbatt.c:616
PCALLBACK_OBJECT CmBattPowerCallBackObject
Definition: cmbatt.c:18
ULONG CmBattDebug
Definition: cmbatt.c:17
PVOID CmBattPowerCallBackRegistration
Definition: cmbatt.c:19
VOID NTAPI CmBattWakeDpc(IN PKDPC Dpc, IN PCMBATT_DEVICE_EXTENSION FdoExtension, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: cmbatt.c:75
UNICODE_STRING GlobalRegistryPath
Definition: cmbatt.c:20
VOID NTAPI CmBattPowerCallBack(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG Action, IN ULONG Value)
Definition: cmbatt.c:30
#define CMBATT_GENERIC_INFO
Definition: cmbatt.h:36
NTSTATUS NTAPI CmBattPowerDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define CMBATT_GENERIC_WARNING
Definition: cmbatt.h:37
NTSTATUS NTAPI CmBattPnpDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS NTAPI CmBattAddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI CmBattSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define L(x)
Definition: resources.c:13
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
#define DbgPrint
Definition: hal.h:12
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNICODE_NULL
PVOID NTAPI ExRegisterCallback(IN PCALLBACK_OBJECT CallbackObject, IN PCALLBACK_FUNCTION CallbackFunction, IN PVOID CallbackContext)
Definition: callback.c:556
NTSTATUS NTAPI ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject, IN POBJECT_ATTRIBUTES ObjectAttributes, IN BOOLEAN Create, IN BOOLEAN AllowMultipleCallbacks)
Definition: callback.c:361
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
#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
USHORT MaximumLength
Definition: env_spec_w32.h:370
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_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_POWER
#define ObDereferenceObject
Definition: obfuncs.h:203

◆ PdoExt()

◆ USBD_CreateDeviceEx()

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

Definition at line 2523 of file usbhub.c.

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

Referenced by USBH_CreateDevice(), and USBH_ResetDevice().

◆ USBD_GetDeviceInformationEx()

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

Definition at line 2654 of file usbhub.c.

2659{
2662 SIZE_T DeviceInfoLength;
2663 PUSB_NODE_CONNECTION_INFORMATION_EX NodeInfo;
2664 SIZE_T NodeInfoLength;
2665 ULONG PipeNumber;
2666 ULONG dummy;
2668
2669 DPRINT("USBD_GetDeviceInformationEx ... \n");
2670
2671 QueryDeviceInformation = HubExtension->BusInterface.QueryDeviceInformation;
2672
2674 {
2676 return Status;
2677 }
2678
2679 DeviceInfoLength = sizeof(USB_DEVICE_INFORMATION_0);
2680
2681 while (TRUE)
2682 {
2684 DeviceInfoLength,
2685 USB_HUB_TAG);
2686
2687 if (!DeviceInfo)
2688 {
2690 }
2691
2692 RtlZeroMemory(DeviceInfo, DeviceInfoLength);
2693
2694 DeviceInfo->InformationLevel = 0;
2695
2696 Status = QueryDeviceInformation(HubExtension->BusInterface.BusContext,
2698 DeviceInfo,
2699 DeviceInfoLength,
2700 &dummy);
2701
2703 {
2704 break;
2705 }
2706
2707 DeviceInfoLength = DeviceInfo->ActualLength;
2708
2710 }
2711
2712 NodeInfo = NULL;
2713 NodeInfoLength = 0;
2714
2715 if (NT_SUCCESS(Status))
2716 {
2717 NodeInfoLength = (sizeof(USB_NODE_CONNECTION_INFORMATION_EX) - sizeof(USB_PIPE_INFO)) +
2718 DeviceInfo->NumberOfOpenPipes * sizeof(USB_PIPE_INFO);
2719
2720 NodeInfo = ExAllocatePoolWithTag(PagedPool, NodeInfoLength, USB_HUB_TAG);
2721
2722 if (!NodeInfo)
2723 {
2726 }
2727
2728 RtlZeroMemory(NodeInfo, NodeInfoLength);
2729
2730 NodeInfo->ConnectionIndex = Info->ConnectionIndex;
2731
2732 RtlCopyMemory(&NodeInfo->DeviceDescriptor,
2733 &DeviceInfo->DeviceDescriptor,
2734 sizeof(USB_DEVICE_DESCRIPTOR));
2735
2736 NodeInfo->CurrentConfigurationValue = DeviceInfo->CurrentConfigurationValue;
2737 NodeInfo->Speed = DeviceInfo->DeviceSpeed;
2738 NodeInfo->DeviceIsHub = PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_HUB_DEVICE;
2739 NodeInfo->DeviceAddress = DeviceInfo->DeviceAddress;
2740 NodeInfo->NumberOfOpenPipes = DeviceInfo->NumberOfOpenPipes;
2741 NodeInfo->ConnectionStatus = Info->ConnectionStatus;
2742
2743 for (PipeNumber = 0;
2744 PipeNumber < DeviceInfo->NumberOfOpenPipes;
2745 PipeNumber++)
2746 {
2747 RtlCopyMemory(&NodeInfo->PipeList[PipeNumber],
2748 &DeviceInfo->PipeList[PipeNumber],
2749 sizeof(USB_PIPE_INFO));
2750 }
2751 }
2752
2754
2755 if (NodeInfo)
2756 {
2757 if (NodeInfoLength <= Length)
2758 {
2759 Length = NodeInfoLength;
2760 }
2761 else
2762 {
2764 }
2765
2766 RtlCopyMemory(Info, NodeInfo, Length);
2767
2768 ExFreePoolWithTag(NodeInfo, USB_HUB_TAG);
2769 }
2770
2771 return Status;
2772}
BOOL NTAPI QueryDeviceInformation(_In_ PCWSTR DriveRoot, _Out_ PVOID DeviceInformation, _In_ ULONG BufferSize)
Retrieves disk device information.
Definition: query.c:79
_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 USB_HUB_TAG
Definition: usbhub.h:26
#define USBHUB_PDO_FLAG_HUB_DEVICE
Definition: usbhub.h:61
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690

Referenced by USBH_IoctlGetNodeConnectionInformation().

◆ USBD_InitializeDeviceEx()

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

Definition at line 2577 of file usbhub.c.

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

Referenced by USBH_CreateDevice(), and USBH_ResetDevice().

◆ USBD_RegisterRootHubCallBack()

NTSTATUS NTAPI USBD_RegisterRootHubCallBack ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3001 of file usbhub.c.

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

Referenced by USBH_StartHubFdoDevice().

◆ USBD_RemoveDeviceEx()

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

Definition at line 2553 of file usbhub.c.

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

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

◆ USBD_RestoreDeviceEx()

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

Definition at line 2776 of file usbhub.c.

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

Referenced by USBH_ResetDevice().

◆ USBD_UnRegisterRootHubCallBack()

NTSTATUS NTAPI USBD_UnRegisterRootHubCallBack ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3023 of file usbhub.c.

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

Referenced by USBH_FdoCleanup().

◆ USBH_AllocateWorkItem()

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

◆ USBH_CheckDeviceLanguage()

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

Definition at line 4257 of file usbhub.c.

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

Referenced by USBH_GetSerialNumberString(), and USBH_PdoQueryDeviceText().

◆ USBH_CheckHubIdle()

VOID NTAPI USBH_CheckHubIdle ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3823 of file usbhub.c.

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

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

◆ USBH_CheckIdleAbort()

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

Definition at line 3236 of file usbhub.c.

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

Referenced by USBH_FdoIdleNotificationCallback(), and USBH_FdoPower().

◆ USBH_CheckIdleDeferred()

VOID NTAPI USBH_CheckIdleDeferred ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 3972 of file usbhub.c.

3973{
3974 PUSBHUB_IO_WORK_ITEM HubIoWorkItem;
3976
3977 DPRINT("USBH_CheckIdleDeferred: HubExtension - %p\n", HubExtension);
3978
3979 Status = USBH_AllocateWorkItem(HubExtension,
3980 &HubIoWorkItem,
3982 0,
3983 NULL,
3985
3986 DPRINT("USBH_CheckIdleDeferred: HubIoWorkItem - %p\n", HubIoWorkItem);
3987
3988 if (NT_SUCCESS(Status))
3989 {
3990 USBH_QueueWorkItem(HubExtension, HubIoWorkItem);
3991 }
3992}
VOID NTAPI USBH_CheckIdleWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: usbhub.c:3963
NTSTATUS NTAPI USBH_AllocateWorkItem(PUSBHUB_FDO_EXTENSION HubExtension, PUSBHUB_IO_WORK_ITEM *OutHubIoWorkItem, PUSBHUB_WORKER_ROUTINE WorkerRoutine, SIZE_T BufferLength, PVOID *OutHubWorkItemBuffer, WORK_QUEUE_TYPE Type)
Definition: usbhub.c:2806
VOID NTAPI USBH_QueueWorkItem(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem)
Definition: usbhub.c:2932
@ DelayedWorkQueue
Definition: extypes.h:190

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

◆ USBH_CompleteIrp()

VOID NTAPI USBH_CompleteIrp ( IN PIRP  Irp,
IN NTSTATUS  CompleteStatus 
)

◆ USBH_CompletePowerIrp()

VOID NTAPI USBH_CompletePowerIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN NTSTATUS  NtStatus 
)

Definition at line 18 of file power.c.

21{
22 DPRINT("USBH_CompletePowerIrp: HubExtension - %p, Irp - %p, NtStatus - %lX\n",
23 HubExtension,
24 Irp,
25 NtStatus);
26
27 Irp->IoStatus.Status = NtStatus;
28
30
31 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
32 {
33 KeSetEvent(&HubExtension->PendingRequestEvent,
35 FALSE);
36 }
37
39}
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758

Referenced by USBH_FdoCleanup(), and USBH_PdoRemoveDevice().

◆ USBH_CreateDevice()

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

Definition at line 4394 of file usbhub.c.

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

Referenced by USBH_FdoQueryBusRelations().

◆ USBH_DeviceControl()

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

Definition at line 1136 of file ioctl.c.

1138{
1140 PIO_STACK_LOCATION IoStack;
1142 BOOLEAN IsCheckHubIdle = FALSE;
1143
1144 DPRINT("USBH_DeviceControl: HubExtension - %p, Irp - %p\n",
1145 HubExtension,
1146 Irp);
1147
1149 ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
1150 DPRINT("USBH_DeviceControl: ControlCode - %lX\n", ControlCode);
1151
1152 if ((HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0) &&
1153 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED))
1154 {
1155 IsCheckHubIdle = TRUE;
1156 USBH_HubSetD0(HubExtension);
1157 }
1158
1159 switch (ControlCode)
1160 {
1161 case IOCTL_USB_GET_HUB_CAPABILITIES:
1162 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_HUB_CAPABILITIES\n");
1163 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1164 {
1165 Status = USBH_IoctlGetHubCapabilities(HubExtension, Irp);
1166 break;
1167 }
1168
1170 break;
1171
1172 case IOCTL_USB_HUB_CYCLE_PORT:
1173 DPRINT1("USBH_DeviceControl: IOCTL_USB_HUB_CYCLE_PORT UNIMPLEMENTED. FIXME\n");
1174 DbgBreakPoint();
1175 break;
1176
1178 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_INFORMATION\n");
1179 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1180 {
1181 Status = USBH_IoctlGetNodeInformation(HubExtension, Irp);
1182 break;
1183 }
1184
1186 break;
1187
1189 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_CONNECTION_INFORMATION\n");
1190 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1191 {
1193 Irp,
1194 FALSE);
1195 break;
1196 }
1197
1199 break;
1200
1201 case IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX:
1202 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX\n");
1203 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1204 {
1206 Irp,
1207 TRUE);
1208 break;
1209 }
1210
1212 break;
1213
1214 case IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES:
1215 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES\n");
1216 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1217 {
1219 break;
1220 }
1221
1223 break;
1224
1226 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_CONNECTION_NAME\n");
1227 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1228 {
1229 Status = USBH_IoctlGetNodeName(HubExtension, Irp);
1230 break;
1231 }
1232
1234 break;
1235
1237 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME\n");
1238 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1239 {
1241 break;
1242 }
1243
1245 break;
1246
1248 DPRINT("USBH_DeviceControl: IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION\n");
1249 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
1250 {
1251 Status = USBH_IoctlGetDescriptor(HubExtension, Irp);
1252 break;
1253 }
1254
1256 break;
1257
1258 case IOCTL_KS_PROPERTY:
1259 DPRINT("USBH_DeviceControl: IOCTL_KS_PROPERTY\n");
1262 break;
1263
1264 default:
1265 DPRINT1("USBH_DeviceControl: Unhandled IOCTL_ - %lX\n", ControlCode);
1266 Status = USBH_PassIrp(HubExtension->RootHubPdo, Irp);
1267 break;
1268 }
1269
1270 if (IsCheckHubIdle)
1271 {
1272 USBH_CheckHubIdle(HubExtension);
1273 }
1274
1275 return Status;
1276}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
NTSTATUS NTAPI USBH_IoctlGetNodeName(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:563
NTSTATUS NTAPI USBH_IoctlGetNodeConnectionInformation(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN BOOLEAN IsExt)
Definition: ioctl.c:834
NTSTATUS NTAPI USBH_IoctlGetNodeConnectionAttributes(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:779
NTSTATUS NTAPI USBH_IoctlGetHubCapabilities(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:731
NTSTATUS NTAPI USBH_IoctlGetDescriptor(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:1024
NTSTATUS NTAPI USBH_IoctlGetNodeConnectionDriverKeyName(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:947
NTSTATUS NTAPI USBH_IoctlGetNodeInformation(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: ioctl.c:684
NTSTATUS NTAPI USBH_HubSetD0(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:104
NTSYSAPI void WINAPI DbgBreakPoint(void)
#define IOCTL_KS_PROPERTY
Definition: ks.h:127
struct _IO_STACK_LOCATION::@1710::@1711 DeviceIoControl
union _IO_STACK_LOCATION::@1710 Parameters
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
VOID NTAPI USBH_CheckHubIdle(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3823
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
#define USBHUB_FDO_FLAG_DEVICE_STOPPED
Definition: usbhub.h:37
#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
Definition: usbioctl.h:175
#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME
Definition: usbioctl.h:187
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION
Definition: usbioctl.h:172
#define IOCTL_USB_GET_NODE_INFORMATION
Definition: usbioctl.h:169
#define IOCTL_USB_GET_NODE_CONNECTION_NAME
Definition: usbioctl.h:178
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55

Referenced by USBH_FdoDispatch().

◆ USBH_FdoPnP()

NTSTATUS NTAPI USBH_FdoPnP ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN UCHAR  Minor 
)

Definition at line 2362 of file pnp.c.

2365{
2367 PIO_STACK_LOCATION IoStack;
2368 DEVICE_RELATION_TYPE RelationsType;
2369 BOOLEAN IsCheckIdle;
2370
2371 DPRINT_PNP("USBH_FdoPnP: HubExtension - %p, Irp - %p, Minor - %X\n",
2372 HubExtension,
2373 Irp,
2374 Minor);
2375
2376 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST &&
2378 {
2379 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_SUSPENDED;
2380 }
2381
2382 KeWaitForSingleObject(&HubExtension->IdleSemaphore,
2383 Executive,
2384 KernelMode,
2385 FALSE,
2386 NULL);
2387
2388 DPRINT_PNP("USBH_FdoPnP: HubFlags - %lX\n", HubExtension->HubFlags);
2389
2390 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_GOING_IDLE)
2391 {
2392 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_SUSPENDED;
2393 }
2394
2396 RelationsType = IoStack->Parameters.QueryDeviceRelations.Type;
2397
2398 if ((HubExtension->CurrentPowerState.DeviceState == PowerDeviceD0) ||
2399 !(HubExtension->HubFlags & (USBHUB_FDO_FLAG_DEVICE_STOPPED | USBHUB_FDO_FLAG_DEVICE_STARTED)) ||
2401 {
2402 IsCheckIdle = FALSE;
2403 }
2404 else
2405 {
2406 DPRINT_PNP("USBH_FdoPnP: IsCheckIdle - TRUE\n");
2407 IsCheckIdle = TRUE;
2408 USBH_HubSetD0(HubExtension);
2409 }
2410
2411 switch (Minor)
2412 {
2414 DPRINT_PNP("FDO IRP_MN_START_DEVICE\n");
2415 IsCheckIdle = FALSE;
2416 Irp->IoStatus.Status = STATUS_SUCCESS;
2417 Status = USBH_FdoStartDevice(HubExtension, Irp);
2418 break;
2419
2421 DPRINT_PNP("FDO IRP_MN_QUERY_REMOVE_DEVICE\n");
2422 Irp->IoStatus.Status = STATUS_SUCCESS;
2423 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2424 break;
2425
2427 DPRINT_PNP("FDO IRP_MN_REMOVE_DEVICE\n");
2428 IsCheckIdle = FALSE;
2429 HubExtension->HubFlags |= USBHUB_FDO_FLAG_DEVICE_REMOVED;
2430 Irp->IoStatus.Status = STATUS_SUCCESS;
2431 Status = USBH_FdoRemoveDevice(HubExtension, Irp);
2432 break;
2433
2435 DPRINT_PNP("FDO IRP_MN_CANCEL_REMOVE_DEVICE\n");
2436 Irp->IoStatus.Status = STATUS_SUCCESS;
2437 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2438 break;
2439
2440 case IRP_MN_STOP_DEVICE:
2441 DPRINT_PNP("FDO IRP_MN_STOP_DEVICE\n");
2442 IsCheckIdle = FALSE;
2443 Irp->IoStatus.Status = STATUS_SUCCESS;
2444 Status = USBH_FdoStopDevice(HubExtension, Irp);
2445 break;
2446
2448 DPRINT_PNP("FDO IRP_MN_QUERY_STOP_DEVICE\n");
2449 Irp->IoStatus.Status = STATUS_SUCCESS;
2450 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2451 break;
2452
2454 DPRINT_PNP("FDO IRP_MN_CANCEL_STOP_DEVICE\n");
2455 Irp->IoStatus.Status = STATUS_SUCCESS;
2456 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2457 break;
2458
2460 DPRINT_PNP("FDO IRP_MN_QUERY_DEVICE_RELATIONS\n");
2461
2462 if (RelationsType != BusRelations)
2463 {
2464 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2465 break;
2466 }
2467
2468 HubExtension->HubFlags |= USBHUB_FDO_FLAG_HUB_BUSY;
2469
2470 IsCheckIdle = TRUE;
2471 DPRINT_PNP("USBH_FdoPnP: IsCheckIdle - TRUE\n");
2472
2473 Status = USBH_FdoQueryBusRelations(HubExtension, Irp);
2474
2475 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_HUB_BUSY;
2476 break;
2477
2479 DPRINT_PNP("FDO IRP_MN_QUERY_INTERFACE\n");
2480 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2481 break;
2482
2484 DPRINT_PNP("FDO IRP_MN_QUERY_CAPABILITIES\n");
2486
2489 HubExtension,
2490 TRUE,
2491 FALSE,
2492 FALSE);
2493
2494 Status = IoCallDriver(HubExtension->LowerDevice, Irp);
2495 break;
2496
2498 DPRINT_PNP("FDO IRP_MN_QUERY_RESOURCES\n");
2499 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2500 break;
2501
2503 DPRINT_PNP("FDO IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
2504 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2505 break;
2506
2508 DPRINT_PNP("FDO IRP_MN_QUERY_DEVICE_TEXT\n");
2509 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2510 break;
2511
2513 DPRINT_PNP("FDO IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
2514 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2515 break;
2516
2517 case IRP_MN_READ_CONFIG:
2518 DPRINT_PNP("FDO IRP_MN_READ_CONFIG\n");
2519 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2520 break;
2521
2523 DPRINT_PNP("FDO IRP_MN_WRITE_CONFIG\n");
2524 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2525 break;
2526
2527 case IRP_MN_EJECT:
2528 DPRINT_PNP("FDO IRP_MN_EJECT\n");
2529 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2530 break;
2531
2532 case IRP_MN_SET_LOCK:
2533 DPRINT_PNP("FDO IRP_MN_SET_LOCK\n");
2534 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2535 break;
2536
2537 case IRP_MN_QUERY_ID:
2538 DPRINT_PNP("FDO IRP_MN_QUERY_ID\n");
2539 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2540 break;
2541
2543 DPRINT_PNP("FDO IRP_MN_QUERY_PNP_DEVICE_STATE\n");
2544
2545 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_FAILED)
2546 {
2547 Irp->IoStatus.Information |= PNP_DEVICE_FAILED;
2548 }
2549
2550 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2551 break;
2552
2554 DPRINT_PNP("FDO IRP_MN_QUERY_BUS_INFORMATION\n");
2555 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2556 break;
2557
2559 DPRINT_PNP("FDO IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
2560 Irp->IoStatus.Status = STATUS_SUCCESS;
2561 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2562 break;
2563
2565 DPRINT_PNP("FDO IRP_MN_SURPRISE_REMOVAL\n");
2566 USBH_FdoSurpriseRemoveDevice(HubExtension, Irp);
2567 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2568 break;
2569
2570 default:
2571 DPRINT_PNP("FDO unknown IRP_MN_???\n");
2572 Status = USBH_PassIrp(HubExtension->LowerDevice, Irp);
2573 break;
2574 }
2575
2576 KeReleaseSemaphore(&HubExtension->IdleSemaphore,
2578 1,
2579 FALSE);
2580
2581 if (IsCheckIdle)
2582 {
2583 DPRINT_PNP("USBH_FdoPnP: call USBH_CheckIdleDeferred()\n");
2584 USBH_CheckIdleDeferred(HubExtension);
2585 }
2586
2587 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_STATE_CHANGING;
2588
2589 return Status;
2590}
#define DPRINT_PNP(...)
Definition: dbg_uhub.h:109
NTSTATUS NTAPI USBH_QueryCapsComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: pnp.c:59
NTSTATUS NTAPI USBH_FdoStartDevice(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: pnp.c:988
NTSTATUS NTAPI USBH_FdoRemoveDevice(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: pnp.c:1463
NTSTATUS NTAPI USBH_FdoQueryBusRelations(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: pnp.c:1027
NTSTATUS NTAPI USBH_FdoStopDevice(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: pnp.c:1453
VOID NTAPI USBH_FdoSurpriseRemoveDevice(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: pnp.c:1524
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
#define IoCallDriver
Definition: irp.c:1225
struct _IO_STACK_LOCATION::@4301::@4326 QueryDeviceRelations
VOID NTAPI USBH_CheckIdleDeferred(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3972
#define USBHUB_FDO_FLAG_DEVICE_SUSPENDED
Definition: usbhub.h:58
#define USBHUB_FDO_FLAG_GOING_IDLE
Definition: usbhub.h:57
#define USBHUB_FDO_FLAG_HUB_BUSY
Definition: usbhub.h:38
_Out_opt_ PULONG Minor
Definition: cmfuncs.h:44
#define IRP_MN_CANCEL_STOP_DEVICE
@ BusRelations
Definition: iotypes.h:2154
@ TargetDeviceRelation
Definition: iotypes.h:2158
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IRP_MN_EJECT
#define IRP_MN_QUERY_INTERFACE
#define IRP_MN_START_DEVICE
#define PNP_DEVICE_FAILED
Definition: iotypes.h:1003
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_READ_CONFIG
#define IRP_MN_WRITE_CONFIG
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_ID
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_CAPABILITIES
#define IRP_MN_QUERY_RESOURCES
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_SET_LOCK
enum _DEVICE_RELATION_TYPE DEVICE_RELATION_TYPE
#define IRP_MN_QUERY_BUS_INFORMATION
#define IRP_MN_QUERY_REMOVE_DEVICE

Referenced by USBH_FdoDispatch().

◆ USBH_FdoPower()

NTSTATUS NTAPI USBH_FdoPower ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN UCHAR  Minor 
)

Definition at line 551 of file power.c.

554{
556 PIO_STACK_LOCATION IoStack;
558 POWER_STATE DevicePwrState;
559 BOOLEAN IsAllPortsD3;
560 PUSBHUB_PORT_DATA PortData;
561 PDEVICE_OBJECT PdoDevice;
562 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
563 ULONG Port;
564
565 DPRINT_PWR("USBH_FdoPower: HubExtension - %p, Irp - %p, Minor - %X\n",
566 HubExtension,
567 Irp,
568 Minor);
569
570 switch (Minor)
571 {
572 case IRP_MN_WAIT_WAKE:
573 DPRINT_PWR("USBH_FdoPower: IRP_MN_WAIT_WAKE\n");
574
576
579 HubExtension,
580 TRUE,
581 TRUE,
582 TRUE);
583
586 PoCallDriver(HubExtension->LowerDevice, Irp);
587
588 return STATUS_PENDING;
589
591 DPRINT_PWR("USBH_FdoPower: IRP_MN_POWER_SEQUENCE\n");
592 break;
593
594 case IRP_MN_SET_POWER:
595 DPRINT_PWR("USBH_FdoPower: IRP_MN_SET_POWER\n");
596
598 DPRINT_PWR("USBH_FdoPower: IRP_MN_SET_POWER/DevicePowerState\n");
599 PowerState = IoStack->Parameters.Power.State;
600
601 if (IoStack->Parameters.Power.Type == DevicePowerState)
602 {
603 DPRINT_PWR("USBH_FdoPower: PowerState - %x\n",
604 PowerState.DeviceState);
605
606 if (HubExtension->CurrentPowerState.DeviceState == PowerState.DeviceState)
607 {
609
612 PoCallDriver(HubExtension->LowerDevice, Irp);
613
614 return STATUS_PENDING;
615 }
616
617 switch (PowerState.DeviceState)
618 {
619 case PowerDeviceD0:
620 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_SET_D0_STATE))
621 {
622 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_NOT_D0_STATE |
624
625 HubExtension->HubFlags |= USBHUB_FDO_FLAG_SET_D0_STATE;
626
628
631 HubExtension,
632 TRUE,
633 TRUE,
634 TRUE);
635 }
636 else
637 {
640 }
641
643 PoCallDriver(HubExtension->LowerDevice, Irp);
644 return STATUS_PENDING;
645
646 case PowerDeviceD1:
647 case PowerDeviceD2:
648 case PowerDeviceD3:
649 if (HubExtension->ResetRequestCount)
650 {
651 IoCancelIrp(HubExtension->ResetPortIrp);
652
653 KeWaitForSingleObject(&HubExtension->ResetEvent,
654 Executive,
656 FALSE,
657 NULL);
658 }
659
660 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
661 {
662 HubExtension->HubFlags |= (USBHUB_FDO_FLAG_NOT_D0_STATE |
664
665 IoCancelIrp(HubExtension->SCEIrp);
666
667 KeWaitForSingleObject(&HubExtension->StatusChangeEvent,
668 Executive,
670 FALSE,
671 NULL);
672 }
673
674 HubExtension->CurrentPowerState.DeviceState = PowerState.DeviceState;
675
676 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DO_SUSPENSE &&
677 USBH_CheckIdleAbort(HubExtension, TRUE, TRUE) == TRUE)
678 {
679 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_NOT_D0_STATE |
681
682 HubExtension->CurrentPowerState.DeviceState = PowerDeviceD0;
683
685
687
688 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
690
691 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
692
693 KeReleaseSemaphore(&HubExtension->IdleSemaphore,
695 1,
696 FALSE);
697
698 return STATUS_UNSUCCESSFUL;
699 }
700
702
705 HubExtension,
706 TRUE,
707 TRUE,
708 TRUE);
709
712 PoCallDriver(HubExtension->LowerDevice, Irp);
713
714 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DO_SUSPENSE)
715 {
716 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
717
718 KeReleaseSemaphore(&HubExtension->IdleSemaphore,
720 1,
721 FALSE);
722 }
723
724 return STATUS_PENDING;
725
726 default:
727 DPRINT1("USBH_FdoPower: Unsupported PowerState.DeviceState\n");
729 break;
730 }
731 }
732 else
733 {
734 if (PowerState.SystemState != PowerSystemWorking)
735 {
737 PowerState.SystemState;
738 }
739
740 if (PowerState.SystemState == PowerSystemHibernate)
741 {
742 HubExtension->HubFlags |= USBHUB_FDO_FLAG_HIBERNATE_STATE;
743 }
744
745 PortData = HubExtension->PortData;
746
747 IsAllPortsD3 = TRUE;
748
749 if (PortData && HubExtension->HubDescriptor)
750 {
751 for (Port = 0;
752 Port < HubExtension->HubDescriptor->bNumberOfPorts;
753 Port++)
754 {
755 PdoDevice = PortData[Port].DeviceObject;
756
757 if (PdoDevice)
758 {
759 PortExtension = PdoDevice->DeviceExtension;
760
761 if (PortExtension->CurrentPowerState.DeviceState != PowerDeviceD3)
762 {
763 IsAllPortsD3 = FALSE;
764 break;
765 }
766 }
767 }
768 }
769
770 if (PowerState.SystemState == PowerSystemWorking)
771 {
772 DevicePwrState.DeviceState = PowerDeviceD0;
773 }
774 else if (HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP ||
775 !IsAllPortsD3)
776 {
777 DevicePwrState.DeviceState = HubExtension->DeviceState[PowerState.SystemState];
778
779 if (DevicePwrState.DeviceState == PowerDeviceUnspecified)
780 {
781 goto Exit;
782 }
783 }
784 else
785 {
786 DevicePwrState.DeviceState = PowerDeviceD3;
787 }
788
789 if (DevicePwrState.DeviceState != HubExtension->CurrentPowerState.DeviceState &&
790 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
791 {
792 HubExtension->PowerIrp = Irp;
793
795
796 if (PoRequestPowerIrp(HubExtension->LowerPDO,
798 DevicePwrState,
800 (PVOID)HubExtension,
802 {
803 return STATUS_PENDING;
804 }
805
808 PoCallDriver(HubExtension->LowerDevice, Irp);
809
810 return STATUS_PENDING;
811 }
812
813 Exit:
814
815 HubExtension->SystemPowerState.SystemState = PowerState.SystemState;
816
817 if (PowerState.SystemState == PowerSystemWorking)
818 {
819 USBH_CheckIdleDeferred(HubExtension);
820 }
821
824
825 return PoCallDriver(HubExtension->LowerDevice, Irp);
826 }
827
828 break;
829
831 DPRINT_PWR("USBH_FdoPower: IRP_MN_QUERY_POWER\n");
832 break;
833
834 default:
835 DPRINT1("USBH_FdoPower: unknown IRP_MN_POWER!\n");
836 break;
837 }
838
841 Status = PoCallDriver(HubExtension->LowerDevice, Irp);
842
843 return Status;
844}
#define DPRINT_PWR(...)
Definition: dbg_uhub.h:108
NTSTATUS NTAPI USBH_PowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: power.c:440
VOID NTAPI USBH_FdoDeferPoRequestCompletion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:513
NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: power.c:362
IoMarkIrpPending(Irp)
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1101
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
@ PowerSystemHibernate
Definition: ntpoapi.h:40
@ DevicePowerState
Definition: ntpoapi.h:63
@ PowerDeviceD1
Definition: ntpoapi.h:50
@ PowerDeviceUnspecified
Definition: ntpoapi.h:48
@ PowerDeviceD2
Definition: ntpoapi.h:51
@ PowerDeviceD3
Definition: ntpoapi.h:52
struct _IO_STACK_LOCATION::@4301::@4337 Power
POWER_STATE SystemPowerState
Definition: usbhub.h:161
#define STATUS_PENDING
Definition: telnetd.h:14
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
SYSTEM_POWER_STATE SystemState
Definition: ntpoapi.h:57
NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2457
BOOLEAN NTAPI USBH_CheckIdleAbort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
Definition: usbhub.c:3236
#define USBHUB_FDO_FLAG_DO_SUSPENSE
Definition: usbhub.h:56
#define USBHUB_FDO_FLAG_HIBERNATE_STATE
Definition: usbhub.h:54
#define USBHUB_FDO_FLAG_NOT_D0_STATE
Definition: usbhub.h:43
#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP
Definition: usbhub.h:39
#define USBHUB_FDO_FLAG_SET_D0_STATE
Definition: usbhub.h:42
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3040
#define IRP_MN_WAIT_WAKE
#define IRP_MN_POWER_SEQUENCE
#define IRP_MN_SET_POWER
#define IRP_MN_QUERY_POWER

Referenced by USBH_FdoDispatch().

◆ 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}
PDEVICE_OBJECT LowerDevice
Definition: usbhub.h:150
_In_ PIO_STACK_LOCATION _In_ PURB Urb
Definition: usbdlib.h:267
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_FreeWorkItem()

VOID NTAPI USBH_FreeWorkItem ( IN PUSBHUB_IO_WORK_ITEM  HubIoWorkItem)

Definition at line 2952 of file usbhub.c.

2953{
2955
2956 DPRINT("USBH_FreeWorkItem: ... \n");
2957
2958 WorkItem = HubIoWorkItem->HubWorkItem;
2959
2960 if (HubIoWorkItem->HubWorkItemBuffer)
2961 {
2962 ExFreePoolWithTag(HubIoWorkItem->HubWorkItemBuffer, USB_HUB_TAG);
2963 }
2964
2965 ExFreePoolWithTag(HubIoWorkItem, USB_HUB_TAG);
2966
2968}
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115

Referenced by USBH_ChangeIndicationProcessChange().

◆ USBH_GetConfigurationDescriptor()

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

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 ExFreePool(addr)
Definition: env_spec_w32.h:352
#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_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_GetRootHubExtension()

PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 699 of file usbhub.c.

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

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

◆ USBH_HubCancelIdleIrp()

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

Definition at line 3221 of file usbhub.c.

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

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

◆ USBH_HubCancelWakeIrp()

VOID NTAPI USBH_HubCancelWakeIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp 
)

Definition at line 43 of file power.c.

45{
46 DPRINT("USBH_HubCancelWakeIrp: HubExtension - %p, Irp - %p\n",
47 HubExtension,
48 Irp);
49
51
52 if (InterlockedExchange((PLONG)&HubExtension->FdoWaitWakeLock, 1))
53 {
55 Irp->IoStatus.Status = STATUS_CANCELLED;
57 }
58}
int32_t * PLONG
Definition: typedefs.h:58
#define STATUS_CANCELLED
Definition: udferr_usr.h:170

Referenced by USBH_FdoCleanup().

◆ USBH_HubCompletePortWakeIrps()

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

Definition at line 308 of file power.c.

310{
311 LIST_ENTRY ListIrps;
312
313 DPRINT("USBH_HubCompletePortWakeIrps: NtStatus - %x\n", NtStatus);
314
315 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
316 {
317 USBH_HubQueuePortWakeIrps(HubExtension, &ListIrps);
318
320 &ListIrps,
321 NtStatus);
322 }
323}
VOID NTAPI USBH_HubQueuePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps)
Definition: power.c:251
VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps, IN NTSTATUS NtStatus)
Definition: power.c:293
Definition: typedefs.h:120

Referenced by USBH_FdoCleanup(), and USBH_FdoPoRequestD0Completion().

◆ 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}
unsigned short USHORT
Definition: pedump.c:61
#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_HubSetD0()

NTSTATUS NTAPI USBH_HubSetD0 ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 104 of file power.c.

105{
106 PUSBHUB_FDO_EXTENSION RootHubDevExt;
110
111 DPRINT("USBH_HubSetD0: HubExtension - %p\n", HubExtension);
112
113 RootHubDevExt = USBH_GetRootHubExtension(HubExtension);
114
115 if (RootHubDevExt->SystemPowerState.SystemState != PowerSystemWorking)
116 {
118 return Status;
119 }
120
121 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST)
122 {
123 DPRINT("USBH_HubSetD0: HubFlags - %lX\n", HubExtension->HubFlags);
124
125 KeWaitForSingleObject(&HubExtension->IdleEvent,
126 Suspended,
128 FALSE,
129 NULL);
130 }
131
133
134 PowerState.DeviceState = PowerDeviceD0;
135
136 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
140 &Event,
141 NULL);
142
143 if (Status == STATUS_PENDING)
144 {
146 Suspended,
148 FALSE,
149 NULL);
150 }
151
152 while (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAKEUP_START)
153 {
154 USBH_Wait(10);
155 }
156
157 return Status;
158}
VOID NTAPI USBH_HubESDRecoverySetD3Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:62
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
@ NotificationEvent
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
@ Suspended
Definition: ketypes.h:472

Referenced by USBH_DeviceControl(), USBH_FdoPnP(), USBH_IdleCancelPowerHubWorker(), USBH_IdleCompletePowerHubWorker(), and USBH_PdoRemoveDevice().

◆ USBH_HubStartESDRecovery()

NTSTATUS NTAPI USBH_HubStartESDRecovery ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 162 of file power.c.

163{
164 PUSBHUB_FDO_EXTENSION RootHubDevExt;
168
169 DPRINT("USBH_HubStartESDRecovery: HubExtension - %p\n", HubExtension);
170
171 RootHubDevExt = USBH_GetRootHubExtension(HubExtension);
172
173 if (RootHubDevExt->SystemPowerState.SystemState != PowerSystemWorking)
174 {
176 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
177 return Status;
178 }
179
181
182 /* First, set the hub to D3 (power off) */
183 PowerState.DeviceState = PowerDeviceD3;
184
185 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
189 &Event,
190 NULL);
191 if (Status == STATUS_PENDING)
192 {
194 Suspended,
196 FALSE,
197 NULL);
198 }
199 if (!NT_SUCCESS(Status))
200 {
201 DPRINT1("USBH_HubStartESDRecovery: Failed to set D3, Status - %lX\n", Status);
202 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
203 return Status;
204 }
205
206 /* Now set it back to D0 (power on) to complete the recovery */
207 PowerState.DeviceState = PowerDeviceD0;
208
209 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
213 HubExtension,
214 NULL);
216 {
217 DPRINT1("USBH_HubStartESDRecovery: Failed to set D0, Status - %lX\n", Status);
218 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
219 }
220
221 return Status;
222}
VOID NTAPI USBH_HubESDRecoverySetD0Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:77

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_IdleCancelPowerHubWorker()

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

Definition at line 226 of file power.c.

228{
229 PUSBHUB_IDLE_PORT_CANCEL_CONTEXT WorkItemIdlePower;
230 PIRP Irp;
231
232 DPRINT("USBH_IdleCancelPowerHubWorker: ... \n");
233
234 WorkItemIdlePower = Context;
235
236 if (HubExtension &&
237 HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
238 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
239 {
240 USBH_HubSetD0(HubExtension);
241 }
242
243 Irp = WorkItemIdlePower->Irp;
245
247}
IO_STATUS_BLOCK IoStatus

Referenced by USBH_PortIdleNotificationCancelRoutine().

◆ 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 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_PdoInternalControl()

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

Definition at line 1280 of file ioctl.c.

1282{
1283 PUSBHUB_FDO_EXTENSION HubExtension;
1286 PIO_STACK_LOCATION IoStack;
1287 PULONG HubCount;
1288
1289 DPRINT_IOCTL("USBH_PdoInternalControl: PortExtension - %p, Irp - %p\n",
1290 PortExtension,
1291 Irp);
1292
1293 HubExtension = PortExtension->HubExtension;
1294
1295 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_NOT_CONNECTED)
1296 {
1298 goto Exit;
1299 }
1300
1301 if (PortExtension->CurrentPowerState.DeviceState != PowerDeviceD0)
1302 {
1304 goto Exit;
1305 }
1306
1308 ControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
1309
1311 {
1312 HubExtension = PortExtension->RootHubExtension;
1313 DPRINT("USBH_PdoInternalControl: HubExtension - %p\n", HubExtension);
1314 }
1315
1316 if (!HubExtension)
1317 {
1319 goto Exit;
1320 }
1321
1322 switch (ControlCode)
1323 {
1325 return USBH_PdoIoctlSubmitUrb(PortExtension, Irp);
1326
1327 case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION:
1328 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
1329 return USBH_PortIdleNotificationRequest(PortExtension, Irp);
1330
1332 DPRINT("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_PORT_STATUS\n");
1333 return USBH_PdoIoctlGetPortStatus(PortExtension, Irp);
1334
1336 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_RESET_PORT\n");
1337 return USBH_PdoIoctlResetPort(PortExtension, Irp);
1338
1340 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_ENABLE_PORT\n");
1341 DbgBreakPoint();
1342 break;
1343
1345 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_CYCLE_PORT\n");
1346 DbgBreakPoint();
1347 break;
1348
1349 case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
1350 DPRINT("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
1351 *(PVOID *)IoStack->Parameters.Others.Argument1 = PortExtension->DeviceHandle;
1353 break;
1354
1356 DPRINT("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_HUB_COUNT. PortPdoFlags - %lX\n",
1357 PortExtension->PortPdoFlags);
1358
1359 if (!(PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_HUB_DEVICE))
1360 {
1362 break;
1363 }
1364
1365 HubCount = IoStack->Parameters.Others.Argument1;
1366
1367 ++*HubCount;
1368
1369 Status = USBH_SyncGetHubCount(HubExtension->LowerDevice,
1370 HubCount);
1371
1372 DPRINT("USBH_PdoInternalControl: *HubCount - %x\n", *HubCount);
1373 break;
1374
1376 DPRINT("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO. PortPdoFlags - %lX\n",
1377 PortExtension->PortPdoFlags);
1378
1379 if (!(PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_HUB_DEVICE))
1380 {
1381 DbgBreakPoint();
1383
1384 *(PVOID *)IoStack->Parameters.Others.Argument1 = NULL;
1385
1387 break;
1388 }
1389
1390 ASSERT(HubExtension->RootHubPdo);
1391 return USBH_PassIrp(HubExtension->RootHubPdo, Irp);
1392
1394 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_HUB_NAME\n");
1395 DbgBreakPoint();
1396 break;
1397
1399 DPRINT1("USBH_PdoInternalControl: IOCTL_GET_HCD_DRIVERKEY_NAME\n");
1400 DbgBreakPoint();
1401 break;
1402
1404 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_BUS_INFO\n");
1405 DbgBreakPoint();
1406 break;
1407
1409 DPRINT1("USBH_PdoInternalControl: IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
1410 DbgBreakPoint();
1411 break;
1412
1413 default:
1414 DPRINT1("USBH_PdoInternalControl: unhandled IOCTL_ - %lX\n", ControlCode);
1415 break;
1416 }
1417
1418Exit:
1420 return Status;
1421}
#define DPRINT_IOCTL(...)
Definition: dbg_uhub.h:107
NTSTATUS NTAPI USBH_PdoIoctlGetPortStatus(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: ioctl.c:239
NTSTATUS NTAPI USBH_PortIdleNotificationRequest(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: ioctl.c:487
NTSTATUS NTAPI USBH_PdoIoctlSubmitUrb(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: ioctl.c:210
NTSTATUS NTAPI USBH_PdoIoctlResetPort(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: ioctl.c:379
#define STATUS_DEVICE_POWERED_OFF
Definition: ntstatus.h:275
struct _IO_STACK_LOCATION::@4301::@4340 Others
uint32_t * PULONG
Definition: typedefs.h:59
#define STATUS_DEVICE_NOT_CONNECTED
Definition: udferr_usr.h:160
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
NTSTATUS NTAPI USBH_SyncGetHubCount(IN PDEVICE_OBJECT DeviceObject, IN OUT PULONG OutHubCount)
Definition: usbhub.c:781
#define USBHUB_PDO_FLAG_NOT_CONNECTED
Definition: usbhub.h:67
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO
Definition: usbioctl.h:68
#define IOCTL_INTERNAL_USB_RESET_PORT
Definition: usbioctl.h:35
#define IOCTL_GET_HCD_DRIVERKEY_NAME
Definition: usbioctl.h:165
#define IOCTL_INTERNAL_USB_CYCLE_PORT
Definition: usbioctl.h:53
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT
Definition: usbioctl.h:50
#define IOCTL_INTERNAL_USB_ENABLE_PORT
Definition: usbioctl.h:47
#define IOCTL_INTERNAL_USB_GET_BUS_INFO
Definition: usbioctl.h:59
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
Definition: usbioctl.h:38
#define IOCTL_INTERNAL_USB_GET_HUB_NAME
Definition: usbioctl.h:56
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
Definition: usbioctl.h:44

Referenced by USBH_PdoDispatch().

◆ USBH_PdoPnP()

NTSTATUS NTAPI USBH_PdoPnP ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PIRP  Irp,
IN UCHAR  Minor,
OUT BOOLEAN IsCompleteIrp 
)

Definition at line 2594 of file pnp.c.

2598{
2600 PIO_STACK_LOCATION IoStack;
2601 PPNP_BUS_INFORMATION BusInfo;
2603 USHORT Size;
2605 PUSBHUB_FDO_EXTENSION HubExtension;
2606 PDEVICE_RELATIONS DeviceRelation;
2607
2608 DPRINT_PNP("USBH_PdoPnP: PortExtension - %p, Irp - %p, Minor - %X\n",
2609 PortExtension,
2610 Irp,
2611 Minor);
2612
2614
2615 *IsCompleteIrp = TRUE;
2616
2617 switch (Minor)
2618 {
2620 DPRINT_PNP("PDO IRP_MN_START_DEVICE\n");
2621 return USBH_PdoStartDevice(PortExtension, Irp);
2622
2624 DPRINT_PNP("PDO IRP_MN_QUERY_REMOVE_DEVICE\n");
2625 return STATUS_SUCCESS;
2626
2628 DPRINT_PNP("PDO IRP_MN_REMOVE_DEVICE\n");
2629 return USBH_PdoRemoveDevice(PortExtension, PortExtension->HubExtension);
2630
2632 DPRINT_PNP("PDO IRP_MN_CANCEL_REMOVE_DEVICE\n");
2633 return STATUS_SUCCESS;
2634
2635 case IRP_MN_STOP_DEVICE:
2636 DPRINT_PNP("PDO IRP_MN_STOP_DEVICE\n");
2637 return USBH_PdoStopDevice(PortExtension, Irp);
2638
2640 DPRINT_PNP("PDO IRP_MN_QUERY_STOP_DEVICE\n");
2641 return STATUS_SUCCESS;
2642
2644 DPRINT_PNP("PDO IRP_MN_CANCEL_STOP_DEVICE\n");
2645 return STATUS_SUCCESS;
2646
2648 DPRINT_PNP("PDO IRP_MN_QUERY_DEVICE_RELATIONS\n");
2649
2651 {
2652 return Irp->IoStatus.Status;
2653 }
2654
2655 DeviceRelation = ExAllocatePoolWithTag(PagedPool,
2656 sizeof(DEVICE_RELATIONS),
2657 USB_HUB_TAG);
2658
2659 if (DeviceRelation)
2660 {
2661 RtlZeroMemory(DeviceRelation, sizeof(DEVICE_RELATIONS));
2662
2663 DeviceRelation->Count = 1;
2664 DeviceRelation->Objects[0] = PortExtension->Common.SelfDevice;
2665
2666 ObReferenceObject(DeviceRelation->Objects[0]);
2667
2669 }
2670 else
2671 {
2673 }
2674
2675 Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
2676 break;
2677
2679 DPRINT_PNP("PDO IRP_MN_QUERY_INTERFACE\n");
2680
2681 *IsCompleteIrp = 0;
2682
2683 if (IsEqualGUIDAligned(IoStack->Parameters.QueryInterface.InterfaceType,
2684 &USB_BUS_INTERFACE_USBDI_GUID))
2685 {
2686 IoStack->Parameters.QueryInterface.InterfaceSpecificData = PortExtension->DeviceHandle;
2687 }
2688
2689 HubExtension = PortExtension->HubExtension;
2690
2691 if (!HubExtension)
2692 {
2693 HubExtension = PortExtension->RootHubExtension;
2694 }
2695
2696 Status = USBH_PassIrp(HubExtension->RootHubPdo, Irp);
2697 break;
2698
2700 DPRINT_PNP("PDO IRP_MN_QUERY_CAPABILITIES\n");
2701
2702 DeviceCapabilities = IoStack->Parameters.DeviceCapabilities.Capabilities;
2703
2704 Size = DeviceCapabilities->Size;
2705 Version = DeviceCapabilities->Version;
2706
2708 &PortExtension->Capabilities,
2709 sizeof(DEVICE_CAPABILITIES));
2710
2711 DeviceCapabilities->Size = Size;
2712 DeviceCapabilities->Version = Version;
2713
2714 /* All devices connected to a hub are removable */
2715 DeviceCapabilities->Removable = 1;
2716
2718 break;
2719
2721 DPRINT_PNP("PDO IRP_MN_QUERY_RESOURCES\n");
2722 Status = Irp->IoStatus.Status;
2723 break;
2724
2726 DPRINT_PNP("PDO IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
2727 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_ENUMERATED;
2728
2729 /* FIXME HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Enum\USB\
2730 Vid_????&Pid_????\????????????\Device Parameters\
2731 if (ExtPropDescSemaphore)
2732 */
2733
2735 break;
2736
2738 DPRINT_PNP("PDO IRP_MN_QUERY_DEVICE_TEXT\n");
2739 return USBH_PdoQueryDeviceText(PortExtension, Irp);
2740
2742 DPRINT_PNP("PDO IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
2743 Status = Irp->IoStatus.Status;
2744 break;
2745
2746 case IRP_MN_READ_CONFIG:
2747 DPRINT_PNP("PDO IRP_MN_READ_CONFIG\n");
2748 DbgBreakPoint();
2749 Status = Irp->IoStatus.Status;
2750 break;
2751
2753 DPRINT_PNP("PDO IRP_MN_WRITE_CONFIG\n");
2754 DbgBreakPoint();
2755 Status = Irp->IoStatus.Status;
2756 break;
2757
2758 case IRP_MN_EJECT:
2759 DPRINT_PNP("PDO IRP_MN_EJECT\n");
2760 DbgBreakPoint();
2761 Status = Irp->IoStatus.Status;
2762 break;
2763
2764 case IRP_MN_SET_LOCK:
2765 DPRINT_PNP("PDO IRP_MN_SET_LOCK\n");
2766 DbgBreakPoint();
2767 Status = Irp->IoStatus.Status;
2768 break;
2769
2770 case IRP_MN_QUERY_ID:
2771 DPRINT_PNP("PDO IRP_MN_QUERY_ID\n");
2772 return USBH_PdoQueryId(PortExtension, Irp);
2773
2775 DPRINT_PNP("PDO IRP_MN_QUERY_PNP_DEVICE_STATE\n");
2776 if (PortExtension->PortPdoFlags & (USBHUB_PDO_FLAG_INSUFFICIENT_PWR |
2780 {
2781 Irp->IoStatus.Information |= PNP_DEVICE_FAILED;
2782 }
2783
2785 break;
2786
2788 DPRINT_PNP("PDO IRP_MN_QUERY_BUS_INFORMATION\n");
2789
2791 sizeof(PNP_BUS_INFORMATION),
2792 USB_HUB_TAG);
2793
2794 if (!BusInfo)
2795 {
2797 }
2798
2799 RtlZeroMemory(BusInfo, sizeof(PNP_BUS_INFORMATION));
2800
2801 RtlCopyMemory(&BusInfo->BusTypeGuid,
2802 &GUID_BUS_TYPE_USB,
2803 sizeof(BusInfo->BusTypeGuid));
2804
2805 BusInfo->LegacyBusType = PNPBus;
2806 BusInfo->BusNumber = 0;
2807
2808 Irp->IoStatus.Information = (ULONG_PTR)BusInfo;
2810 break;
2811
2813 DPRINT_PNP("PDO IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
2814 DbgBreakPoint();
2815 Status = Irp->IoStatus.Status;
2816 break;
2817
2819 DPRINT_PNP("PDO IRP_MN_SURPRISE_REMOVAL\n");
2820 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REG_DEV_INTERFACE)
2821 {
2822 Status = USBH_SymbolicLink(PortExtension, NULL, FALSE);
2823
2824 if (NT_SUCCESS(Status))
2825 {
2826 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REG_DEV_INTERFACE;
2827 }
2828 }
2829
2831 break;
2832
2833 default:
2834 DPRINT_PNP("PDO unknown IRP_MN_???\n");
2835 Status = Irp->IoStatus.Status;
2836 break;
2837 }
2838
2839 return Status;
2840}
#define ULONG_PTR
Definition: config.h:101
NTSTATUS NTAPI USBH_PdoStopDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: pnp.c:2352
NTSTATUS NTAPI USBH_PdoRemoveDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: pnp.c:2180
NTSTATUS NTAPI USBH_PdoStartDevice(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: pnp.c:2124
NTSTATUS NTAPI USBH_PdoQueryDeviceText(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: pnp.c:1853
NTSTATUS NTAPI USBH_SymbolicLink(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN const GUID *InterfaceClassGuid, IN BOOLEAN IsEnable)
Definition: pnp.c:2008
NTSTATUS NTAPI USBH_PdoQueryId(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp)
Definition: pnp.c:1561
@ PNPBus
Definition: restypes.h:136
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2165
struct _IO_STACK_LOCATION::@4301::@4327 QueryInterface
struct _IO_STACK_LOCATION::@4301::@4328 DeviceCapabilities
INTERFACE_TYPE LegacyBusType
Definition: cmtypes.h:365
#define USBHUB_PDO_FLAG_OVERCURRENT_PORT
Definition: usbhub.h:75
#define USBHUB_PDO_FLAG_INSUFFICIENT_PWR
Definition: usbhub.h:77
#define USBHUB_PDO_FLAG_PORT_RESTORE_FAIL
Definition: usbhub.h:73
#define USBHUB_PDO_FLAG_ENUMERATED
Definition: usbhub.h:82
#define USBHUB_PDO_FLAG_REG_DEV_INTERFACE
Definition: usbhub.h:72
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
#define IsEqualGUIDAligned(guid1, guid2)
Definition: wdm.template.h:235
#define DeviceCapabilities
Definition: wingdi.h:4895
DEVICE_CAPABILITIES
Definition: iotypes.h:965
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by USBH_PdoDispatch().

◆ USBH_PdoPower()

NTSTATUS NTAPI USBH_PdoPower ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PIRP  Irp,
IN UCHAR  Minor 
)

Definition at line 848 of file power.c.

851{
852 NTSTATUS Status = Irp->IoStatus.Status;
853
854 DPRINT_PWR("USBH_FdoPower: PortExtension - %p, Irp - %p, Minor - %X\n",
855 PortExtension,
856 Irp,
857 Minor);
858
859 switch (Minor)
860 {
861 case IRP_MN_WAIT_WAKE:
862 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_WAIT_WAKE\n");
864 break;
865
867 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_POWER_SEQUENCE\n");
869 break;
870
871 case IRP_MN_SET_POWER:
872 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_SET_POWER\n");
874 break;
875
877 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_QUERY_POWER\n");
879 break;
880
881 default:
882 DPRINT1("USBHUB_PdoPower: unknown IRP_MN_POWER!\n");
884 break;
885 }
886
887 Irp->IoStatus.Status = Status;
888 Irp->IoStatus.Information = 0;
890
891 return Status;
892}

Referenced by USBH_PdoDispatch().

◆ USBH_PdoRemoveDevice()

NTSTATUS NTAPI USBH_PdoRemoveDevice ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PUSBHUB_FDO_EXTENSION  HubExtension 
)

Definition at line 2180 of file pnp.c.

2182{
2184 PDEVICE_OBJECT PortDevice;
2186 PUSBHUB_PORT_DATA PortData;
2187 PIRP IdleNotificationIrp;
2188 PIRP WakeIrp;
2192 USHORT Port;
2193 KIRQL Irql;
2194
2195 DPRINT("USBH_PdoRemoveDevice ... \n");
2196
2197 PortDevice = PortExtension->Common.SelfDevice;
2198 PortExtension->HubExtension = NULL;
2199
2200 Port = PortExtension->PortNumber;
2201 ASSERT(Port > 0);
2202
2203 if (HubExtension &&
2204 HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
2205 (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED) != 0)
2206 {
2207 USBH_HubSetD0(HubExtension);
2208 }
2209
2211 IdleNotificationIrp = PortExtension->IdleNotificationIrp;
2212
2213 if (IdleNotificationIrp)
2214 {
2215 PortExtension->IdleNotificationIrp = NULL;
2216 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_IDLE_NOTIFICATION;
2217
2218 if (IdleNotificationIrp->Cancel)
2219 {
2220 IdleNotificationIrp = NULL;
2221 }
2222
2223 if (IdleNotificationIrp)
2224 {
2225 IoSetCancelRoutine(IdleNotificationIrp, NULL);
2226 }
2227 }
2228
2229 WakeIrp = PortExtension->PdoWaitWakeIrp;
2230
2231 if (WakeIrp)
2232 {
2233 PortExtension->PdoWaitWakeIrp = NULL;
2234 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_WAIT_WAKE;
2235
2236 if (WakeIrp->Cancel || !IoSetCancelRoutine(WakeIrp, NULL))
2237 {
2238 WakeIrp = NULL;
2239
2240 ASSERT(HubExtension);
2241 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
2242 {
2243 KeSetEvent(&HubExtension->PendingRequestEvent,
2245 FALSE);
2246 }
2247 }
2248 }
2249
2251
2252 if (IdleNotificationIrp)
2253 {
2254 IdleNotificationIrp->IoStatus.Status = STATUS_CANCELLED;
2255 IoCompleteRequest(IdleNotificationIrp, IO_NO_INCREMENT);
2256 }
2257
2258 if (WakeIrp)
2259 {
2260 ASSERT(HubExtension);
2261 USBH_CompletePowerIrp(HubExtension, WakeIrp, STATUS_CANCELLED);
2262 }
2263
2264 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_POWER_D3;
2265
2266 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_REG_DEV_INTERFACE)
2267 {
2268 Status = USBH_SymbolicLink(PortExtension, NULL, FALSE);
2269
2270 if (NT_SUCCESS(Status))
2271 {
2272 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_REG_DEV_INTERFACE;
2273 }
2274 }
2275
2276 DeviceHandle = InterlockedExchangePointer(&PortExtension->DeviceHandle,
2277 NULL);
2278
2279 if (DeviceHandle)
2280 {
2281 ASSERT(HubExtension);
2282 Status = USBD_RemoveDeviceEx(HubExtension, DeviceHandle, 0);
2283
2284 if (HubExtension->PortData &&
2285 HubExtension->PortData[Port - 1].DeviceObject == PortDevice)
2286 {
2287 USBH_SyncDisablePort(HubExtension, Port);
2288 }
2289 }
2290
2291 if (NT_SUCCESS(Status))
2292 {
2293 PortExtension->PortPdoFlags &= ~USBHUB_PDO_FLAG_DEVICE_STARTED;
2294
2295 if (HubExtension && HubExtension->PortData)
2296 {
2297 PortData = &HubExtension->PortData[Port - 1];
2298
2299 if (PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_DELETE_PENDING)
2300 {
2301 Pdo = PortData->DeviceObject;
2302
2303 if (Pdo)
2304 {
2305 PortData->DeviceObject = NULL;
2307
2308 if (PdoExt(Pdo)->EnumFlags & USBHUB_ENUM_FLAG_DEVICE_PRESENT)
2309 {
2310 PortExt = PdoExt(Pdo);
2311
2312 InsertTailList(&HubExtension->PdoList,
2313 &PortExt->PortLink);
2314 }
2315 }
2316 }
2317 }
2318
2319 if (!(PortExtension->EnumFlags & USBHUB_ENUM_FLAG_DEVICE_PRESENT) &&
2320 !(PortExtension->PortPdoFlags & USBHUB_PDO_FLAG_NOT_CONNECTED))
2321 {
2322 PortExtension->PortPdoFlags |= USBHUB_PDO_FLAG_NOT_CONNECTED;
2323
2324 SerialNumber = InterlockedExchangePointer((PVOID)&PortExtension->SerialNumber,
2325 NULL);
2326
2327 if (SerialNumber)
2328 {
2330 }
2331
2332 DPRINT1("USBH_PdoRemoveDevice: call IoWMIRegistrationControl UNIMPLEMENTED. FIXME\n");
2333
2334 if (HubExtension)
2335 USBHUB_FlushAllTransfers(HubExtension);
2336
2337 IoDeleteDevice(PortDevice);
2338 }
2339 }
2340
2341 if (HubExtension)
2342 {
2343 DPRINT("USBH_PdoRemoveDevice: call USBH_CheckIdleDeferred()\n");
2344 USBH_CheckIdleDeferred(HubExtension);
2345 }
2346
2347 return Status;
2348}
VOID NTAPI USBH_CompletePowerIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN NTSTATUS NtStatus)
Definition: power.c:18
#define InsertTailList(ListHead, Entry)
IoSetCancelRoutine(Irp, CancelRoutine)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
ULONG SerialNumber
Definition: rxce.c:117
USB_CONNECTION_STATUS ConnectionStatus
Definition: usbhub.h:120
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
Definition: usbhub.c:133
VOID NTAPI USBHUB_FlushAllTransfers(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2638
NTSTATUS NTAPI USBH_SyncDisablePort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port)
Definition: usbhub.c:1553
#define USBHUB_ENUM_FLAG_DEVICE_PRESENT
Definition: usbhub.h:84
#define USBHUB_PDO_FLAG_POWER_D3
Definition: usbhub.h:69
#define USBHUB_PDO_FLAG_DELETE_PENDING
Definition: usbhub.h:68
@ NoDeviceConnected
Definition: usbioctl.h:278
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:72

Referenced by USBH_FdoRemoveDevice(), and USBH_PdoPnP().

◆ USBH_QueueWorkItem()

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

Definition at line 2932 of file usbhub.c.

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

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

◆ USBH_ResetDevice()

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

Definition at line 4630 of file usbhub.c.

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

Referenced by USBH_ResetPortWorker(), and USBH_RestoreDevice().

◆ USBH_SetPdoRegistryParameter()

NTSTATUS NTAPI USBH_SetPdoRegistryParameter ( IN PDEVICE_OBJECT  DeviceObject,
IN PCWSTR  SourceString,
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}
Type
Definition: Type.h:7
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
Definition: pnpmgr.c:1621
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_In_ ULONG DevInstKeyType
Definition: iofuncs.h:1125

Referenced by USBH_SymbolicLink().

◆ USBH_SubmitStatusChangeTransfer()

NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2457 of file usbhub.c.

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

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

◆ 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}
#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 URB_FUNCTION_CLASS_OTHER
Definition: usb.h:117
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
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239

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}
USB_PORT_STATUS_AND_CHANGE PortStatus
Definition: usbhub.h:118
USHORT PortEnabledDisabled
Definition: usb200.h:134
USB_PORT_STATUS PortStatus
Definition: usb200.h:240
USB_20_PORT_STATUS Usb20PortStatus
Definition: usb200.h:223
#define BMREQUEST_TO_DEVICE
Definition: usb100.h:38
#define USBHUB_FEATURE_PORT_ENABLE
Definition: usbhub.h:92

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

◆ 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}
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

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}

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 bNumberOfPorts
Definition: usb100.h:173
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
#define BMREQUEST_DEVICE_TO_HOST
Definition: usb100.h:32
#define URB_FUNCTION_CLASS_DEVICE
Definition: usb.h:112
NTSTATUS NTAPI USBHUB_GetExtendedHubInfo(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PUSB_EXTHUB_INFORMATION_0 HubInfoBuffer)
Definition: usbhub.c:680
@ DeviceConnected
Definition: usbioctl.h:279
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036

Referenced by USBH_StartHubFdoDevice().

◆ 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}
#define USB_REQUEST_GET_STATUS
Definition: usb100.h:78

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}

Referenced by USBH_FdoStartDevice(), and USBH_StartHubFdoDevice().

◆ 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
_In_ WDFCOLLECTION _In_ ULONG Index

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

◆ 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
UCHAR bPowerOnToPowerGood
Definition: usb100.h:175
NTSTATUS NTAPI USBH_SyncPowerOnPort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN USHORT Port, IN BOOLEAN IsWait)
Definition: usbhub.c:1470
unsigned char UCHAR
Definition: xmlstorage.h:181

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 USB_REQUEST_SET_FEATURE
Definition: usb100.h:80
#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}
KSPIN_LOCK UrbTimeoutSpinLock
Definition: usbhub.h:242
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
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_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_WriteFailReasonID()

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

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 REG_DWORD
Definition: sdbapi.c:615
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define PLUGPLAY_REGKEY_DEVICE
Definition: iofuncs.h:2786

Referenced by USBH_StartHubFdoDevice().

◆ USBHUB_DumpingConfiguration()

VOID NTAPI USBHUB_DumpingConfiguration ( IN PUSB_CONFIGURATION_DESCRIPTOR  ConfigDescriptor)

Definition at line 41 of file debug.c.

42{
45 PUSB_INTERFACE_DESCRIPTOR iDescriptor;
46 PUSB_ENDPOINT_DESCRIPTOR eDescriptor;
47
49 {
50 return;
51 }
52
54
55 while ((ULONG_PTR)Descriptor <
56 ((ULONG_PTR)ConfigDescriptor + ConfigDescriptor->wTotalLength) &&
57 Descriptor->bLength)
58 {
59 if (Descriptor->bDescriptorType == USB_CONFIGURATION_DESCRIPTOR_TYPE)
60 {
62
63 DPRINT("Dumping cDescriptor - %p\n", cDescriptor);
64 DPRINT("bLength - %x\n", cDescriptor->bLength);
65 DPRINT("bDescriptorType - %x\n", cDescriptor->bDescriptorType);
66 DPRINT("wTotalLength - %x\n", cDescriptor->wTotalLength);
67 DPRINT("bNumInterfaces - %x\n", cDescriptor->bNumInterfaces);
68 DPRINT("bConfigurationValue - %x\n", cDescriptor->bConfigurationValue);
69 DPRINT("iConfiguration - %x\n", cDescriptor->iConfiguration);
70 DPRINT("bmAttributes - %x\n", cDescriptor->bmAttributes);
71 DPRINT("MaxPower - %x\n", cDescriptor->MaxPower);
72 }
73 else if (Descriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE)
74 {
76
77 DPRINT("Dumping iDescriptor - %p\n", iDescriptor);
78 DPRINT("bLength - %x\n", iDescriptor->bLength);
79 DPRINT("bDescriptorType - %x\n", iDescriptor->bDescriptorType);
80 DPRINT("bInterfaceNumber - %x\n", iDescriptor->bInterfaceNumber);
81 DPRINT("bAlternateSetting - %x\n", iDescriptor->bAlternateSetting);
82 DPRINT("bNumEndpoints - %x\n", iDescriptor->bNumEndpoints);
83 DPRINT("bInterfaceClass - %x\n", iDescriptor->bInterfaceClass);
84 DPRINT("bInterfaceSubClass - %x\n", iDescriptor->bInterfaceSubClass);
85 DPRINT("bInterfaceProtocol - %x\n", iDescriptor->bInterfaceProtocol);
86 DPRINT("iInterface - %x\n", iDescriptor->iInterface);
87 }
88 else if (Descriptor->bDescriptorType == USB_ENDPOINT_DESCRIPTOR_TYPE)
89 {
91
92 DPRINT("Dumping Descriptor - %p\n", eDescriptor);
93 DPRINT("bLength - %x\n", eDescriptor->bLength);
94 DPRINT("bDescriptorType - %x\n", eDescriptor->bDescriptorType);
95 DPRINT("bEndpointAddress - %x\n", eDescriptor->bEndpointAddress);
96 DPRINT("bmAttributes - %x\n", eDescriptor->bmAttributes);
97 DPRINT("wMaxPacketSize - %x\n", eDescriptor->wMaxPacketSize);
98 DPRINT("bInterval - %x\n", eDescriptor->bInterval);
99 }
100 else
101 {
102 DPRINT("bDescriptorType - %x\n", Descriptor->bDescriptorType);
103 }
104
106 Descriptor->bLength);
107 }
108}
uint32_t ULONG_PTR
Definition: typedefs.h:65
struct _USB_CONFIGURATION_DESCRIPTOR * PUSB_CONFIGURATION_DESCRIPTOR
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
Definition: usb100.h:50
#define USB_ENDPOINT_DESCRIPTOR_TYPE
Definition: usb100.h:53
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
struct _USB_ENDPOINT_DESCRIPTOR * PUSB_ENDPOINT_DESCRIPTOR
#define USB_INTERFACE_DESCRIPTOR_TYPE
Definition: usb100.h:52

Referenced by USBH_ProcessDeviceInformation().

◆ USBHUB_DumpingDeviceDescriptor()

VOID NTAPI USBHUB_DumpingDeviceDescriptor ( IN PUSB_DEVICE_DESCRIPTOR  DeviceDescriptor)

Definition at line 15 of file debug.c.

16{
18 {
19 return;
20 }
21
22 DPRINT("Dumping Device Descriptor - %p\n", DeviceDescriptor);
23 DPRINT("bLength - %x\n", DeviceDescriptor->bLength);
24 DPRINT("bDescriptorType - %x\n", DeviceDescriptor->bDescriptorType);
25 DPRINT("bcdUSB - %x\n", DeviceDescriptor->bcdUSB);
26 DPRINT("bDeviceClass - %x\n", DeviceDescriptor->bDeviceClass);
27 DPRINT("bDeviceSubClass - %x\n", DeviceDescriptor->bDeviceSubClass);
28 DPRINT("bDeviceProtocol - %x\n", DeviceDescriptor->bDeviceProtocol);
29 DPRINT("bMaxPacketSize0 - %x\n", DeviceDescriptor->bMaxPacketSize0);
30 DPRINT("idVendor - %x\n", DeviceDescriptor->idVendor);
31 DPRINT("idProduct - %x\n", DeviceDescriptor->idProduct);
32 DPRINT("bcdDevice - %x\n", DeviceDescriptor->bcdDevice);
33 DPRINT("iManufacturer - %x\n", DeviceDescriptor->iManufacturer);
34 DPRINT("iProduct - %x\n", DeviceDescriptor->iProduct);
35 DPRINT("iSerialNumber - %x\n", DeviceDescriptor->iSerialNumber);
36 DPRINT("bNumConfigurations - %x\n", DeviceDescriptor->bNumConfigurations);
37}
const KSDEVICE_DESCRIPTOR DeviceDescriptor
Definition: splitter.c:257

Referenced by USBH_ProcessDeviceInformation().

◆ USBHUB_DumpingIDs()

VOID NTAPI USBHUB_DumpingIDs ( IN PVOID  Id)

Definition at line 112 of file debug.c.

113{
114 PWSTR Ptr;
115 size_t Length;
116 size_t TotalLength = 0;
117
118 Ptr = Id;
119 DPRINT("USBHUB_DumpingIDs:\n");
120
121 while (*Ptr)
122 {
123 DPRINT(" %S\n", Ptr);
124 Length = wcslen(Ptr) + 1;
125
126 Ptr += Length;
128 }
129
130 DPRINT("TotalLength: %Iu\n", TotalLength);
131 DPRINT("\n");
132}
DWORD Id
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
uint16_t * PWSTR
Definition: typedefs.h:56
_In_ ULONG TotalLength
Definition: usbdlib.h:158

Referenced by USBH_PdoQueryId().

◆ USBHUB_FlushAllTransfers()

VOID NTAPI USBHUB_FlushAllTransfers ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 2638 of file usbhub.c.

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

Referenced by USBH_PdoRemoveDevice().

◆ USBHUB_SetDeviceHandleData()

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

Definition at line 2616 of file usbhub.c.

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

Referenced by USBH_PdoStartDevice().

Variable Documentation

◆ GenericUSBDeviceString

PWSTR GenericUSBDeviceString
extern

Definition at line 19 of file usbhub.c.

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