Home | History | Annotate | Download | only in ddk
      1 #pragma once
      2 
      3 #define _HUBBUSIF_
      4 
      5 #include "usbdi.h"
      6 
      7 #if (NTDDI_VERSION >= NTDDI_WINXP)
      8 
      9 #if !defined(_USBBUSIF_)
     10 typedef PVOID PUSB_DEVICE_HANDLE;
     11 #endif
     12 
     13 typedef struct _ROOTHUB_PDO_EXTENSION {
     14   ULONG Signature;
     15 } ROOTHUB_PDO_EXTENSION, *PROOTHUB_PDO_EXTENSION;
     16 
     17 #define USBD_DEVHACK_SLOW_ENUMERATION	0x00000001
     18 #define USBD_DEVHACK_DISABLE_SN		0x00000002
     19 #define USBD_DEVHACK_SET_DIAG_ID	0x00000004
     20 
     21 #ifndef USB_BUSIFFN
     22 #if defined(_ARM_)
     23 #define USB_BUSIFFN
     24 #else
     25 #define USB_BUSIFFN __stdcall
     26 #endif
     27 #endif
     28 
     29 #define CD_ERR_V1			0x00000001
     30 
     31 #define ID_ERR_V1			0x00000001
     32 
     33 #define USBD_KEEP_DEVICE_DATA		0x00000001
     34 #define USBD_MARK_DEVICE_BUSY		0x00000002
     35 
     36 #define USB_IDLE_NOT_READY		0
     37 #define USB_IDLE_READY			1
     38 
     39 typedef
     40 NTSTATUS
     41 USB_BUSIFFN
     42 USB_BUSIFFN_CREATE_USB_DEVICE (
     43   IN PVOID BusContext,
     44   OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
     45   IN PUSB_DEVICE_HANDLE HubDeviceHandle,
     46   IN USHORT PortStatus,
     47   IN USHORT PortNumber);
     48 
     49 typedef USB_BUSIFFN_CREATE_USB_DEVICE *PUSB_BUSIFFN_CREATE_USB_DEVICE;
     50 
     51 typedef enum _USBPORT_CREATEDEV_ERROR {
     52   CreateDevErrNotSet = 0,
     53   CreateDevBadHubDevHandle,
     54   CreateDevFailedAllocDevHandle,
     55   CreateDevFailedOpenEndpoint,
     56   CreateDevFailedAllocDsBuff,
     57   CreateDevFailedGetDs,
     58   CreateDevTtNotFound,
     59   CreateDevBadDevHandlePtr
     60 } USBPORT_CREATEDEV_ERROR;
     61 
     62 typedef struct _USB_CD_ERROR_INFORMATION {
     63   ULONG Version;
     64   USBPORT_CREATEDEV_ERROR PathError;
     65   ULONG UlongArg1;
     66   ULONG UlongArg2;
     67   NTSTATUS NtStatus;
     68   UCHAR XtraInfo[64];
     69 } USB_CD_ERROR_INFORMATION, *PUSB_CD_ERROR_INFORMATION;
     70 
     71 typedef
     72 NTSTATUS
     73 USB_BUSIFFN
     74 USB_BUSIFFN_CREATE_USB_DEVICE_EX (
     75   IN PVOID  BusContext,
     76   OUT PUSB_DEVICE_HANDLE  *NewDeviceHandle,
     77   IN PUSB_DEVICE_HANDLE  HsHubDeviceHandle,
     78   IN USHORT  PortStatus,
     79   IN USHORT  PortNumber,
     80   OUT PUSB_CD_ERROR_INFORMATION  CdErrorInfo,
     81   IN USHORT TtPortNumber);
     82 
     83 typedef USB_BUSIFFN_CREATE_USB_DEVICE_EX *PUSB_BUSIFFN_CREATE_USB_DEVICE_EX;
     84 
     85 typedef struct _USB_PORT_PATH {
     86   ULONG  PortPathDepth;
     87   ULONG  PortPath[6];
     88 } USB_PORT_PATH, *PUSB_PORT_PATH;
     89 
     90 typedef
     91 NTSTATUS
     92 USB_BUSIFFN
     93 USB_BUSIFFN_CREATE_USB_DEVICE_V7 (
     94   IN PVOID  BusContext,
     95   OUT PUSB_DEVICE_HANDLE  *NewDeviceHandle,
     96   IN PUSB_DEVICE_HANDLE  HsHubDeviceHandle,
     97   IN USHORT  PortStatus,
     98   IN PUSB_PORT_PATH  PortPath,
     99   OUT PUSB_CD_ERROR_INFORMATION  CdErrorInfo,
    100   IN USHORT  TtPortNumber,
    101   IN PDEVICE_OBJECT  PdoDeviceObject,
    102   IN PUNICODE_STRING  PhysicalDeviceObjectName);
    103 
    104 typedef USB_BUSIFFN_CREATE_USB_DEVICE_V7 *PUSB_BUSIFFN_CREATE_USB_DEVICE_V7;
    105 
    106 typedef enum _USBPORT_INITDEV_ERROR {
    107   InitDevErrNotSet = 0,
    108   InitDevFailedSetAddress,
    109   InitDevFailedPokeEndpoint,
    110   InitDevBadDeviceDescriptor
    111 } USBPORT_INITDEV_ERROR;
    112 
    113 typedef struct _USB_ID_ERROR_INFORMATION {
    114   ULONG Version;
    115   USBPORT_INITDEV_ERROR PathError;
    116   ULONG Arg1;
    117   ULONG UsbAddress;
    118   NTSTATUS NtStatus;
    119   USBD_STATUS UsbdStatus;
    120   UCHAR XtraInfo[64];
    121 } USB_ID_ERROR_INFORMATION, *PUSB_ID_ERROR_INFORMATION;
    122 
    123 typedef
    124 NTSTATUS
    125 USB_BUSIFFN
    126 USB_BUSIFFN_INITIALIZE_USB_DEVICE (
    127   IN PVOID  BusContext,
    128   IN OUT PUSB_DEVICE_HANDLE  DeviceHandle);
    129 
    130 typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE;
    131 
    132 typedef
    133 NTSTATUS
    134 USB_BUSIFFN
    135 USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX (
    136   IN PVOID  BusContext,
    137   IN OUT PUSB_DEVICE_HANDLE  DeviceHandle,
    138   OUT PUSB_ID_ERROR_INFORMATION  IdErrInfo);
    139 
    140 typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX;
    141 
    142 typedef
    143 NTSTATUS
    144 USB_BUSIFFN
    145 USB_BUSIFFN_REMOVE_USB_DEVICE (
    146   IN PVOID  BusContext,
    147   IN OUT PUSB_DEVICE_HANDLE  DeviceHandle,
    148   IN ULONG  Flags);
    149 
    150 typedef USB_BUSIFFN_REMOVE_USB_DEVICE *PUSB_BUSIFFN_REMOVE_USB_DEVICE;
    151 
    152 typedef
    153 NTSTATUS
    154 USB_BUSIFFN
    155 USB_BUSIFFN_GET_USB_DESCRIPTORS (
    156   IN PVOID BusContext,
    157   IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
    158   OUT PUCHAR DeviceDescriptorBuffer,
    159   IN OUT PULONG DeviceDescriptorBufferLength,
    160   OUT PUCHAR ConfigDescriptorBuffer,
    161   IN OUT PULONG ConfigDescriptorBufferLength);
    162 
    163 typedef USB_BUSIFFN_GET_USB_DESCRIPTORS *PUSB_BUSIFFN_GET_USB_DESCRIPTORS;
    164 
    165 typedef
    166 NTSTATUS
    167 USB_BUSIFFN
    168 USB_BUSIFFN_RESTORE_DEVICE (
    169   IN PVOID BusContext,
    170   IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle,
    171   IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle);
    172 
    173 typedef USB_BUSIFFN_RESTORE_DEVICE *PUSB_BUSIFFN_RESTORE_DEVICE;
    174 
    175 typedef
    176 NTSTATUS
    177 USB_BUSIFFN
    178 USB_BUSIFFN_GET_POTRTHACK_FLAGS (
    179   IN PVOID BusContext,
    180   IN OUT PULONG Flags);
    181 
    182 typedef USB_BUSIFFN_GET_POTRTHACK_FLAGS *PUSB_BUSIFFN_GET_POTRTHACK_FLAGS;
    183 
    184 typedef
    185 NTSTATUS
    186 USB_BUSIFFN
    187 USB_BUSIFFN_GET_DEVICE_INFORMATION (
    188   IN PVOID BusContext,
    189   IN PUSB_DEVICE_HANDLE DeviceHandle,
    190   OUT PVOID DeviceInformationBuffer,
    191   IN ULONG DeviceInformationBufferLength,
    192   IN OUT PULONG LengthOfDataCopied);
    193 
    194 typedef USB_BUSIFFN_GET_DEVICE_INFORMATION *PUSB_BUSIFFN_GET_DEVICE_INFORMATION;
    195 
    196 typedef
    197 NTSTATUS
    198 USB_BUSIFFN
    199 USB_BUSIFFN_GET_CONTROLLER_INFORMATION (
    200   IN PVOID BusContext,
    201   IN OUT PVOID ControllerInformationBuffer,
    202   IN ULONG ControllerInformationBufferLength,
    203   IN OUT PULONG LengthOfDataCopied);
    204 
    205 typedef USB_BUSIFFN_GET_CONTROLLER_INFORMATION *PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION;
    206 
    207 typedef
    208 NTSTATUS
    209 USB_BUSIFFN
    210 USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND (
    211   IN PVOID BusContext,
    212   IN BOOLEAN Enable);
    213 
    214 typedef USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND *PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND;
    215 
    216 typedef
    217 NTSTATUS
    218 USB_BUSIFFN
    219 USB_BUSIFFN_GET_EXTENDED_HUB_INFO (
    220   IN PVOID BusContext,
    221   IN PDEVICE_OBJECT HubPhysicalDeviceObject,
    222   IN PVOID HubInformationBuffer,
    223   IN ULONG HubInformationBufferLength,
    224   OUT PULONG LengthOfDataCopied);
    225 
    226 typedef USB_BUSIFFN_GET_EXTENDED_HUB_INFO *PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO;
    227 
    228 typedef
    229 NTSTATUS
    230 USB_BUSIFFN
    231 USB_BUSIFFN_GET_ROOTHUB_SYM_NAME (
    232   IN PVOID BusContext,
    233   IN PVOID HubSymNameBuffer,
    234   IN ULONG HubSymNameBufferLength,
    235   OUT PULONG HubSymNameActualLength);
    236 
    237 typedef USB_BUSIFFN_GET_ROOTHUB_SYM_NAME *PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME;
    238 
    239 typedef
    240 PVOID
    241 USB_BUSIFFN
    242 USB_BUSIFFN_GET_DEVICE_BUSCONTEXT (
    243   IN PVOID HubBusContext,
    244   IN PVOID DeviceHandle);
    245 
    246 typedef USB_BUSIFFN_GET_DEVICE_BUSCONTEXT *PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT;
    247 
    248 typedef
    249 NTSTATUS
    250 USB_BUSIFFN
    251 USB_BUSIFFN_INITIALIZE_20HUB (
    252   IN PVOID BusContext,
    253   IN PUSB_DEVICE_HANDLE HubDeviceHandle,
    254   IN ULONG TtCount);
    255 
    256 typedef USB_BUSIFFN_INITIALIZE_20HUB *PUSB_BUSIFFN_INITIALIZE_20HUB;
    257 
    258 typedef
    259 BOOLEAN
    260 USB_BUSIFFN
    261 USB_BUSIFFN_IS_ROOT (
    262   IN PVOID BusContext,
    263   IN PVOID DeviceObject);
    264 
    265 typedef USB_BUSIFFN_IS_ROOT *PUSB_BUSIFFN_IS_ROOT;
    266 
    267 typedef
    268 VOID
    269 USB_BUSIFFN
    270 USB_BUSIFFN_ACQUIRE_SEMAPHORE (
    271   IN PVOID BusContext);
    272 
    273 typedef USB_BUSIFFN_ACQUIRE_SEMAPHORE *PUSB_BUSIFFN_ACQUIRE_SEMAPHORE;
    274 
    275 typedef
    276 VOID
    277 USB_BUSIFFN
    278 USB_BUSIFFN_RELEASE_SEMAPHORE (
    279   IN PVOID BusContext);
    280 
    281 typedef USB_BUSIFFN_RELEASE_SEMAPHORE *PUSB_BUSIFFN_RELEASE_SEMAPHORE;
    282 
    283 typedef
    284 VOID
    285 __stdcall
    286 RH_INIT_CALLBACK (
    287   IN PVOID CallBackContext);
    288 
    289 typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK;
    290 
    291 typedef
    292 NTSTATUS
    293 USB_BUSIFFN
    294 USB_BUSIFFN_ROOTHUB_INIT_NOTIFY (
    295   IN PVOID BusContext,
    296   IN PVOID CallbackContext,
    297   IN PRH_INIT_CALLBACK CallbackRoutine);
    298 
    299 typedef USB_BUSIFFN_ROOTHUB_INIT_NOTIFY *PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY;
    300 
    301 typedef
    302 VOID
    303 USB_BUSIFFN
    304 USB_BUSIFFN_FLUSH_TRANSFERS (
    305   IN PVOID BusContext,
    306   IN PVOID DeviceHandle);
    307 
    308 typedef USB_BUSIFFN_FLUSH_TRANSFERS *PUSB_BUSIFFN_FLUSH_TRANSFERS;
    309 
    310 typedef
    311 ULONG
    312 USB_BUSIFFN
    313 USB_BUSIFFN_CALC_PIPE_BANDWIDTH (
    314   IN PVOID BusContext,
    315   IN PUSBD_PIPE_INFORMATION PipeInfo,
    316   IN USB_DEVICE_SPEED DeviceSpeed);
    317 
    318 typedef USB_BUSIFFN_CALC_PIPE_BANDWIDTH *PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH;
    319 
    320 typedef
    321 VOID
    322 USB_BUSIFFN
    323 USB_BUSIFFN_SET_BUS_WAKE_MODE (
    324   IN PVOID BusContext,
    325   IN ULONG Mode);
    326 
    327 typedef USB_BUSIFFN_SET_BUS_WAKE_MODE *PUSB_BUSIFFN_SET_BUS_WAKE_MODE;
    328 
    329 typedef
    330 VOID
    331 USB_BUSIFFN
    332 USB_BUSIFFN_SET_DEVICE_FLAG (
    333   IN PVOID BusContext,
    334   IN GUID *DeviceFlagGuid,
    335   IN PVOID ValueData,
    336   IN ULONG ValueLength);
    337 
    338 typedef USB_BUSIFFN_SET_DEVICE_FLAG *PUSB_BUSIFFN_SET_DEVICE_FLAG;
    339 
    340 typedef
    341 VOID
    342 USB_BUSIFFN
    343 USB_BUSIFFN_SET_DEVHANDLE_DATA (
    344   IN PVOID BusContext,
    345   IN PVOID DeviceHandle,
    346   IN PDEVICE_OBJECT UsbDevicePdo);
    347 
    348 typedef USB_BUSIFFN_SET_DEVHANDLE_DATA *PUSB_BUSIFFN_SET_DEVHANDLE_DATA;
    349 
    350 typedef
    351 NTSTATUS
    352 USB_BUSIFFN
    353 USB_BUSIFFN_TEST_POINT (
    354   IN PVOID BusContext,
    355   IN PVOID DeviceHandle,
    356   IN ULONG Opcode,
    357   IN PVOID TestData);
    358 
    359 typedef USB_BUSIFFN_TEST_POINT *PUSB_BUSIFFN_TEST_POINT;
    360 
    361 typedef
    362 NTSTATUS
    363 USB_BUSIFFN
    364 USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO (
    365   IN PVOID BusContext,
    366   IN PUSB_DEVICE_HANDLE DeviceHandle,
    367   OUT PVOID DeviceInformationBuffer,
    368   IN ULONG DeviceInformationBufferLength,
    369   IN OUT PULONG LengthOfDataCopied);
    370 
    371 typedef USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO *PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO;
    372 
    373 typedef
    374 NTSTATUS
    375 USB_BUSIFFN
    376 USB_BUSIFFN_WAIT_ASYNC_POWERUP (
    377   IN PVOID BusContext);
    378 
    379 typedef USB_BUSIFFN_WAIT_ASYNC_POWERUP *PUSB_BUSIFFN_WAIT_ASYNC_POWERUP;
    380 
    381 typedef
    382 NTSTATUS
    383 USB_BUSIFFN
    384 USB_BUSIFFN_GET_DEVICE_ADDRESS (
    385   IN PVOID BusContext,
    386   IN PUSB_DEVICE_HANDLE DeviceHandle,
    387   OUT PUSHORT DeviceAddress);
    388 
    389 typedef USB_BUSIFFN_GET_DEVICE_ADDRESS *PUSB_BUSIFFN_GET_DEVICE_ADDRESS;
    390 
    391 typedef
    392 VOID
    393 USB_BUSIFFN
    394 USB_BUSIFFN_DEREF_DEVICE_HANDLE (
    395   IN PVOID BusContext,
    396   IN PUSB_DEVICE_HANDLE DeviceHandle,
    397   IN PVOID Object,
    398   IN ULONG Tag);
    399 
    400 typedef USB_BUSIFFN_DEREF_DEVICE_HANDLE *PUSB_BUSIFFN_DEREF_DEVICE_HANDLE;
    401 
    402 typedef
    403 NTSTATUS
    404 USB_BUSIFFN
    405 USB_BUSIFFN_REF_DEVICE_HANDLE (
    406   IN PVOID BusContext,
    407   IN PUSB_DEVICE_HANDLE DeviceHandle,
    408   IN PVOID Object,
    409   IN ULONG Tag);
    410 
    411 typedef USB_BUSIFFN_REF_DEVICE_HANDLE *PUSB_BUSIFFN_REF_DEVICE_HANDLE;
    412 
    413 typedef
    414 ULONG
    415 USB_BUSIFFN
    416 USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE (
    417   IN PVOID BusContext,
    418   IN PUSB_DEVICE_HANDLE DeviceHandle,
    419   IN ULONG NewIdleReadyState);
    420 
    421 typedef USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE *PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE;
    422 
    423 typedef
    424 NTSTATUS
    425 USB_BUSIFFN
    426 USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT (
    427   IN PVOID BusContext,
    428   IN USHORT PortNumber,
    429   OUT LPGUID ContainerId);
    430 
    431 typedef USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT;
    432 
    433 typedef
    434 VOID
    435 USB_BUSIFFN
    436 USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT (
    437   IN PVOID BusContext,
    438   IN USHORT PortNumber,
    439   IN LPGUID ContainerId);
    440 
    441 typedef USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT;
    442 
    443 typedef
    444 NTSTATUS
    445 USB_BUSIFFN
    446 USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES (
    447   IN PVOID BusContext,
    448   IN PUSB_DEVICE_HANDLE DeviceHandle);
    449 
    450 typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES;
    451 
    452 #define ERRATA_FLAG_RESET_TT_ON_CANCEL			1
    453 #define ERRATA_FLAG_NO_CLEAR_TT_BUFFER_ON_CANCEL	2
    454 
    455 #define USB_BUSIF_HUB_VERSION_0		0x0000
    456 #define USB_BUSIF_HUB_VERSION_1		0x0001
    457 #define USB_BUSIF_HUB_VERSION_2		0x0002
    458 #define USB_BUSIF_HUB_VERSION_3		0x0003
    459 #define USB_BUSIF_HUB_VERSION_4		0x0004
    460 #define USB_BUSIF_HUB_VERSION_5		0x0005
    461 #define USB_BUSIF_HUB_VERSION_6		0x0006
    462 #define USB_BUSIF_HUB_VERSION_7		0x0007
    463 
    464 #define USB_BUSIF_HUB_MIDUMP_VERSION_0	0x0000
    465 
    466 #define USB_BUSIF_HUB_SS_VERSION_0	0x0000
    467 
    468 typedef
    469 VOID
    470 USB_BUSIFFN
    471 USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG (
    472   IN PVOID BusContext,
    473   IN PUSB_DEVICE_HANDLE DeviceHandle,
    474   IN ULONG DeviceErrataFlag);
    475 
    476 typedef USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG *PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG;
    477 
    478 DEFINE_GUID(USB_BUS_INTERFACE_HUB_GUID,
    479 0xb2bb8c0a, 0x5ab4, 0x11d3, 0xa8, 0xcd, 0x0, 0xc0, 0x4f, 0x68, 0x74, 0x7a);
    480 
    481 typedef struct _USB_BUS_INTERFACE_HUB_V0 {
    482   USHORT Size;
    483   USHORT Version;
    484   PVOID BusContext;
    485   PINTERFACE_REFERENCE InterfaceReference;
    486   PINTERFACE_DEREFERENCE InterfaceDereference;
    487 } USB_BUS_INTERFACE_HUB_V0, *PUSB_BUS_INTERFACE_HUB_V0;
    488 
    489 typedef struct _USB_BUS_INTERFACE_HUB_V1 {
    490   USHORT Size;
    491   USHORT Version;
    492   PVOID BusContext;
    493   PINTERFACE_REFERENCE InterfaceReference;
    494   PINTERFACE_DEREFERENCE InterfaceDereference;
    495   PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
    496   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
    497   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    498   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    499   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    500   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    501   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    502 } USB_BUS_INTERFACE_HUB_V1, *PUSB_BUS_INTERFACE_HUB_V1;
    503 
    504 typedef struct _USB_BUS_INTERFACE_HUB_V2 {
    505   USHORT Size;
    506   USHORT Version;
    507   PVOID BusContext;
    508   PINTERFACE_REFERENCE InterfaceReference;
    509   PINTERFACE_DEREFERENCE InterfaceDereference;
    510   PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
    511   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
    512   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    513   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    514   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    515   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    516   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    517   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    518   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    519   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    520   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    521   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    522   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    523 } USB_BUS_INTERFACE_HUB_V2, *PUSB_BUS_INTERFACE_HUB_V2;
    524 
    525 typedef struct _USB_BUS_INTERFACE_HUB_V3 {
    526   USHORT Size;
    527   USHORT Version;
    528   PVOID BusContext;
    529   PINTERFACE_REFERENCE InterfaceReference;
    530   PINTERFACE_DEREFERENCE InterfaceDereference;
    531   PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
    532   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
    533   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    534   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    535   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    536   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    537   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    538   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    539   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    540   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    541   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    542   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    543   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    544   PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
    545 } USB_BUS_INTERFACE_HUB_V3, *PUSB_BUS_INTERFACE_HUB_V3;
    546 
    547 typedef struct _USB_BUS_INTERFACE_HUB_V4 {
    548   USHORT Size;
    549   USHORT Version;
    550   PVOID BusContext;
    551   PINTERFACE_REFERENCE InterfaceReference;
    552   PINTERFACE_DEREFERENCE InterfaceDereference;
    553   PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
    554   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
    555   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    556   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    557   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    558   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    559   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    560   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    561   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    562   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    563   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    564   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    565   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    566   PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
    567   PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
    568 } USB_BUS_INTERFACE_HUB_V4, *PUSB_BUS_INTERFACE_HUB_V4;
    569 
    570 typedef struct _USB_BUS_INTERFACE_HUB_V5 {
    571   USHORT Size;
    572   USHORT Version;
    573   PVOID BusContext;
    574   PINTERFACE_REFERENCE InterfaceReference;
    575   PINTERFACE_DEREFERENCE InterfaceDereference;
    576   PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
    577   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
    578   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    579   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    580   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    581   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    582   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    583   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    584   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    585   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    586   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    587   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    588   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    589   PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
    590   PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
    591   PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
    592 } USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5;
    593 
    594 typedef struct _USB_BUS_INTERFACE_HUB_V6 {
    595   USHORT Size;
    596   USHORT Version;
    597   PVOID BusContext;
    598   PINTERFACE_REFERENCE InterfaceReference;
    599   PINTERFACE_DEREFERENCE InterfaceDereference;
    600   PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice;
    601   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice;
    602   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    603   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    604   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    605   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    606   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    607   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    608   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    609   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    610   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    611   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    612   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    613   PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
    614   PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
    615   PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
    616   PUSB_BUSIFFN_IS_ROOT HubIsRoot;
    617   PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore;
    618   PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore;
    619   PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth;
    620   PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode;
    621   PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag;
    622   PUSB_BUSIFFN_TEST_POINT HubTestPoint;
    623   PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo;
    624   PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp;
    625   PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress;
    626   PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle;
    627   PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle;
    628   PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState;
    629 } USB_BUS_INTERFACE_HUB_V6, *PUSB_BUS_INTERFACE_HUB_V6;
    630 
    631 typedef struct _USB_BUS_INTERFACE_HUB_V7 {
    632   USHORT Size;
    633   USHORT Version;
    634   PVOID BusContext;
    635   PINTERFACE_REFERENCE InterfaceReference;
    636   PINTERFACE_DEREFERENCE InterfaceDereference;
    637   PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice;
    638   PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice;
    639   PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
    640   PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
    641   PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
    642   PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
    643   PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
    644   PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
    645   PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
    646   PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
    647   PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
    648   PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
    649   PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
    650   PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
    651   PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
    652   PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
    653   PUSB_BUSIFFN_IS_ROOT HubIsRoot;
    654   PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore;
    655   PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore;
    656   PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth;
    657   PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode;
    658   PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag;
    659   PUSB_BUSIFFN_TEST_POINT HubTestPoint;
    660   PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo;
    661   PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp;
    662   PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress;
    663   PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle;
    664   PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle;
    665   PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState;
    666   PUSB_BUSIFFN_CREATE_USB_DEVICE_V7 CreateUsbDeviceV7;
    667   PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT GetContainerIdForPort;
    668   PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT SetContainerIdForPort;
    669   PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES AbortAllDevicePipes;
    670   PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG SetDeviceErrataFlag;
    671 } USB_BUS_INTERFACE_HUB_V7, *PUSB_BUS_INTERFACE_HUB_V7;
    672 
    673 DEFINE_GUID(USB_BUS_INTERFACE_HUB_MINIDUMP_GUID,
    674 	0xc5485f21, 0x4e81, 0x4a23, 0xa8, 0xf9, 0xd8, 0x51, 0x8a, 0xf4, 0x5c, 0x38);
    675 
    676 typedef VOID
    677 (USB_BUSIFFN *PUSB_BUSIFFN_SET_MINIDUMP_FLAGS) (
    678   IN PVOID);
    679 
    680 typedef struct _USB_BUS_INTERFACE_HUB_MINIDUMP {
    681   USHORT Size;
    682   USHORT Version;
    683   PVOID BusContext;
    684   PINTERFACE_REFERENCE InterfaceReference;
    685   PINTERFACE_DEREFERENCE InterfaceDereference;
    686   PUSB_BUSIFFN_SET_MINIDUMP_FLAGS SetUsbPortMiniDumpFlags;
    687 } USB_BUS_INTERFACE_HUB_MINIDUMP, *PUSB_BUS_INTERFACE_HUB_MINIDUMP;
    688 
    689 DEFINE_GUID(USB_BUS_INTERFACE_HUB_SS_GUID,
    690 	0xbfc3f363, 0x8ba1, 0x4c7b, 0x97, 0xba, 0x9b, 0x12, 0xb1, 0xca, 0x13, 0x2f);
    691 
    692 typedef NTSTATUS
    693 (USB_BUSIFFN *PUSB_BUSIFFN_SUSPEND_HUB) (
    694   PDEVICE_OBJECT Pdo);
    695 
    696 typedef NTSTATUS
    697 (USB_BUSIFFN *PUSB_BUSIFFN_RESUME_HUB) (
    698   PDEVICE_OBJECT Pdo);
    699 
    700 typedef struct _USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND {
    701   USHORT Size;
    702   USHORT Version;
    703   PVOID  BusContext;
    704   PINTERFACE_REFERENCE  InterfaceReference;
    705   PINTERFACE_DEREFERENCE  InterfaceDereference;
    706   PUSB_BUSIFFN_SUSPEND_HUB  SuspendHub;
    707   PUSB_BUSIFFN_RESUME_HUB  ResumeHub;
    708 } USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND, *PUSB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND;
    709 
    710 #include <pshpack1.h>
    711 
    712 typedef struct _USB_PIPE_INFORMATION_0 {
    713   USB_ENDPOINT_DESCRIPTOR  EndpointDescriptor;
    714   UCHAR  ED_Pad[1];
    715   ULONG  ScheduleOffset;
    716 } USB_PIPE_INFORMATION_0, *PUSB_PIPE_INFORMATION_0;
    717 
    718 typedef struct _USB_LEVEL_INFORMATION {
    719   ULONG  InformationLevel;
    720   ULONG  ActualLength;
    721 } USB_LEVEL_INFORMATION, *PUSB_LEVEL_INFORMATION;
    722 
    723 typedef struct _USB_DEVICE_INFORMATION_0 {
    724   ULONG  InformationLevel;
    725   ULONG  ActualLength;
    726   ULONG  PortNumber;
    727   USB_DEVICE_DESCRIPTOR  DeviceDescriptor;
    728   UCHAR  DD_pad[2];
    729   UCHAR  CurrentConfigurationValue;
    730   UCHAR  ReservedMBZ;
    731   USHORT DeviceAddress;
    732   ULONG  HubAddress;
    733   USB_DEVICE_SPEED  DeviceSpeed;
    734   USB_DEVICE_TYPE  DeviceType;
    735   ULONG  NumberOfOpenPipes;
    736   USB_PIPE_INFORMATION_0  PipeList[1];
    737 } USB_DEVICE_INFORMATION_0, *PUSB_DEVICE_INFORMATION_0;
    738 
    739 typedef struct _USB_CONTROLLER_INFORMATION_0 {
    740   ULONG  InformationLevel;
    741   ULONG  ActualLength;
    742   BOOLEAN SelectiveSuspendEnabled;
    743   BOOLEAN IsHighSpeedController;
    744 } USB_CONTROLLER_INFORMATION_0, *PUSB_CONTROLLER_INFORMATION_0;
    745 
    746 typedef struct _USB_CONTROLLER_INFORMATION_1 {
    747   ULONG  InformationLevel;
    748   ULONG  ActualLength;
    749   BOOLEAN SelectiveSuspendEnabled;
    750   BOOLEAN IsHighSpeedController;
    751   ULONG  HcBusNumber;
    752   ULONG  HcBusDevice;
    753   ULONG  HcBusFunction;
    754 } USB_CONTROLLER_INFORMATION_1, *PUSB_CONTROLLER_INFORMATION_1;
    755 
    756 typedef struct _USB_EXTPORT_INFORMATION_0 {
    757   ULONG  PhysicalPortNumber;
    758   ULONG  PortLabelNumber;
    759   USHORT VidOverride;
    760   USHORT PidOverride;
    761   ULONG  PortAttributes;
    762 } USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION;
    763 
    764 typedef struct _USB_EXTHUB_INFORMATION_0 {
    765   ULONG  InformationLevel;
    766   ULONG  NumberOfPorts;
    767   USB_EXTPORT_INFORMATION_0  Port[255];
    768 } USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0;
    769 
    770 typedef struct _USB_DEVICE_PERFORMANCE_INFO_0 {
    771   ULONG  InformationLevel;
    772   ULONG  ActualLength;
    773   ULONG  BulkBytes;
    774   ULONG  BulkUrbCount;
    775   ULONG  ControlDataBytes;
    776   ULONG  ControlUrbCount;
    777   ULONG  IsoBytes;
    778   ULONG  IsoUrbCount;
    779   ULONG  InterruptBytes;
    780   ULONG  InterruptUrbCount;
    781   ULONG  AllocedInterrupt[6];
    782   ULONG  AllocedIso;
    783   ULONG  Total32secBandwidth;
    784   ULONG  TotalTtBandwidth;
    785   ULONG  TotalIsoLatency;
    786   ULONG  DroppedIsoPackets;
    787   ULONG  TransferErrors;
    788 } USB_DEVICE_PERFORMANCE_INFO_0, *PUSB_DEVICE_PERFORMANCE_INFO_0;
    789 
    790 #include <poppack.h>
    791 
    792 #endif /* NTDDI_VERSION >= NTDDI_WINXP */
    793 
    794