zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

usbioctl.h (20764B) - Raw


      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@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 <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