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