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