xref: /reactos/drivers/usb/usbhub/usbhub.h (revision 1734f297)
1 /*
2  * PROJECT:     ReactOS USB Hub Driver
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     USBHub declarations
5  * COPYRIGHT:   Copyright 2017 Vadim Galyant <vgal@rambler.ru>
6  */
7 
8 #ifndef _USBHUB_H_
9 #define _USBHUB_H_
10 
11 #include <ntddk.h>
12 #include <windef.h>
13 #include <stdio.h>
14 #include <wmistr.h>
15 #include <wmilib.h>
16 #include <wdmguid.h>
17 #include <ntstrsafe.h>
18 #include <usb.h>
19 #include <usbioctl.h>
20 #include <hubbusif.h>
21 #include <usbbusif.h>
22 #include <usbdlib.h>
23 #include <ks.h>
24 #include <drivers/usbport/usbmport.h>
25 
26 #define USB_HUB_TAG 'BUHU'
27 
28 #define USBH_EXTENSION_TYPE_HUB        0x01
29 #define USBH_EXTENSION_TYPE_PORT       0x02
30 #define USBH_EXTENSION_TYPE_PARENT     0x04
31 #define USBH_EXTENSION_TYPE_FUNCTION   0x08
32 
33 #define USBHUB_FDO_FLAG_DEVICE_STARTED    (1 << 0)
34 #define USBHUB_FDO_FLAG_DEVICE_STOPPING   (1 << 2)
35 #define USBHUB_FDO_FLAG_DEVICE_FAILED     (1 << 3)
36 #define USBHUB_FDO_FLAG_REMOTE_WAKEUP     (1 << 4)
37 #define USBHUB_FDO_FLAG_DEVICE_STOPPED    (1 << 5)
38 #define USBHUB_FDO_FLAG_HUB_BUSY          (1 << 6)
39 #define USBHUB_FDO_FLAG_PENDING_WAKE_IRP  (1 << 7)
40 #define USBHUB_FDO_FLAG_RESET_PORT_LOCK   (1 << 8)
41 #define USBHUB_FDO_FLAG_ESD_RECOVERING    (1 << 9)
42 #define USBHUB_FDO_FLAG_SET_D0_STATE      (1 << 10)
43 #define USBHUB_FDO_FLAG_NOT_D0_STATE      (1 << 11)
44 #define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST (1 << 12)
45 #define USBHUB_FDO_FLAG_STATE_CHANGING    (1 << 13)
46 #define USBHUB_FDO_FLAG_DEVICE_REMOVED    (1 << 14)
47 #define USBHUB_FDO_FLAG_USB20_HUB         (1 << 15)
48 #define USBHUB_FDO_FLAG_DEFER_CHECK_IDLE  (1 << 16)
49 #define USBHUB_FDO_FLAG_WAKEUP_START      (1 << 17)
50 #define USBHUB_FDO_FLAG_MULTIPLE_TTS      (1 << 18)  // High-speed Operating Hub with Multiple TTs
51 #define USBHUB_FDO_FLAG_ENUM_POST_RECOVER (1 << 19)
52 #define USBHUB_FDO_FLAG_DO_ENUMERATION    (1 << 20)
53 #define USBHUB_FDO_FLAG_CHECK_IDLE_LOCK   (1 << 21)
54 #define USBHUB_FDO_FLAG_HIBERNATE_STATE   (1 << 22)
55 #define USBHUB_FDO_FLAG_NOT_ENUMERATED    (1 << 23)
56 #define USBHUB_FDO_FLAG_DO_SUSPENSE       (1 << 24)
57 #define USBHUB_FDO_FLAG_GOING_IDLE        (1 << 25)
58 #define USBHUB_FDO_FLAG_DEVICE_SUSPENDED  (1 << 26)
59 #define USBHUB_FDO_FLAG_WITEM_INIT        (1 << 27)
60 
61 #define USBHUB_PDO_FLAG_HUB_DEVICE        (1 << 0)
62 #define USBHUB_PDO_FLAG_MULTI_INTERFACE   (1 << 1)
63 #define USBHUB_PDO_FLAG_INIT_PORT_FAILED  (1 << 2)
64 #define USBHUB_PDO_FLAG_PORT_LOW_SPEED    (1 << 3)
65 #define USBHUB_PDO_FLAG_REMOTE_WAKEUP     (1 << 4)
66 #define USBHUB_PDO_FLAG_WAIT_WAKE         (1 << 5)
67 #define USBHUB_PDO_FLAG_NOT_CONNECTED     (1 << 6)
68 #define USBHUB_PDO_FLAG_DELETE_PENDING    (1 << 7)
69 #define USBHUB_PDO_FLAG_POWER_D3          (1 << 8)
70 #define USBHUB_PDO_FLAG_DEVICE_STARTED    (1 << 9)
71 #define USBHUB_PDO_FLAG_HS_USB1_DUALMODE  (1 << 10)
72 #define USBHUB_PDO_FLAG_REG_DEV_INTERFACE (1 << 11)  // SymbolicLink
73 #define USBHUB_PDO_FLAG_PORT_RESTORE_FAIL (1 << 12)
74 #define USBHUB_PDO_FLAG_POWER_D1_OR_D2    (1 << 13)
75 #define USBHUB_PDO_FLAG_OVERCURRENT_PORT  (1 << 14)
76 #define USBHUB_PDO_FLAG_REMOVING_PORT_PDO (1 << 15)
77 #define USBHUB_PDO_FLAG_INSUFFICIENT_PWR  (1 << 16)
78 #define USBHUB_PDO_FLAG_ALLOC_BNDW_FAILED (1 << 18)
79 #define USBHUB_PDO_FLAG_PORT_RESSETING    (1 << 19)
80 #define USBHUB_PDO_FLAG_IDLE_NOTIFICATION (1 << 22)
81 #define USBHUB_PDO_FLAG_PORT_HIGH_SPEED   (1 << 23)
82 #define USBHUB_PDO_FLAG_ENUMERATED        (1 << 26)
83 
84 #define USBHUB_ENUM_FLAG_DEVICE_PRESENT   0x01
85 #define USBHUB_ENUM_FLAG_GHOST_DEVICE     0x02
86 
87 /* Hub Class Feature Selectors */
88 #define USBHUB_FEATURE_C_HUB_LOCAL_POWER  0
89 #define USBHUB_FEATURE_C_HUB_OVER_CURRENT 1
90 
91 #define USBHUB_FEATURE_PORT_CONNECTION     0
92 #define USBHUB_FEATURE_PORT_ENABLE         1
93 #define USBHUB_FEATURE_PORT_SUSPEND        2
94 #define USBHUB_FEATURE_PORT_OVER_CURRENT   3
95 #define USBHUB_FEATURE_PORT_RESET          4
96 #define USBHUB_FEATURE_PORT_POWER          8
97 #define USBHUB_FEATURE_PORT_LOW_SPEED      9
98 #define USBHUB_FEATURE_C_PORT_CONNECTION   16
99 #define USBHUB_FEATURE_C_PORT_ENABLE       17
100 #define USBHUB_FEATURE_C_PORT_SUSPEND      18
101 #define USBHUB_FEATURE_C_PORT_OVER_CURRENT 19
102 #define USBHUB_FEATURE_C_PORT_RESET        20
103 #define USBHUB_FEATURE_PORT_TEST           21
104 #define USBHUB_FEATURE_PORT_INDICATOR      22
105 
106 #define USBHUB_MAX_CASCADE_LEVELS  6
107 #define USBHUB_RESET_PORT_MAX_RETRY  3
108 #define USBHUB_MAX_REQUEST_ERRORS    3
109 
110 
111 #define USBHUB_FAIL_NO_FAIL            5
112 #define USBHUB_FAIL_NESTED_TOO_DEEPLY  6
113 #define USBHUB_FAIL_OVERCURRENT        7
114 
115 extern PWSTR GenericUSBDeviceString;
116 
117 typedef struct _USBHUB_PORT_DATA {
118   USB_PORT_STATUS_AND_CHANGE PortStatus;
119   PDEVICE_OBJECT DeviceObject;
120   USB_CONNECTION_STATUS ConnectionStatus;
121   ULONG PortAttributes;
122 } USBHUB_PORT_DATA, *PUSBHUB_PORT_DATA;
123 
124 typedef struct _USBHUB_FDO_EXTENSION *PUSBHUB_FDO_EXTENSION;
125 
126 typedef VOID
127 (NTAPI * PUSBHUB_WORKER_ROUTINE)(
128   IN PUSBHUB_FDO_EXTENSION HubExtension,
129   IN PVOID Context);
130 
131 typedef struct _USBHUB_IO_WORK_ITEM {
132   ULONG Reserved;
133   LIST_ENTRY HubWorkItemLink;
134   LONG HubWorkerQueued;
135   PIO_WORKITEM HubWorkItem;
136   WORK_QUEUE_TYPE HubWorkItemType;
137   PUSBHUB_FDO_EXTENSION HubExtension;
138   PUSBHUB_WORKER_ROUTINE HubWorkerRoutine;
139   PVOID HubWorkItemBuffer;
140 } USBHUB_IO_WORK_ITEM, *PUSBHUB_IO_WORK_ITEM;
141 
142 typedef struct _COMMON_DEVICE_EXTENSION {
143   ULONG ExtensionType;
144   PDEVICE_OBJECT SelfDevice;
145 } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
146 
147 typedef struct _USBHUB_FDO_EXTENSION {
148   COMMON_DEVICE_EXTENSION Common;
149   PDEVICE_OBJECT LowerPDO;
150   PDEVICE_OBJECT LowerDevice;
151   PDEVICE_OBJECT RootHubPdo;
152   PDEVICE_OBJECT RootHubPdo2;
153   KEVENT LowerDeviceEvent;
154   ULONG HubFlags;
155   USB_BUS_INTERFACE_HUB_V5 BusInterface;
156   USB_BUS_INTERFACE_USBDI_V2 BusInterfaceUSBDI;
157   DEVICE_POWER_STATE DeviceState[POWER_SYSTEM_MAXIMUM];
158   SYSTEM_POWER_STATE SystemWake;
159   DEVICE_POWER_STATE DeviceWake;
160   POWER_STATE CurrentPowerState;
161   POWER_STATE SystemPowerState;
162   ULONG MaxPowerPerPort;
163   USB_DEVICE_DESCRIPTOR HubDeviceDescriptor;
164   USHORT Port;
165   PUSB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor;
166   PUSB_HUB_DESCRIPTOR HubDescriptor;
167   PUSBHUB_PORT_DATA PortData;
168   USBD_CONFIGURATION_HANDLE ConfigHandle;
169   USBD_PIPE_INFORMATION PipeInfo;
170   PIRP SCEIrp;
171   PIRP ResetPortIrp;
172   PVOID SCEBitmap; // 11.12.4 Hub and Port Status Change Bitmap (USB 2.0 Specification)
173   ULONG SCEBitmapLength;
174   KEVENT RootHubNotificationEvent;
175   struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST SCEWorkerUrb;
176   KEVENT StatusChangeEvent;
177   KSEMAPHORE IdleSemaphore;
178   KSPIN_LOCK RelationsWorkerSpinLock;
179   LIST_ENTRY PdoList;
180   LONG PendingRequestCount;
181   KEVENT PendingRequestEvent;
182   KSEMAPHORE ResetDeviceSemaphore;
183   PRKEVENT pResetPortEvent;
184   KSEMAPHORE HubPortSemaphore;
185   LONG ResetRequestCount;
186   KEVENT ResetEvent;
187   PIRP PendingIdleIrp;
188   PIRP PendingWakeIrp;
189   LONG FdoWaitWakeLock;
190   LIST_ENTRY WorkItemList;
191   KSPIN_LOCK WorkItemSpinLock;
192   KSPIN_LOCK CheckIdleSpinLock;
193   KEVENT IdleEvent;
194   LONG IdleRequestLock;
195   ULONG RequestErrors;
196   KSEMAPHORE HubSemaphore;
197   PUSBHUB_IO_WORK_ITEM WorkItemToQueue;
198   USB_IDLE_CALLBACK_INFO IdleCallbackInfo;
199   USB_PORT_STATUS_AND_CHANGE PortStatus;
200   PIRP PowerIrp;
201 } USBHUB_FDO_EXTENSION, *PUSBHUB_FDO_EXTENSION;
202 
203 typedef struct _USBHUB_PORT_PDO_EXTENSION {
204   COMMON_DEVICE_EXTENSION Common;
205   ULONG PortPdoFlags;
206   ULONG EnumFlags;
207   UNICODE_STRING SymbolicLinkName;
208   WCHAR InstanceID[4];
209   PUSBHUB_FDO_EXTENSION HubExtension;
210   PUSBHUB_FDO_EXTENSION RootHubExtension;
211   PUSB_DEVICE_HANDLE DeviceHandle;
212   USHORT PortNumber;
213   USHORT SN_DescriptorLength;
214   BOOL IgnoringHwSerial;
215   LPWSTR SerialNumber; // serial number string
216   USB_DEVICE_DESCRIPTOR DeviceDescriptor;
217   USB_DEVICE_DESCRIPTOR OldDeviceDescriptor;
218   USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor;
219   USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
220   USHORT Reserved1;
221   PIRP IdleNotificationIrp;
222   POWER_STATE CurrentPowerState;
223   DEVICE_CAPABILITIES Capabilities;
224   ULONG MaxPower;
225   PVOID BndwTimeoutContext;
226   KSPIN_LOCK PortTimeoutSpinLock;
227   LIST_ENTRY PortLink;
228   LONG PoRequestCounter;
229   LONG PendingSystemPoRequest;
230   LONG PendingDevicePoRequest;
231   LONG StateBehindD2;
232   PIRP PdoWaitWakeIrp;
233   LIST_ENTRY PortPowerList;
234   KSPIN_LOCK PortPowerListSpinLock;
235 } USBHUB_PORT_PDO_EXTENSION, *PUSBHUB_PORT_PDO_EXTENSION;
236 
237 typedef struct _USBHUB_URB_TIMEOUT_CONTEXT {
238   PIRP Irp;
239   KEVENT UrbTimeoutEvent;
240   KDPC UrbTimeoutDPC;
241   KTIMER UrbTimeoutTimer;
242   KSPIN_LOCK UrbTimeoutSpinLock;
243   BOOL IsNormalCompleted;
244 } USBHUB_URB_TIMEOUT_CONTEXT, *PUSBHUB_URB_TIMEOUT_CONTEXT;
245 
246 typedef struct _USBHUB_STATUS_CHANGE_CONTEXT {
247   ULONG Reserved;
248   BOOL IsRequestErrors;
249   PUSBHUB_FDO_EXTENSION HubExtension;
250 } USBHUB_STATUS_CHANGE_CONTEXT, *PUSBHUB_STATUS_CHANGE_CONTEXT;
251 
252 typedef struct _USBHUB_IDLE_HUB_CONTEXT {
253   ULONG Reserved;
254   NTSTATUS Status;
255 } USBHUB_IDLE_HUB_CONTEXT, *PUSBHUB_IDLE_HUB_CONTEXT;
256 
257 typedef struct _USBHUB_IDLE_PORT_CONTEXT {
258   ULONG Reserved;
259   LIST_ENTRY PwrList;
260   NTSTATUS Status;
261 } USBHUB_IDLE_PORT_CONTEXT, *PUSBHUB_IDLE_PORT_CONTEXT;
262 
263 typedef struct _USBHUB_IDLE_PORT_CANCEL_CONTEXT {
264   ULONG Reserved;
265   PIRP Irp;
266 } USBHUB_IDLE_PORT_CANCEL_CONTEXT, *PUSBHUB_IDLE_PORT_CANCEL_CONTEXT;
267 
268 typedef struct _USBHUB_RESET_PORT_CONTEXT {
269   ULONG Reserved;
270   PUSBHUB_PORT_PDO_EXTENSION PortExtension;
271   PIRP Irp;
272 } USBHUB_RESET_PORT_CONTEXT, *PUSBHUB_RESET_PORT_CONTEXT;
273 
274 /* debug.c */
275 VOID
276 NTAPI
277 USBHUB_DumpingDeviceDescriptor(
278   IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
279 
280 VOID
281 NTAPI
282 USBHUB_DumpingConfiguration(
283   IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor);
284 
285 VOID
286 NTAPI
287 USBHUB_DumpingIDs(
288   IN PVOID Id);
289 
290 /* ioctl.c */
291 NTSTATUS
292 NTAPI
293 USBH_DeviceControl(
294   IN PUSBHUB_FDO_EXTENSION HubExtension,
295   IN PIRP Irp);
296 
297 NTSTATUS
298 NTAPI
299 USBH_PdoInternalControl(
300   IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
301   IN PIRP Irp);
302 
303 /* pnp.c */
304 NTSTATUS
305 NTAPI
306 USBH_PdoRemoveDevice(
307   IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
308   IN PUSBHUB_FDO_EXTENSION HubExtension);
309 
310 NTSTATUS
311 NTAPI
312 USBH_FdoPnP(
313   IN PUSBHUB_FDO_EXTENSION HubExtension,
314   IN PIRP Irp,
315   IN UCHAR Minor);
316 
317 NTSTATUS
318 NTAPI
319 USBH_PdoPnP(
320   IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
321   IN PIRP Irp,
322   IN UCHAR Minor,
323   OUT BOOLEAN * IsCompleteIrp);
324 
325 /* power.c */
326 VOID
327 NTAPI
328 USBH_CompletePowerIrp(
329   IN PUSBHUB_FDO_EXTENSION HubExtension,
330   IN PIRP Irp,
331   IN NTSTATUS NtStatus);
332 
333 NTSTATUS
334 NTAPI
335 USBH_HubSetD0(
336   IN PUSBHUB_FDO_EXTENSION HubExtension);
337 
338 NTSTATUS
339 NTAPI
340 USBH_FdoPower(
341   IN PUSBHUB_FDO_EXTENSION HubExtension,
342   IN PIRP Irp,
343   IN UCHAR Minor);
344 
345 NTSTATUS
346 NTAPI
347 USBH_PdoPower(
348   IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
349   IN PIRP Irp,
350   IN UCHAR Minor);
351 
352 VOID
353 NTAPI
354 USBH_HubCompletePortWakeIrps(
355   IN PUSBHUB_FDO_EXTENSION HubExtension,
356   IN NTSTATUS NtStatus);
357 
358 VOID
359 NTAPI
360 USBH_HubCancelWakeIrp(
361   IN PUSBHUB_FDO_EXTENSION HubExtension,
362   IN PIRP Irp);
363 
364 VOID
365 NTAPI
366 USBH_IdleCancelPowerHubWorker(
367   IN PUSBHUB_FDO_EXTENSION HubExtension,
368   IN PVOID Context);
369 
370 /* usbhub.c */
371 NTSTATUS
372 NTAPI
373 USBH_Wait(
374   IN ULONG Milliseconds);
375 
376 VOID
377 NTAPI
378 USBH_CompleteIrp(
379   IN PIRP Irp,
380   IN NTSTATUS CompleteStatus);
381 
382 NTSTATUS
383 NTAPI
384 USBH_PassIrp(
385   IN PDEVICE_OBJECT DeviceObject,
386   IN PIRP Irp);
387 
388 PUSBHUB_PORT_PDO_EXTENSION
389 NTAPI
390 PdoExt(
391   IN PDEVICE_OBJECT DeviceObject);
392 
393 NTSTATUS
394 NTAPI
395 USBH_WriteFailReasonID(
396   IN PDEVICE_OBJECT DeviceObject,
397   IN ULONG Data);
398 
399 NTSTATUS
400 NTAPI
401 USBH_SetPdoRegistryParameter(
402   IN PDEVICE_OBJECT DeviceObject,
403   IN PCWSTR SourceString,
404   IN PVOID Data,
405   IN ULONG DataSize,
406   IN ULONG Type,
407   IN ULONG DevInstKeyType);
408 
409 NTSTATUS
410 NTAPI
411 USBH_SyncSubmitUrb(
412   IN PDEVICE_OBJECT DeviceObject,
413   IN PURB Urb);
414 
415 NTSTATUS
416 NTAPI
417 USBH_FdoSyncSubmitUrb(
418   IN PDEVICE_OBJECT FdoDevice,
419   IN PURB Urb);
420 
421 NTSTATUS
422 NTAPI
423 USBH_SyncResetPort(
424   IN PUSBHUB_FDO_EXTENSION HubExtension,
425   IN USHORT Port);
426 
427 NTSTATUS
428 NTAPI
429 USBH_GetDeviceType(
430   IN PUSBHUB_FDO_EXTENSION HubExtension,
431   IN PUSB_DEVICE_HANDLE DeviceHandle,
432   OUT USB_DEVICE_TYPE * OutDeviceType);
433 
434 PUSBHUB_FDO_EXTENSION
435 NTAPI
436 USBH_GetRootHubExtension(
437   IN PUSBHUB_FDO_EXTENSION HubExtension);
438 
439 NTSTATUS
440 NTAPI
441 USBH_SyncGetRootHubPdo(
442   IN PDEVICE_OBJECT DeviceObject,
443   IN OUT PDEVICE_OBJECT * OutPdo1,
444   IN OUT PDEVICE_OBJECT * OutPdo2);
445 
446 NTSTATUS
447 NTAPI
448 USBH_SyncGetHubCount(
449   IN PDEVICE_OBJECT DeviceObject,
450   IN OUT PULONG OutHubCount);
451 
452 PUSB_DEVICE_HANDLE
453 NTAPI
454 USBH_SyncGetDeviceHandle(
455   IN PDEVICE_OBJECT DeviceObject);
456 
457 NTSTATUS
458 NTAPI
459 USBH_GetDeviceDescriptor(
460   IN PDEVICE_OBJECT DeviceObject,
461   IN PUSB_DEVICE_DESCRIPTOR HubDeviceDescriptor);
462 
463 NTSTATUS
464 NTAPI
465 USBH_GetConfigurationDescriptor(
466   IN PDEVICE_OBJECT DeviceObject,
467   IN PUSB_CONFIGURATION_DESCRIPTOR * pConfigurationDescriptor);
468 
469 NTSTATUS
470 NTAPI
471 USBH_SyncGetHubDescriptor(
472   IN PUSBHUB_FDO_EXTENSION HubExtension);
473 
474 NTSTATUS
475 NTAPI
476 USBH_SyncGetStringDescriptor(
477   IN PDEVICE_OBJECT DeviceObject,
478   IN UCHAR Index,
479   IN USHORT LanguageId,
480   IN PUSB_STRING_DESCRIPTOR Descriptor,
481   IN ULONG NumberOfBytes,
482   IN PULONG OutLength,
483   IN BOOLEAN IsValidateLength);
484 
485 NTSTATUS
486 NTAPI
487 USBH_SyncGetPortStatus(
488   IN PUSBHUB_FDO_EXTENSION HubExtension,
489   IN USHORT Port,
490   IN PUSB_PORT_STATUS_AND_CHANGE PortStatus,
491   IN ULONG Length);
492 
493 NTSTATUS
494 NTAPI
495 USBH_SyncClearPortStatus(
496   IN PUSBHUB_FDO_EXTENSION HubExtension,
497   IN USHORT Port,
498   IN USHORT RequestValue);
499 
500 NTSTATUS
501 NTAPI
502 USBH_SyncPowerOnPorts(
503   IN PUSBHUB_FDO_EXTENSION HubExtension);
504 
505 NTSTATUS
506 NTAPI
507 USBH_SyncDisablePort(
508   IN PUSBHUB_FDO_EXTENSION HubExtension,
509   IN USHORT Port);
510 
511 BOOLEAN
512 NTAPI
513 USBH_HubIsBusPowered(
514   IN PDEVICE_OBJECT DeviceObject,
515   IN PUSB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor);
516 
517 NTSTATUS
518 NTAPI
519 USBH_SubmitStatusChangeTransfer(
520   IN PUSBHUB_FDO_EXTENSION HubExtension);
521 
522 NTSTATUS
523 NTAPI
524 USBD_CreateDeviceEx(
525   IN PUSBHUB_FDO_EXTENSION HubExtension,
526   IN PUSB_DEVICE_HANDLE * OutDeviceHandle,
527   IN USB_PORT_STATUS UsbPortStatus,
528   IN USHORT Port);
529 
530 NTSTATUS
531 NTAPI
532 USBD_RemoveDeviceEx(
533   IN PUSBHUB_FDO_EXTENSION HubExtension,
534   IN PUSB_DEVICE_HANDLE DeviceHandle,
535   IN ULONG Flags);
536 
537 NTSTATUS
538 NTAPI
539 USBD_InitializeDeviceEx(
540   IN PUSBHUB_FDO_EXTENSION HubExtension,
541   IN PUSB_DEVICE_HANDLE DeviceHandle,
542   IN PUCHAR DeviceDescriptorBuffer,
543   IN ULONG DeviceDescriptorBufferLength,
544   IN PUCHAR ConfigDescriptorBuffer,
545   IN ULONG ConfigDescriptorBufferLength);
546 
547 VOID
548 NTAPI
549 USBHUB_SetDeviceHandleData(
550   IN PUSBHUB_FDO_EXTENSION HubExtension,
551   IN PDEVICE_OBJECT UsbDevicePdo,
552   IN PVOID DeviceHandle);
553 
554 VOID
555 NTAPI
556 USBHUB_FlushAllTransfers(
557   IN PUSBHUB_FDO_EXTENSION HubExtension);
558 
559 NTSTATUS
560 NTAPI
561 USBD_GetDeviceInformationEx(
562   IN PUSBHUB_PORT_PDO_EXTENSION PortExtension,
563   IN PUSBHUB_FDO_EXTENSION HubExtension,
564   IN PUSB_NODE_CONNECTION_INFORMATION_EX Info,
565   IN ULONG Length,
566   IN PUSB_DEVICE_HANDLE DeviceHandle);
567 
568 NTSTATUS
569 NTAPI
570 USBD_RestoreDeviceEx(
571   IN PUSBHUB_FDO_EXTENSION HubExtension,
572   IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle,
573   IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle);
574 
575 NTSTATUS
576 NTAPI
577 USBH_AllocateWorkItem(
578   IN PUSBHUB_FDO_EXTENSION HubExtension,
579   OUT PUSBHUB_IO_WORK_ITEM * OutHubIoWorkItem,
580   IN PUSBHUB_WORKER_ROUTINE WorkerRoutine,
581   IN SIZE_T BufferLength,
582   OUT PVOID * OutHubWorkItemBuffer,
583   IN WORK_QUEUE_TYPE Type);
584 
585 VOID
586 NTAPI
587 USBH_QueueWorkItem(
588   IN PUSBHUB_FDO_EXTENSION HubExtension,
589   IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem);
590 
591 VOID
592 NTAPI
593 USBH_FreeWorkItem(
594   IN PUSBHUB_IO_WORK_ITEM HubIoWorkItem);
595 
596 NTSTATUS
597 NTAPI
598 USBD_RegisterRootHubCallBack(
599   IN PUSBHUB_FDO_EXTENSION HubExtension);
600 
601 NTSTATUS
602 NTAPI
603 USBD_UnRegisterRootHubCallBack(
604   IN PUSBHUB_FDO_EXTENSION HubExtension);
605 
606 VOID
607 NTAPI
608 USBH_HubCancelIdleIrp(
609   IN PUSBHUB_FDO_EXTENSION HubExtension,
610   IN PIRP IdleIrp);
611 
612 BOOLEAN
613 NTAPI
614 USBH_CheckIdleAbort(
615   IN PUSBHUB_FDO_EXTENSION HubExtension,
616   IN BOOLEAN IsWait,
617   IN BOOLEAN IsExtCheck);
618 
619 VOID
620 NTAPI
621 USBH_CheckHubIdle(
622   IN PUSBHUB_FDO_EXTENSION HubExtension);
623 
624 VOID
625 NTAPI
626 USBH_CheckIdleDeferred(
627   IN PUSBHUB_FDO_EXTENSION HubExtension);
628 
629 NTSTATUS
630 NTAPI
631 USBH_CheckDeviceLanguage(
632   IN PDEVICE_OBJECT DeviceObject,
633   IN USHORT LanguageId);
634 
635 NTSTATUS
636 NTAPI
637 USBH_CreateDevice(
638   IN PUSBHUB_FDO_EXTENSION HubExtension,
639   IN USHORT Port,
640   IN USB_PORT_STATUS UsbPortStatus,
641   IN ULONG IsWait);
642 
643 NTSTATUS
644 NTAPI
645 USBH_ResetDevice(
646   IN PUSBHUB_FDO_EXTENSION HubExtension,
647   IN USHORT Port,
648   IN BOOLEAN IsKeepDeviceData,
649   IN BOOLEAN IsWait);
650 
651 NTSTATUS
652 NTAPI
653 DriverEntry(
654   IN PDRIVER_OBJECT DriverObject,
655   IN PUNICODE_STRING RegistryPath);
656 
657 #endif /* _USBHUB_H_ */
658