13 #define USB_POOL_TAG (ULONG)'ebsu'
15 #define DEVICEINTIALIZED 0x01
16 #define DEVICESTARTED 0x02
17 #define DEVICEBUSY 0x04
18 #define DEVICESTOPPED 0x08
19 #define DEVICESTALLED 0x10
20 #define DEVICEREMOVED 0x20
23 #define MAX_USB_DEVICES 127
24 #define EHCI_MAX_SIZE_TRANSFER 0x100000
26 #define C_HUB_LOCAL_POWER 0
27 #define C_HUB_OVER_CURRENT 1
28 #define PORT_CONNECTION 0
30 #define PORT_SUSPEND 2
31 #define PORT_OVER_CURRENT 3
34 #define PORT_LOW_SPEED 9
35 #define PORT_HIGH_SPEED 9
36 #define C_PORT_CONNECTION 16
37 #define C_PORT_ENABLE 17
38 #define C_PORT_SUSPEND 18
39 #define C_PORT_OVER_CURRENT 19
40 #define C_PORT_RESET 20
42 #define PORT_INDICATOR 22
43 #define USB_PORT_STATUS_CHANGE 0x4000
45 typedef struct _USB_ENDPOINT
49 struct _USB_INTERFACE
*Interface
;
50 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor
;
51 } USB_ENDPOINT
, *PUSB_ENDPOINT
;
53 typedef struct _USB_INTERFACE
55 struct _USB_CONFIGURATION
*Config
;
56 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
57 USB_ENDPOINT
*EndPoints
[];
58 } USB_INTERFACE
, *PUSB_INTERFACE
;
60 typedef struct _USB_CONFIGURATION
62 struct _USB_DEVICE
*Device
;
63 USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
;
64 USB_INTERFACE
*Interfaces
[];
65 } USB_CONFIGURATION
, *PUSB_CONFIGURATION
;
67 typedef struct _USB_DEVICE
73 USB_DEVICE_SPEED DeviceSpeed
;
74 USB_DEVICE_TYPE DeviceType
;
76 PDEVICE_OBJECT UsbDevicePdo
;
77 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
78 UNICODE_STRING LanguageIDs
;
79 UNICODE_STRING iManufacturer
;
80 UNICODE_STRING iProduct
;
81 UNICODE_STRING iSerialNumber
;
82 USB_CONFIGURATION
*ActiveConfig
;
83 USB_INTERFACE
*ActiveInterface
;
84 USB_CONFIGURATION
**Configs
;
85 } USB_DEVICE
, *PUSB_DEVICE
;
89 typedef struct _COMMON_DEVICE_EXTENSION
92 PDRIVER_OBJECT DriverObject
;
93 PDEVICE_OBJECT DeviceObject
;
94 } COMMON_DEVICE_EXTENSION
, *PCOMMON_DEVICE_EXTENSION
;
96 typedef struct _FDO_DEVICE_EXTENSION
98 COMMON_DEVICE_EXTENSION Common
;
99 PDRIVER_OBJECT DriverObject
;
100 PDEVICE_OBJECT DeviceObject
;
101 PDEVICE_OBJECT LowerDevice
;
104 PVOID RootHubDeviceHandle
;
109 KINTERRUPT_MODE Mode
;
111 PKINTERRUPT EhciInterrupt
;
123 BUS_INTERFACE_STANDARD BusInterface
;
128 ULONG ResourceMemory
;
131 EHCI_HOST_CONTROLLER hcd
;
132 PERIODICFRAMELIST PeriodicFrameList
;
134 FAST_MUTEX FrameListMutex
;
136 BOOLEAN AsyncComplete
;
138 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
140 typedef struct _PDO_DEVICE_EXTENSION
142 COMMON_DEVICE_EXTENSION Common
;
143 PDEVICE_OBJECT DeviceObject
;
144 PDEVICE_OBJECT ControllerFdo
;
145 PUSB_DEVICE UsbDevices
[127];
147 KSPIN_LOCK IrpQueueLock
;
150 ULONG ChildDeviceCount
;
152 PVOID CallbackContext
;
153 RH_INIT_CALLBACK
*CallbackRoutine
;
154 USB_IDLE_CALLBACK IdleCallback
;
157 KEVENT QueueDrainedEvent
;
159 } PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
161 typedef struct _WORKITEMDATA
163 WORK_QUEUE_ITEM WorkItem
;
165 } WORKITEMDATA
, *PWORKITEMDATA
;
168 UrbWorkerThread(PVOID Context
);
171 GetBusInterface(PDEVICE_OBJECT pcifido
, PBUS_INTERFACE_STANDARD busInterface
);
174 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PKEVENT Event
);
177 ForwardAndWait(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
180 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject
,PIRP Irp
);
183 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
186 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
189 AddDevice(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT Pdo
);
192 DuplicateUnicodeString(ULONG Flags
, PCUNICODE_STRING SourceString
, PUNICODE_STRING DestinationString
);
195 GetSymbolicName(PDEVICE_OBJECT DeviceObject
);
198 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject
);
201 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
204 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
207 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension
, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
, UCHAR Address
, ULONG Port
, PVOID Buffer
, ULONG BufferLength
);
210 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
213 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
);
216 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
219 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
);
222 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
225 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PUSB_DEVICE_HANDLE DeviceHandle
);
228 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
231 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
235 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor
);
238 DumpQueueHead(PQUEUE_HEAD QueueHead
);