Home | History | Annotate | Download | only in include
      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 (at) 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
     89 typedef 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 
    107 typedef 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 
    214 typedef enum _USB_HUB_NODE {
    215   UsbHub,
    216   UsbMIParent
    217 } USB_HUB_NODE;
    218 
    219 typedef struct _USB_HUB_INFORMATION {
    220   USB_HUB_DESCRIPTOR HubDescriptor;
    221   BOOLEAN HubIsBusPowered;
    222 } USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
    223 
    224 typedef struct _USB_MI_PARENT_INFORMATION {
    225   ULONG NumberOfInterfaces;
    226 } USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
    227 
    228 typedef 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 
    236 typedef 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 
    243 typedef 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 
    259 typedef 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 
    273 typedef 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 
    285 typedef 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 
    297 typedef 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 
    303 typedef 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 
    309 typedef struct _USB_HUB_NAME {
    310   ULONG ActualLength;
    311   WCHAR HubName[1];
    312 } USB_HUB_NAME, *PUSB_HUB_NAME;
    313 
    314 typedef struct _USB_ROOT_HUB_NAME {
    315   ULONG ActualLength;
    316   WCHAR RootHubName[1];
    317 } USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
    318 
    319 typedef struct _USB_HCD_DRIVERKEY_NAME {
    320   ULONG ActualLength;
    321   WCHAR DriverKeyName[1];
    322 } USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;
    323 
    324 typedef 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 
    338 typedef struct _USB_HUB_CAPABILITIES {
    339   ULONG  HubIs2xCapable:1;
    340 } USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
    341 
    342 typedef 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 
    348 typedef 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 
    360 C_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 
    366 typedef 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 
    380 C_ASSERT(sizeof(USB_HUB_CAP_FLAGS) == sizeof(ULONG));
    381 
    382 typedef struct _USB_HUB_CAPABILITIES_EX {
    383   USB_HUB_CAP_FLAGS CapabilityFlags;
    384 } USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;
    385 
    386 typedef struct _USB_CYCLE_PORT_PARAMS {
    387   ULONG ConnectionIndex;
    388   ULONG StatusReturned;
    389 } USB_CYCLE_PORT_PARAMS, *PUSB_CYCLE_PORT_PARAMS;
    390 
    391 typedef struct _USB_ID_STRING {
    392   USHORT LanguageId;
    393   USHORT Pad;
    394   ULONG LengthInBytes;
    395   PWCHAR Buffer;
    396 } USB_ID_STRING, *PUSB_ID_STRING;
    397 
    398 typedef 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 
    408 typedef 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 
    421 typedef 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 
    444 typedef 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 
    458 typedef 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 
    466 typedef 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 
    486 typedef 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 
    503 typedef 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 
    518 typedef struct _USB_NOTIFICATION {
    519   USB_NOTIFICATION_TYPE NotificationType;
    520 } USB_NOTIFICATION, *PUSB_NOTIFICATION;
    521 
    522 typedef 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 
    531 typedef 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 
    538 typedef 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 
    548 typedef 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 
    555 typedef struct _USB_DEVICE_STATE {
    556   ULONG DeviceConnected:1;
    557   ULONG DeviceStarted:1;
    558 } USB_DEVICE_STATE, *PUSB_DEVICE_STATE;
    559 
    560 typedef 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 
    568 typedef 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 
    579 typedef 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 
    586 typedef 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 
    594 typedef 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 
    602 typedef 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 
    619 typedef 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 
    634 typedef 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