| 1 |
/* |
| 2 |
* usbioctl.h |
| 3 |
* |
| 4 |
* USB IOCTL interface. |
| 5 |
* |
| 6 |
* This file is part of the w32api package. |
| 7 |
* |
| 8 |
* Contributors: |
| 9 |
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> |
| 10 |
* |
| 11 |
* THIS SOFTWARE IS NOT COPYRIGHTED |
| 12 |
* |
| 13 |
* This source code is offered for use in the public domain. You may |
| 14 |
* use, modify or distribute it freely. |
| 15 |
* |
| 16 |
* This code is distributed in the hope that it will be useful but |
| 17 |
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY |
| 18 |
* DISCLAIMED. This includes but is not limited to warranties of |
| 19 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| 20 |
* |
| 21 |
*/ |
| 22 |
|
| 23 |
#ifndef __USBIOCTL_H |
| 24 |
#define __USBIOCTL_H |
| 25 |
|
| 26 |
#if __GNUC__ >=3 |
| 27 |
#pragma GCC system_header |
| 28 |
#endif |
| 29 |
|
| 30 |
#ifdef __cplusplus |
| 31 |
extern "C" { |
| 32 |
#endif |
| 33 |
|
| 34 |
#include "ntddk.h" |
| 35 |
#include "usb100.h" |
| 36 |
#include "usbiodef.h" |
| 37 |
|
| 38 |
#define USBD_PORT_ENABLED 1 |
| 39 |
#define USBD_PORT_CONNECTED 2 |
| 40 |
|
| 41 |
#define IOCTL_INTERNAL_USB_CYCLE_PORT \ |
| 42 |
CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 43 |
|
| 44 |
#define IOCTL_INTERNAL_USB_ENABLE_PORT \ |
| 45 |
CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 46 |
|
| 47 |
#define IOCTL_INTERNAL_USB_GET_BUS_INFO \ |
| 48 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 49 |
|
| 50 |
#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \ |
| 51 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 52 |
|
| 53 |
#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \ |
| 54 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 55 |
|
| 56 |
#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ |
| 57 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 58 |
|
| 59 |
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \ |
| 60 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 61 |
|
| 62 |
#define IOCTL_INTERNAL_USB_GET_HUB_NAME \ |
| 63 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 64 |
|
| 65 |
#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \ |
| 66 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 67 |
|
| 68 |
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \ |
| 69 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 70 |
|
| 71 |
#define IOCTL_INTERNAL_USB_RESET_PORT \ |
| 72 |
CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 73 |
|
| 74 |
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \ |
| 75 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 76 |
|
| 77 |
#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \ |
| 78 |
CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 79 |
|
| 80 |
#define IOCTL_INTERNAL_USB_SUBMIT_URB \ |
| 81 |
CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS) |
| 82 |
|
| 83 |
|
| 84 |
#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \ |
| 85 |
CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 86 |
|
| 87 |
#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \ |
| 88 |
CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 89 |
|
| 90 |
#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \ |
| 91 |
CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 92 |
|
| 93 |
#define IOCTL_USB_DIAGNOSTIC_MODE_ON \ |
| 94 |
CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 95 |
|
| 96 |
#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ |
| 97 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 98 |
|
| 99 |
#define IOCTL_USB_GET_HUB_CAPABILITIES \ |
| 100 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 101 |
|
| 102 |
#define IOCTL_USB_GET_ROOT_HUB_NAME \ |
| 103 |
CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 104 |
|
| 105 |
#define IOCTL_GET_HCD_DRIVERKEY_NAME \ |
| 106 |
CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 107 |
|
| 108 |
#define IOCTL_USB_GET_NODE_INFORMATION \ |
| 109 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 110 |
|
| 111 |
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \ |
| 112 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 113 |
|
| 114 |
#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ |
| 115 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 116 |
|
| 117 |
#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ |
| 118 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 119 |
|
| 120 |
#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \ |
| 121 |
CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 122 |
|
| 123 |
#define IOCTL_USB_HCD_DISABLE_PORT \ |
| 124 |
CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 125 |
|
| 126 |
#define IOCTL_USB_HCD_ENABLE_PORT \ |
| 127 |
CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 128 |
|
| 129 |
#define IOCTL_USB_HCD_GET_STATS_1 \ |
| 130 |
CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 131 |
|
| 132 |
#define IOCTL_USB_HCD_GET_STATS_2 \ |
| 133 |
CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS) |
| 134 |
|
| 135 |
|
| 136 |
typedef struct _USB_HUB_CAPABILITIES { |
| 137 |
ULONG HubIs2xCapable : 1; |
| 138 |
} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; |
| 139 |
|
| 140 |
typedef enum _USB_CONNECTION_STATUS { |
| 141 |
NoDeviceConnected, |
| 142 |
DeviceConnected, |
| 143 |
DeviceFailedEnumeration, |
| 144 |
DeviceGeneralFailure, |
| 145 |
DeviceCausedOvercurrent, |
| 146 |
DeviceNotEnoughPower, |
| 147 |
DeviceNotEnoughBandwidth, |
| 148 |
DeviceHubNestedTooDeeply, |
| 149 |
DeviceInLegacyHub |
| 150 |
} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; |
| 151 |
|
| 152 |
#include <pshpack1.h> |
| 153 |
|
| 154 |
typedef struct _USB_DESCRIPTOR_REQUEST { |
| 155 |
ULONG ConnectionIndex; |
| 156 |
struct { |
| 157 |
UCHAR bmRequest; |
| 158 |
UCHAR bRequest; |
| 159 |
USHORT wValue; |
| 160 |
USHORT wIndex; |
| 161 |
USHORT wLength; |
| 162 |
} SetupPacket; |
| 163 |
UCHAR Data[0]; |
| 164 |
} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; |
| 165 |
|
| 166 |
typedef struct _USB_HCD_DRIVERKEY_NAME { |
| 167 |
ULONG ActualLength; |
| 168 |
WCHAR DriverKeyName[1]; |
| 169 |
} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME; |
| 170 |
|
| 171 |
typedef struct _HCD_ISO_STAT_COUNTERS { |
| 172 |
USHORT LateUrbs; |
| 173 |
USHORT DoubleBufferedPackets; |
| 174 |
USHORT TransfersCF_5ms; |
| 175 |
USHORT TransfersCF_2ms; |
| 176 |
USHORT TransfersCF_1ms; |
| 177 |
USHORT MaxInterruptLatency; |
| 178 |
USHORT BadStartFrame; |
| 179 |
USHORT StaleUrbs; |
| 180 |
USHORT IsoPacketNotAccesed; |
| 181 |
USHORT IsoPacketHWError; |
| 182 |
USHORT SmallestUrbPacketCount; |
| 183 |
USHORT LargestUrbPacketCount; |
| 184 |
USHORT IsoCRC_Error; |
| 185 |
USHORT IsoOVERRUN_Error; |
| 186 |
USHORT IsoINTERNAL_Error; |
| 187 |
USHORT IsoUNKNOWN_Error; |
| 188 |
ULONG IsoBytesTransferred; |
| 189 |
USHORT LateMissedCount; |
| 190 |
USHORT HWIsoMissedCount; |
| 191 |
ULONG Reserved7[8]; |
| 192 |
} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS; |
| 193 |
|
| 194 |
typedef struct _HCD_STAT_COUNTERS { |
| 195 |
ULONG BytesTransferred; |
| 196 |
USHORT IsoMissedCount; |
| 197 |
USHORT DataOverrunErrorCount; |
| 198 |
USHORT CrcErrorCount; |
| 199 |
USHORT ScheduleOverrunCount; |
| 200 |
USHORT TimeoutErrorCount; |
| 201 |
USHORT InternalHcErrorCount; |
| 202 |
USHORT BufferOverrunErrorCount; |
| 203 |
USHORT SWErrorCount; |
| 204 |
USHORT StallPidCount; |
| 205 |
USHORT PortDisableCount; |
| 206 |
} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS; |
| 207 |
|
| 208 |
typedef struct _HCD_STAT_INFORMATION_1 { |
| 209 |
ULONG Reserved1; |
| 210 |
ULONG Reserved2; |
| 211 |
ULONG ResetCounters; |
| 212 |
LARGE_INTEGER TimeRead; |
| 213 |
HCD_STAT_COUNTERS Counters; |
| 214 |
} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1; |
| 215 |
|
| 216 |
typedef struct _HCD_STAT_INFORMATION_2 { |
| 217 |
ULONG Reserved1; |
| 218 |
ULONG Reserved2; |
| 219 |
ULONG ResetCounters; |
| 220 |
LARGE_INTEGER TimeRead; |
| 221 |
LONG LockedMemoryUsed; |
| 222 |
HCD_STAT_COUNTERS Counters; |
| 223 |
HCD_ISO_STAT_COUNTERS IsoCounters; |
| 224 |
} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2; |
| 225 |
|
| 226 |
typedef struct _USB_HUB_INFORMATION { |
| 227 |
USB_HUB_DESCRIPTOR HubDescriptor; |
| 228 |
BOOLEAN HubIsBusPowered; |
| 229 |
} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; |
| 230 |
|
| 231 |
typedef struct _USB_HUB_NAME { |
| 232 |
ULONG ActualLength; |
| 233 |
WCHAR HubName[1]; |
| 234 |
} USB_HUB_NAME, *PUSB_HUB_NAME; |
| 235 |
|
| 236 |
typedef enum _USB_HUB_NODE { |
| 237 |
UsbHub, |
| 238 |
UsbMIParent |
| 239 |
} USB_HUB_NODE; |
| 240 |
|
| 241 |
typedef VOID STDCALL |
| 242 |
(*USB_IDLE_CALLBACK)( |
| 243 |
PVOID Context); |
| 244 |
|
| 245 |
typedef struct _USB_IDLE_CALLBACK_INFO { |
| 246 |
USB_IDLE_CALLBACK IdleCallback; |
| 247 |
PVOID IdleContext; |
| 248 |
} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO; |
| 249 |
|
| 250 |
typedef struct _USB_NODE_CONNECTION_ATTRIBUTES { |
| 251 |
ULONG ConnectionIndex; |
| 252 |
USB_CONNECTION_STATUS ConnectionStatus; |
| 253 |
ULONG PortAttributes; |
| 254 |
} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES; |
| 255 |
|
| 256 |
typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME { |
| 257 |
ULONG ConnectionIndex; |
| 258 |
ULONG ActualLength; |
| 259 |
WCHAR DriverKeyName[1]; |
| 260 |
} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME; |
| 261 |
|
| 262 |
typedef struct _USB_PIPE_INFO { |
| 263 |
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; |
| 264 |
ULONG ScheduleOffset; |
| 265 |
} USB_PIPE_INFO, *PUSB_PIPE_INFO; |
| 266 |
|
| 267 |
typedef struct _USB_NODE_CONNECTION_INFORMATION { |
| 268 |
ULONG ConnectionIndex; |
| 269 |
USB_DEVICE_DESCRIPTOR DeviceDescriptor; |
| 270 |
UCHAR CurrentConfigurationValue; |
| 271 |
BOOLEAN LowSpeed; |
| 272 |
BOOLEAN DeviceIsHub; |
| 273 |
USHORT DeviceAddress; |
| 274 |
ULONG NumberOfOpenPipes; |
| 275 |
USB_CONNECTION_STATUS ConnectionStatus; |
| 276 |
USB_PIPE_INFO PipeList[0]; |
| 277 |
} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION; |
| 278 |
|
| 279 |
typedef struct _USB_NODE_CONNECTION_NAME { |
| 280 |
ULONG ConnectionIndex; |
| 281 |
ULONG ActualLength; |
| 282 |
WCHAR NodeName[1]; |
| 283 |
} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; |
| 284 |
|
| 285 |
typedef struct _USB_MI_PARENT_INFORMATION { |
| 286 |
ULONG NumberOfInterfaces; |
| 287 |
} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; |
| 288 |
|
| 289 |
typedef struct _USB_NODE_INFORMATION { |
| 290 |
USB_HUB_NODE NodeType; |
| 291 |
union { |
| 292 |
USB_HUB_INFORMATION HubInformation; |
| 293 |
USB_MI_PARENT_INFORMATION MiParentInformation; |
| 294 |
} u; |
| 295 |
} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; |
| 296 |
|
| 297 |
#define WMI_USB_DRIVER_INFORMATION 0 |
| 298 |
#define WMI_USB_DRIVER_NOTIFICATION 1 |
| 299 |
#define WMI_USB_POWER_DEVICE_ENABLE 2 |
| 300 |
|
| 301 |
typedef enum _USB_NOTIFICATION_TYPE { |
| 302 |
EnumerationFailure = 0, |
| 303 |
InsufficentBandwidth, |
| 304 |
InsufficentPower, |
| 305 |
OverCurrent, |
| 306 |
ResetOvercurrent, |
| 307 |
AcquireBusInfo, |
| 308 |
AcquireHubName, |
| 309 |
AcquireControllerName, |
| 310 |
HubOvercurrent, |
| 311 |
HubPowerChange, |
| 312 |
HubNestedTooDeeply, |
| 313 |
ModernDeviceInLegacyHub |
| 314 |
} USB_NOTIFICATION_TYPE; |
| 315 |
|
| 316 |
typedef struct _USB_ACQUIRE_INFO { |
| 317 |
USB_NOTIFICATION_TYPE NotificationType; |
| 318 |
ULONG TotalSize; |
| 319 |
WCHAR Buffer[1]; |
| 320 |
} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO; |
| 321 |
|
| 322 |
typedef struct _USB_NOTIFICATION { |
| 323 |
USB_NOTIFICATION_TYPE NotificationType; |
| 324 |
} USB_NOTIFICATION, *PUSB_NOTIFICATION; |
| 325 |
|
| 326 |
typedef struct _USB_BUS_NOTIFICATION { |
| 327 |
USB_NOTIFICATION_TYPE NotificationType; |
| 328 |
ULONG TotalBandwidth; |
| 329 |
ULONG ConsumedBandwidth; |
| 330 |
ULONG ControllerNameLength; |
| 331 |
} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION; |
| 332 |
|
| 333 |
typedef struct _USB_CONNECTION_NOTIFICATION { |
| 334 |
USB_NOTIFICATION_TYPE NotificationType; |
| 335 |
ULONG ConnectionNumber; |
| 336 |
ULONG RequestedBandwidth; |
| 337 |
ULONG EnumerationFailReason; |
| 338 |
ULONG PowerRequested; |
| 339 |
ULONG HubNameLength; |
| 340 |
} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION; |
| 341 |
|
| 342 |
typedef struct _USB_ROOT_HUB_NAME { |
| 343 |
ULONG ActualLength; |
| 344 |
WCHAR RootHubName[1]; |
| 345 |
} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; |
| 346 |
|
| 347 |
#include <poppack.h> |
| 348 |
|
| 349 |
#ifdef __cplusplus |
| 350 |
} |
| 351 |
#endif |
| 352 |
|
| 353 |
#endif /* __USBIOCTL_H */ |