9 #define USB_HUB_TAG 'hbsu'
10 #define USB_MAXCHILDREN 127
12 // Lifted from broken header above
13 #define C_HUB_LOCAL_POWER 0
14 #define C_HUB_OVER_CURRENT 1
15 #define PORT_CONNECTION 0
17 #define PORT_SUSPEND 2
18 #define PORT_OVER_CURRENT 3
21 #define PORT_LOW_SPEED 9
22 #define C_PORT_CONNECTION 16
23 #define C_PORT_ENABLE 17
24 #define C_PORT_SUSPEND 18
25 #define C_PORT_OVER_CURRENT 19
26 #define C_PORT_RESET 20
28 #define PORT_INDICATOR 22
30 typedef struct _PORT_STATUS_CHANGE
34 } PORT_STATUS_CHANGE
, *PPORT_STATUS_CHANGE
;
36 typedef struct _WORK_ITEM_DATA
38 WORK_QUEUE_ITEM WorkItem
;
40 } WORK_ITEM_DATA
, *PWORK_ITEM_DATA
;
44 // Definitions for device's PnP state tracking, all this states are described
45 // in PnP Device States diagram of DDK documentation.
47 typedef enum _DEVICE_PNP_STATE
{
49 NotStarted
= 0, // Not started
50 Started
, // After handling of START_DEVICE IRP
51 StopPending
, // After handling of QUERY_STOP IRP
52 Stopped
, // After handling of STOP_DEVICE IRP
53 RemovePending
, // After handling of QUERY_REMOVE IRP
54 SurpriseRemovePending
, // After handling of SURPRISE_REMOVE IRP
55 Deleted
, // After handling of REMOVE_DEVICE IRP
56 UnKnown
// Unknown state
60 #define INITIALIZE_PNP_STATE(Data) \
61 (Data).PnPState = NotStarted;\
62 (Data).PreviousPnPState = NotStarted;
64 #define SET_NEW_PNP_STATE(Data, state) \
65 (Data).PreviousPnPState = (Data).PnPState;\
66 (Data).PnPState = (state);
68 #define RESTORE_PREVIOUS_PNP_STATE(Data) \
69 (Data).PnPState = (Data).PreviousPnPState;
74 // We'll track device PnP state via this variables
75 DEVICE_PNP_STATE PnPState
;
76 DEVICE_PNP_STATE PreviousPnPState
;
78 IO_REMOVE_LOCK RemoveLock
;
79 } COMMON_DEVICE_EXTENSION
, *PCOMMON_DEVICE_EXTENSION
;
81 typedef struct _HUB_CHILDDEVICE_EXTENSION
83 COMMON_DEVICE_EXTENSION Common
;
84 PDEVICE_OBJECT ParentDeviceObject
;
85 PUSB_DEVICE_HANDLE UsbDeviceHandle
;
87 UNICODE_STRING usDeviceId
;
88 UNICODE_STRING usInstanceId
;
89 UNICODE_STRING usHardwareIds
;
90 UNICODE_STRING usCompatibleIds
;
91 UNICODE_STRING usTextDescription
;
92 UNICODE_STRING usLocationInformation
;
93 USB_DEVICE_DESCRIPTOR DeviceDesc
;
94 PUSB_CONFIGURATION_DESCRIPTOR FullConfigDesc
;
95 UNICODE_STRING SymbolicLinkName
;
96 USB_BUS_INTERFACE_USBDI_V2 DeviceInterface
;
97 USB_DEVICE_INFORMATION_0 DeviceInformation
;
98 } HUB_CHILDDEVICE_EXTENSION
, *PHUB_CHILDDEVICE_EXTENSION
;
100 typedef struct _HUB_DEVICE_EXTENSION
102 COMMON_DEVICE_EXTENSION Common
;
103 PDEVICE_OBJECT LowerDeviceObject
;
105 PDEVICE_OBJECT ChildDeviceObject
[USB_MAXCHILDREN
];
106 PDEVICE_OBJECT RootHubPhysicalDeviceObject
;
107 PDEVICE_OBJECT RootHubFunctionalDeviceObject
;
109 KGUARDED_MUTEX HubMutexLock
;
112 KEVENT ResetComplete
;
114 PORT_STATUS_CHANGE
*PortStatusChange
;
118 USB_BUS_INTERFACE_HUB_V5 HubInterface
;
119 USB_BUS_INTERFACE_USBDI_V2 UsbDInterface
;
121 USB_HUB_DESCRIPTOR HubDescriptor
;
122 USB_DEVICE_DESCRIPTOR HubDeviceDescriptor
;
123 USB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor
;
124 USB_INTERFACE_DESCRIPTOR HubInterfaceDescriptor
;
125 USB_ENDPOINT_DESCRIPTOR HubEndPointDescriptor
;
127 USB_EXTHUB_INFORMATION_0 UsbExtHubInfo
;
128 USB_DEVICE_INFORMATION_0 DeviceInformation
;
130 USBD_CONFIGURATION_HANDLE ConfigurationHandle
;
131 USBD_PIPE_HANDLE PipeHandle
;
134 UNICODE_STRING SymbolicLinkName
;
137 } HUB_DEVICE_EXTENSION
, *PHUB_DEVICE_EXTENSION
;
142 IN PDEVICE_OBJECT DeviceObject
,
147 IN PDEVICE_OBJECT DeviceObject
,
152 IN PDEVICE_OBJECT DeviceObject
,
157 USBHUB_FdoHandleDeviceControl(
158 PDEVICE_OBJECT DeviceObject
,
163 PDEVICE_OBJECT DeviceObject
,
169 IN PDEVICE_OBJECT DeviceObject
,
174 IN PDEVICE_OBJECT DeviceObject
,
178 SubmitRequestToRootHub(
179 IN PDEVICE_OBJECT RootHubDeviceObject
,
180 IN ULONG IoControlCode
,
181 OUT PVOID OutParameter1
,
182 OUT PVOID OutParameter2
);
186 IN PDEVICE_OBJECT DeviceObject
,
187 IN OUT PUSB_BUS_INTERFACE_USBDI_V2 Interface
);
192 PDEVICE_OBJECT DeviceObject
,
196 USBHUB_PdoHandleInternalDeviceControl(
197 PDEVICE_OBJECT DeviceObject
,
201 DumpDeviceDescriptor(
202 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
205 DumpConfigurationDescriptor(
206 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
209 DumpFullConfigurationDescriptor(
210 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
213 GetPortStatusAndChange(
214 IN PDEVICE_OBJECT RootHubDeviceObject
,
216 OUT PPORT_STATUS_CHANGE StatusChange
);
221 USBHUB_ParentFDOStartDevice(
222 IN PDEVICE_OBJECT DeviceObject
,
225 #endif /* _USBHUB_H_ */