1/*
2 * usbioctl.h
3 *
4 * USB IOCTL interface.
5 *
6 * This file is part of the ReactOS PSDK package.
7 *
8 * Contributors:
9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23#pragma once
24
25#include "usb100.h"
26#include "usbiodef.h"
27
28#define IOCTL_INTERNAL_USB_SUBMIT_URB  \
29  CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS)
30
31#define IOCTL_INTERNAL_USB_RESET_PORT \
32  CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
33
34#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \
35  CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS)
36
37#define USBD_PORT_ENABLED                 1
38#define USBD_PORT_CONNECTED               2
39
40#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \
41  CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS)
42
43#define IOCTL_INTERNAL_USB_ENABLE_PORT \
44  CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
45
46#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \
47  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS)
48
49#define IOCTL_INTERNAL_USB_CYCLE_PORT \
50  CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
51
52#define IOCTL_INTERNAL_USB_GET_HUB_NAME \
53  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
54
55#define IOCTL_INTERNAL_USB_GET_BUS_INFO \
56  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
57
58#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \
59  CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
60
61#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \
62  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
63
64#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \
65  CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
66
67#if (_WIN32_WINNT >= 0x0501)
68
69#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \
70  CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS)
71
72#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \
73  CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
74
75#endif
76
77#if (_WIN32_WINNT >= 0x0600)
78
79#define IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY \
80  CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION_EX, METHOD_NEITHER, FILE_ANY_ACCESS)
81
82#define IOCTL_INTERNAL_USB_REQ_GLOBAL_SUSPEND \
83  CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_SUSPEND, METHOD_NEITHER, FILE_ANY_ACCESS)
84
85#define IOCTL_INTERNAL_USB_REQ_GLOBAL_RESUME \
86  CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_RESUME, METHOD_NEITHER, FILE_ANY_ACCESS)
87
88#ifdef USB20_API
89typedef struct _USB_START_FAILDATA {
90  ULONG LengthInBytes;
91  NTSTATUS NtStatus;
92  USBD_STATUS UsbdStatus;
93  ULONG ConnectStatus;
94  UCHAR DriverData[4];
95} USB_START_FAILDATA, *PUSB_START_FAILDATA;
96#endif
97
98#define IOCTL_INTERNAL_USB_RECORD_FAILURE \
99  CTL_CODE(FILE_DEVICE_USB, USB_RECORD_FAILURE, METHOD_NEITHER, FILE_ANY_ACCESS)
100
101#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX \
102  CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE_EX, METHOD_NEITHER, FILE_ANY_ACCESS)
103
104#define IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE \
105  CTL_CODE(FILE_DEVICE_USB, USB_GET_TT_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
106
107typedef struct _USB_TOPOLOGY_ADDRESS {
108  ULONG PciBusNumber;
109  ULONG PciDeviceNumber;
110  ULONG PciFunctionNumber;
111  ULONG Reserved;
112  USHORT RootHubPortNumber;
113  USHORT HubPortNumber[5];
114  USHORT Reserved2;
115} USB_TOPOLOGY_ADDRESS, *PUSB_TOPOLOGY_ADDRESS;
116
117#define IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS \
118  CTL_CODE(FILE_DEVICE_USB, USB_GET_TOPOLOGY_ADDRESS, METHOD_NEITHER, FILE_ANY_ACCESS)
119
120#define IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO \
121  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CONFIG_INFO, METHOD_NEITHER, FILE_ANY_ACCESS)
122
123#endif /* _WIN32_WINNT >= 0x0600 */
124
125#ifndef USB_KERNEL_IOCTL
126
127#define IOCTL_USB_HCD_GET_STATS_1 \
128  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS)
129
130#define IOCTL_USB_HCD_GET_STATS_2 \
131  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS)
132
133#define IOCTL_USB_HCD_DISABLE_PORT \
134  CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
135
136#define IOCTL_USB_HCD_ENABLE_PORT \
137  CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
138
139#define IOCTL_USB_HCD_DISABLE_PORT \
140  CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
141
142#define IOCTL_USB_HCD_ENABLE_PORT \
143  CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
144
145#ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF
146#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \
147  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
148#endif
149
150#ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON
151#define IOCTL_USB_DIAGNOSTIC_MODE_ON \
152  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
153#endif
154
155#ifndef IOCTL_USB_GET_ROOT_HUB_NAME
156#define IOCTL_USB_GET_ROOT_HUB_NAME \
157  CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
158#endif
159
160#ifndef IOCTL_GET_HCD_DRIVERKEY_NAME
161#define IOCTL_GET_HCD_DRIVERKEY_NAME \
162  CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
163#endif
164
165#define IOCTL_USB_GET_NODE_INFORMATION \
166  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
167
168#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \
169  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
170
171#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
172  CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
173
174#define IOCTL_USB_GET_NODE_CONNECTION_NAME \
175  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
176
177#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \
178  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
179
180#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \
181  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
182
183#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \
184  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
185
186#if (_WIN32_WINNT >= 0x0501)
187
188#define IOCTL_USB_GET_HUB_CAPABILITIES \
189  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)
190
191#define IOCTL_USB_HUB_CYCLE_PORT \
192  CTL_CODE(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
193
194#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
195  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
196
197#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
198  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
199
200#endif /* _WIN32_WINNT >= 0x0501 */
201
202#if (_WIN32_WINNT >= 0x0600)
203
204#define IOCTL_USB_RESET_HUB \
205  CTL_CODE(FILE_DEVICE_USB, USB_RESET_HUB, METHOD_BUFFERED, FILE_ANY_ACCESS)
206
207#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \
208  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
209
210#endif /* _WIN32_WINNT >= 0x0600 */
211
212#include <pshpack1.h>
213
214typedef enum _USB_HUB_NODE {
215  UsbHub,
216  UsbMIParent
217} USB_HUB_NODE;
218
219typedef struct _USB_HUB_INFORMATION {
220  USB_HUB_DESCRIPTOR HubDescriptor;
221  BOOLEAN HubIsBusPowered;
222} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
223
224typedef struct _USB_MI_PARENT_INFORMATION {
225  ULONG NumberOfInterfaces;
226} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
227
228typedef struct _USB_NODE_INFORMATION {
229  USB_HUB_NODE NodeType;
230  union {
231    USB_HUB_INFORMATION HubInformation;
232    USB_MI_PARENT_INFORMATION MiParentInformation;
233  } u;
234} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
235
236typedef struct _USB_PIPE_INFO {
237  USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
238  ULONG ScheduleOffset;
239} USB_PIPE_INFO, *PUSB_PIPE_INFO;
240
241#if (_WIN32_WINNT >= 0x0600)
242
243typedef enum _USB_CONNECTION_STATUS {
244  NoDeviceConnected,
245  DeviceConnected,
246  DeviceFailedEnumeration,
247  DeviceGeneralFailure,
248  DeviceCausedOvercurrent,
249  DeviceNotEnoughPower,
250  DeviceNotEnoughBandwidth,
251  DeviceHubNestedTooDeeply,
252  DeviceInLegacyHub,
253  DeviceEnumerating,
254  DeviceReset
255} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
256
257#elif (_WIN32_WINNT >= 0x0501)
258
259typedef enum _USB_CONNECTION_STATUS {
260  NoDeviceConnected,
261  DeviceConnected,
262  DeviceFailedEnumeration,
263  DeviceGeneralFailure,
264  DeviceCausedOvercurrent,
265  DeviceNotEnoughPower,
266  DeviceNotEnoughBandwidth,
267  DeviceHubNestedTooDeeply,
268  DeviceInLegacyHub
269} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
270
271#else /* _WIN32_WINNT >= 0x0501 */
272
273typedef enum _USB_CONNECTION_STATUS {
274  NoDeviceConnected,
275  DeviceConnected,
276  DeviceFailedEnumeration,
277  DeviceGeneralFailure,
278  DeviceCausedOvercurrent,
279  DeviceNotEnoughPower,
280  DeviceNotEnoughBandwidth
281} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
282
283#endif /* _WIN32_WINNT >= 0x0501 */
284
285typedef struct _USB_NODE_CONNECTION_INFORMATION {
286  ULONG ConnectionIndex;
287  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
288  UCHAR CurrentConfigurationValue;
289  BOOLEAN LowSpeed;
290  BOOLEAN DeviceIsHub;
291  USHORT DeviceAddress;
292  ULONG NumberOfOpenPipes;
293  USB_CONNECTION_STATUS ConnectionStatus;
294  USB_PIPE_INFO PipeList[0];
295} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
296
297typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME {
298  ULONG ConnectionIndex;
299  ULONG ActualLength;
300  WCHAR DriverKeyName[1];
301} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME;
302
303typedef struct _USB_NODE_CONNECTION_NAME {
304  ULONG ConnectionIndex;
305  ULONG ActualLength;
306  WCHAR NodeName[1];
307} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
308
309typedef struct _USB_HUB_NAME {
310  ULONG ActualLength;
311  WCHAR HubName[1];
312} USB_HUB_NAME, *PUSB_HUB_NAME;
313
314typedef struct _USB_ROOT_HUB_NAME {
315  ULONG ActualLength;
316  WCHAR RootHubName[1];
317} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
318
319typedef struct _USB_HCD_DRIVERKEY_NAME {
320  ULONG ActualLength;
321  WCHAR DriverKeyName[1];
322} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;
323
324typedef struct _USB_DESCRIPTOR_REQUEST {
325  ULONG ConnectionIndex;
326  struct {
327    UCHAR bmRequest;
328    UCHAR bRequest;
329    USHORT wValue;
330    USHORT wIndex;
331    USHORT wLength;
332  } SetupPacket;
333  UCHAR Data[0];
334} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
335
336#if (_WIN32_WINNT >= 0x0501)
337
338typedef struct _USB_HUB_CAPABILITIES {
339  ULONG  HubIs2xCapable:1;
340} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
341
342typedef struct _USB_NODE_CONNECTION_ATTRIBUTES {
343  ULONG ConnectionIndex;
344  USB_CONNECTION_STATUS ConnectionStatus;
345  ULONG PortAttributes;
346} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES;
347
348typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
349  ULONG ConnectionIndex;
350  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
351  UCHAR CurrentConfigurationValue;
352  UCHAR Speed;
353  BOOLEAN DeviceIsHub;
354  USHORT DeviceAddress;
355  ULONG NumberOfOpenPipes;
356  USB_CONNECTION_STATUS ConnectionStatus;
357  USB_PIPE_INFO PipeList[0];
358} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
359
360C_ASSERT(sizeof(USB_NODE_CONNECTION_INFORMATION_EX) == sizeof(USB_NODE_CONNECTION_INFORMATION));
361
362#endif /* _WIN32_WINNT >= 0x0501 */
363
364#if (_WIN32_WINNT >= 0x0600)
365
366typedef union _USB_HUB_CAP_FLAGS {
367  ULONG ul;
368  __C89_NAMELESS struct {
369    ULONG HubIsHighSpeedCapable:1;
370    ULONG HubIsHighSpeed:1;
371    ULONG HubIsMultiTtCapable:1;
372    ULONG HubIsMultiTt:1;
373    ULONG HubIsRoot:1;
374    ULONG HubIsArmedWakeOnConnect:1;
375    ULONG HubIsBusPowered:1;
376    ULONG ReservedMBZ:25;
377  };
378} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS;
379
380C_ASSERT(sizeof(USB_HUB_CAP_FLAGS) == sizeof(ULONG));
381
382typedef struct _USB_HUB_CAPABILITIES_EX {
383  USB_HUB_CAP_FLAGS CapabilityFlags;
384} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;
385
386typedef struct _USB_CYCLE_PORT_PARAMS {
387  ULONG ConnectionIndex;
388  ULONG StatusReturned;
389} USB_CYCLE_PORT_PARAMS, *PUSB_CYCLE_PORT_PARAMS;
390
391typedef struct _USB_ID_STRING {
392  USHORT LanguageId;
393  USHORT Pad;
394  ULONG LengthInBytes;
395  PWCHAR Buffer;
396} USB_ID_STRING, *PUSB_ID_STRING;
397
398typedef struct _USB_HUB_DEVICE_UXD_SETTINGS {
399  ULONG Version;
400  GUID PnpGuid;
401  GUID OwnerGuid;
402  ULONG DeleteOnShutdown;
403  ULONG DeleteOnReload;
404  ULONG DeleteOnDisconnect;
405  ULONG Reserved[5];
406} USB_HUB_DEVICE_UXD_SETTINGS, *PUSB_HUB_DEVICE_UXD_SETTINGS;
407
408typedef struct _HUB_DEVICE_CONFIG_INFO_V1 {
409  ULONG Version;
410  ULONG Length;
411  USB_HUB_CAP_FLAGS HubFlags;
412  USB_ID_STRING HardwareIds;
413  USB_ID_STRING CompatibleIds;
414  USB_ID_STRING DeviceDescription;
415  ULONG Reserved[19];
416  USB_HUB_DEVICE_UXD_SETTINGS UxdSettings;
417} HUB_DEVICE_CONFIG_INFO, *PHUB_DEVICE_CONFIG_INFO;
418
419#endif /* _WIN32_WINNT >= 0x0600 */
420
421typedef struct _HCD_ISO_STAT_COUNTERS {
422  USHORT LateUrbs;
423  USHORT DoubleBufferedPackets;
424  USHORT TransfersCF_5ms;
425  USHORT TransfersCF_2ms;
426  USHORT TransfersCF_1ms;
427  USHORT MaxInterruptLatency;
428  USHORT BadStartFrame;
429  USHORT StaleUrbs;
430  USHORT IsoPacketNotAccesed;
431  USHORT IsoPacketHWError;
432  USHORT SmallestUrbPacketCount;
433  USHORT LargestUrbPacketCount;
434  USHORT IsoCRC_Error;
435  USHORT IsoOVERRUN_Error;
436  USHORT IsoINTERNAL_Error;
437  USHORT IsoUNKNOWN_Error;
438  ULONG IsoBytesTransferred;
439  USHORT LateMissedCount;
440  USHORT HWIsoMissedCount;
441  ULONG Reserved7[8];
442} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS;
443
444typedef struct _HCD_STAT_COUNTERS {
445  ULONG BytesTransferred;
446  USHORT IsoMissedCount;
447  USHORT DataOverrunErrorCount;
448  USHORT CrcErrorCount;
449  USHORT ScheduleOverrunCount;
450  USHORT TimeoutErrorCount;
451  USHORT InternalHcErrorCount;
452  USHORT BufferOverrunErrorCount;
453  USHORT SWErrorCount;
454  USHORT StallPidCount;
455  USHORT PortDisableCount;
456} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS;
457
458typedef struct _HCD_STAT_INFORMATION_1 {
459  ULONG Reserved1;
460  ULONG Reserved2;
461  ULONG ResetCounters;
462  LARGE_INTEGER TimeRead;
463  HCD_STAT_COUNTERS Counters;
464} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1;
465
466typedef struct _HCD_STAT_INFORMATION_2 {
467  ULONG Reserved1;
468  ULONG Reserved2;
469  ULONG ResetCounters;
470  LARGE_INTEGER TimeRead;
471  LONG LockedMemoryUsed;
472  HCD_STAT_COUNTERS Counters;
473  HCD_ISO_STAT_COUNTERS IsoCounters;
474} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2;
475
476#define WMI_USB_DRIVER_INFORMATION        0
477#define WMI_USB_DRIVER_NOTIFICATION       1
478#define WMI_USB_POWER_DEVICE_ENABLE       2
479#define WMI_USB_HUB_NODE_INFORMATION      4
480
481#define WMI_USB_PERFORMANCE_INFORMATION   1
482#define WMI_USB_DEVICE_NODE_INFORMATION   2
483
484#if (_WIN32_WINNT >= 0x0501)
485
486typedef enum _USB_NOTIFICATION_TYPE {
487  EnumerationFailure = 0,
488  InsufficentBandwidth,
489  InsufficentPower,
490  OverCurrent,
491  ResetOvercurrent,
492  AcquireBusInfo,
493  AcquireHubName,
494  AcquireControllerName,
495  HubOvercurrent,
496  HubPowerChange,
497  HubNestedTooDeeply,
498  ModernDeviceInLegacyHub
499} USB_NOTIFICATION_TYPE;
500
501#else /* _WIN32_WINNT >= 0x0501 */
502
503typedef enum _USB_NOTIFICATION_TYPE {
504  EnumerationFailure = 0,
505  InsufficentBandwidth,
506  InsufficentPower,
507  OverCurrent,
508  ResetOvercurrent,
509  AcquireBusInfo,
510  AcquireHubName,
511  AcquireControllerName,
512  HubOvercurrent,
513  HubPowerChange
514} USB_NOTIFICATION_TYPE;
515
516#endif /* _WIN32_WINNT >= 0x0501 */
517
518typedef struct _USB_NOTIFICATION {
519  USB_NOTIFICATION_TYPE NotificationType;
520} USB_NOTIFICATION, *PUSB_NOTIFICATION;
521
522typedef struct _USB_CONNECTION_NOTIFICATION {
523  USB_NOTIFICATION_TYPE NotificationType;
524  ULONG ConnectionNumber;
525  ULONG RequestedBandwidth;
526  ULONG EnumerationFailReason;
527  ULONG PowerRequested;
528  ULONG HubNameLength;
529} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION;
530
531typedef struct _USB_BUS_NOTIFICATION {
532  USB_NOTIFICATION_TYPE NotificationType;
533  ULONG TotalBandwidth;
534  ULONG ConsumedBandwidth;
535  ULONG ControllerNameLength;
536} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION;
537
538typedef struct _USB_ACQUIRE_INFO {
539  USB_NOTIFICATION_TYPE NotificationType;
540  ULONG TotalSize;
541  WCHAR Buffer[1];
542} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO;
543
544#if (_WIN32_WINNT >= 0x0600)
545
546#define USB_NODE_INFO_SIG 'USBN'
547
548typedef enum _USB_WMI_DEVICE_NODE_TYPE {
549  UsbDevice,
550  HubDevice,
551  CompositeDevice,
552  UsbController
553} USB_WMI_DEVICE_NODE_TYPE, *PUSB_WMI_DEVICE_NODE_TYPE;
554
555typedef struct _USB_DEVICE_STATE {
556  ULONG DeviceConnected:1;
557  ULONG DeviceStarted:1;
558} USB_DEVICE_STATE, *PUSB_DEVICE_STATE;
559
560typedef struct _USB_HUB_PORT_INFORMATION {
561  USB_DEVICE_STATE DeviceState;
562  USHORT PortNumber;
563  USHORT DeviceAddress;
564  ULONG ConnectionIndex;
565  USB_CONNECTION_STATUS ConnectionStatus;
566} USB_HUB_PORT_INFORMATION, *PUSB_HUB_PORT_INFORMATION;
567
568typedef struct _USB_HUB_DEVICE_INFO {
569  USB_HUB_DESCRIPTOR HubDescriptor;
570  ULONG HubNumber;
571  USHORT DeviceAddress;
572  BOOLEAN HubIsSelfPowered;
573  BOOLEAN HubIsRootHub;
574  USB_HUB_CAPABILITIES HubCapabilities;
575  ULONG NumberOfHubPorts;
576  USB_HUB_PORT_INFORMATION PortInfo[1];
577} USB_HUB_DEVICE_INFO, *PUSB_HUB_DEVICE_INFO;
578
579typedef struct _USB_COMPOSITE_FUNCTION_INFO {
580  UCHAR FunctionNumber;
581  UCHAR BaseInterfaceNumber;
582  UCHAR NumberOfInterfaces;
583  BOOLEAN FunctionIsIdle;
584} USB_COMPOSITE_FUNCTION_INFO, *PUSB_COMPOSITE_FUNCTION_INFO;
585
586typedef struct _USB_COMPOSITE_DEVICE_INFO {
587  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
588  USB_CONFIGURATION_DESCRIPTOR CurrentConfigDescriptor;
589  UCHAR CurrentConfigurationValue;
590  UCHAR NumberOfFunctions;
591  USB_COMPOSITE_FUNCTION_INFO FunctionInfo[1];
592} USB_COMPOSITE_DEVICE_INFO, *PUSB_COMPOSITE_DEVICE_INFO;
593
594typedef struct _USB_CONTROLLER_DEVICE_INFO {
595  ULONG PciVendorId;
596  ULONG PciDeviceId;
597  ULONG PciRevision;
598  ULONG NumberOfRootPorts;
599  ULONG HcFeatureFlags;
600} USB_CONTROLLER_DEVICE_INFO, *PUSB_CONTROLLER_DEVICE_INFO;
601
602typedef struct _USB_DEVICE_INFO {
603  USB_DEVICE_STATE DeviceState;
604  USHORT PortNumber;
605  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
606  UCHAR CurrentConfigurationValue;
607  USB_DEVICE_SPEED Speed;
608  USHORT DeviceAddress;
609  ULONG ConnectionIndex;
610  USB_CONNECTION_STATUS ConnectionStatus;
611  WCHAR PnpHardwareId[128];
612  WCHAR PnpCompatibleId[128];
613  WCHAR SerialNumberId[128];
614  WCHAR PnpDeviceDescription[128];
615  ULONG NumberOfOpenPipes;
616  USB_PIPE_INFO PipeList[1];
617} USB_DEVICE_INFO, *PUSB_DEVICE_INFO;
618
619typedef struct _USB_DEVICE_NODE_INFO {
620  ULONG Sig;
621  ULONG LengthInBytes;
622  WCHAR DeviceDescription[40];
623  USB_WMI_DEVICE_NODE_TYPE NodeType;
624  USB_TOPOLOGY_ADDRESS BusAddress;
625  __C89_NAMELESS union {
626    USB_DEVICE_INFO UsbDeviceInfo;
627    USB_HUB_DEVICE_INFO HubDeviceInfo;
628    USB_COMPOSITE_DEVICE_INFO CompositeDeviceInfo;
629    USB_CONTROLLER_DEVICE_INFO ControllerDeviceInfo;
630    UCHAR DeviceInformation[4];
631  };
632} USB_DEVICE_NODE_INFO, *PUSB_DEVICE_NODE_INFO;
633
634typedef struct _USB_DEVICE_PERFORMANCE_INFO {
635  ULONG BulkBytes;
636  ULONG ControlDataBytes;
637  ULONG IsoBytes;
638  ULONG InterruptBytes;
639  ULONG BulkUrbCount;
640  ULONG ControlUrbCount;
641  ULONG IsoUrbCount;
642  ULONG InterruptUrbCount;
643  ULONG AllocedInterrupt[6];
644  ULONG AllocedIso;
645  ULONG Total32secBandwidth;
646  ULONG TotalTtBandwidth;
647  WCHAR DeviceDescription[60];
648  USB_DEVICE_SPEED DeviceSpeed;
649  ULONG TotalIsoLatency;
650  ULONG DroppedIsoPackets;
651  ULONG TransferErrors;
652  ULONG PciInterruptCount;
653  ULONG HcIdleState;
654  ULONG HcAsyncIdleState;
655  ULONG HcAsyncCacheFlushCount;
656  ULONG HcPeriodicIdleState;
657  ULONG HcPeriodicCacheFlushCount;
658} USB_DEVICE_PERFORMANCE_INFO, *PUSB_DEVICE_PERFORMANCE_INFO;
659
660#endif /* _WIN32_WINNT >= 0x0600 */
661
662#include <poppack.h>
663
664#endif /* USB_KERNEL_IOCTL */
665
666