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
;
100 PDEVICE_OBJECT LowerDevice
;
103 PVOID RootHubDeviceHandle
;
108 KINTERRUPT_MODE Mode
;
110 PKINTERRUPT EhciInterrupt
;
122 BUS_INTERFACE_STANDARD BusInterface
;
127 ULONG ResourceMemory
;
130 EHCI_HOST_CONTROLLER hcd
;
131 PERIODICFRAMELIST PeriodicFrameList
;
133 FAST_MUTEX FrameListMutex
;
135 BOOLEAN AsyncComplete
;
137 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
139 typedef struct _PDO_DEVICE_EXTENSION
141 COMMON_DEVICE_EXTENSION Common
;
142 PDEVICE_OBJECT DeviceObject
;
143 PDEVICE_OBJECT ControllerFdo
;
144 PUSB_DEVICE UsbDevices
[127];
146 KSPIN_LOCK IrpQueueLock
;
149 ULONG ChildDeviceCount
;
151 PVOID CallbackContext
;
152 RH_INIT_CALLBACK
*CallbackRoutine
;
153 USB_IDLE_CALLBACK IdleCallback
;
156 KEVENT QueueDrainedEvent
;
158 } PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
160 typedef struct _WORKITEMDATA
162 WORK_QUEUE_ITEM WorkItem
;
164 } WORKITEMDATA
, *PWORKITEMDATA
;
167 UrbWorkerThread(PVOID Context
);
170 GetBusInterface(PDEVICE_OBJECT pcifido
, PBUS_INTERFACE_STANDARD busInterface
);
173 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PKEVENT Event
);
176 ForwardAndWait(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
179 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject
,PIRP Irp
);
182 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
185 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
188 AddDevice(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT Pdo
);
191 DuplicateUnicodeString(ULONG Flags
, PCUNICODE_STRING SourceString
, PUNICODE_STRING DestinationString
);
194 GetSymbolicName(PDEVICE_OBJECT DeviceObject
);
197 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject
);
200 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
203 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
206 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension
, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
, UCHAR Address
, ULONG Port
, PVOID Buffer
, ULONG BufferLength
);
209 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
212 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
);
215 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
218 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
);
221 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
224 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PUSB_DEVICE_HANDLE DeviceHandle
);
227 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
230 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
234 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor
);
237 DumpQueueHead(PQUEUE_HEAD QueueHead
);