Home | History | Annotate | Download | only in include
      1 /*
      2  * usbuser.h
      3  *
      4  * USB user mode 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 #ifdef __cplusplus
     26 extern "C" {
     27 #endif
     28 
     29 #if (_WIN32_WINNT >= 0x0501)
     30 
     31 #include "usbiodef.h"
     32 
     33 #include <pshpack1.h>
     34 
     35 #define USBUSER_VERSION                   0x0004
     36 
     37 #define IOCTL_USB_USER_REQUEST            USB_CTL(HCD_USER_REQUEST)
     38 
     39 #ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON
     40 #define IOCTL_USB_DIAGNOSTIC_MODE_ON      USB_CTL(HCD_DIAGNOSTIC_MODE_ON)
     41 #endif
     42 #ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF
     43 #define IOCTL_USB_DIAGNOSTIC_MODE_OFF     USB_CTL(HCD_DIAGNOSTIC_MODE_OFF)
     44 #endif
     45 
     46 #ifndef IOCTL_USB_GET_ROOT_HUB_NAME
     47 #define IOCTL_USB_GET_ROOT_HUB_NAME       USB_CTL(HCD_GET_ROOT_HUB_NAME)
     48 #endif
     49 #ifndef IOCTL_GET_HCD_DRIVERKEY_NAME
     50 #define IOCTL_GET_HCD_DRIVERKEY_NAME      USB_CTL(HCD_GET_DRIVERKEY_NAME)
     51 #endif
     52 
     53 typedef enum _USB_USER_ERROR_CODE {
     54   UsbUserSuccess = 0,
     55   UsbUserNotSupported,
     56   UsbUserInvalidRequestCode,
     57   UsbUserFeatureDisabled,
     58   UsbUserInvalidHeaderParameter,
     59   UsbUserInvalidParameter,
     60   UsbUserMiniportError,
     61   UsbUserBufferTooSmall,
     62   UsbUserErrorNotMapped,
     63   UsbUserDeviceNotStarted,
     64   UsbUserNoDeviceConnected
     65 } USB_USER_ERROR_CODE;
     66 
     67 #define USBUSER_GET_CONTROLLER_INFO_0     0x00000001
     68 #define USBUSER_GET_CONTROLLER_DRIVER_KEY 0x00000002
     69 #define USBUSER_PASS_THRU                 0x00000003
     70 #define USBUSER_GET_POWER_STATE_MAP       0x00000004
     71 #define USBUSER_GET_BANDWIDTH_INFORMATION 0x00000005
     72 #define USBUSER_GET_BUS_STATISTICS_0      0x00000006
     73 #define USBUSER_GET_ROOTHUB_SYMBOLIC_NAME 0x00000007
     74 #define USBUSER_GET_USB_DRIVER_VERSION    0x00000008
     75 #define USBUSER_GET_USB2_HW_VERSION       0x00000009
     76 #define USBUSER_USB_REFRESH_HCT_REG       0x0000000a
     77 
     78 #define USBUSER_OP_SEND_ONE_PACKET        0x10000001
     79 #define USBUSER_OP_RAW_RESET_PORT         0x20000001
     80 #define USBUSER_OP_OPEN_RAW_DEVICE        0x20000002
     81 #define USBUSER_OP_CLOSE_RAW_DEVICE       0x20000003
     82 #define USBUSER_OP_SEND_RAW_COMMAND       0x20000004
     83 #define USBUSER_SET_ROOTPORT_FEATURE      0x20000005
     84 #define USBUSER_CLEAR_ROOTPORT_FEATURE    0x20000006
     85 #define USBUSER_GET_ROOTPORT_STATUS       0x20000007
     86 
     87 #define USBUSER_INVALID_REQUEST           0xFFFFFFF0
     88 #define USBUSER_OP_MASK_DEVONLY_API       0x10000000
     89 #define USBUSER_OP_MASK_HCTEST_API        0x20000000
     90 
     91 #define USB_PACKETFLAG_LOW_SPEED          0x00000001
     92 #define USB_PACKETFLAG_FULL_SPEED         0x00000002
     93 #define USB_PACKETFLAG_HIGH_SPEED         0x00000004
     94 #define USB_PACKETFLAG_ASYNC_IN           0x00000008
     95 #define USB_PACKETFLAG_ASYNC_OUT          0x00000010
     96 #define USB_PACKETFLAG_ISO_IN             0x00000020
     97 #define USB_PACKETFLAG_ISO_OUT            0x00000040
     98 #define USB_PACKETFLAG_SETUP              0x00000080
     99 #define USB_PACKETFLAG_TOGGLE0            0x00000100
    100 #define USB_PACKETFLAG_TOGGLE1            0x00000200
    101 
    102 /* USB_CONTROLLER_INFO_0.HcFeatureFlags constants */
    103 #define USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING  0x00000001
    104 #define USB_HC_FEATURE_FLAG_SEL_SUSPEND           0x00000002
    105 #define USB_HC_FEATURE_LEGACY_BIOS                0x00000004
    106 
    107 typedef struct _USBUSER_REQUEST_HEADER {
    108   ULONG UsbUserRequest;
    109   USB_USER_ERROR_CODE UsbUserStatusCode;
    110   ULONG RequestBufferLength;
    111   ULONG ActualBufferLength;
    112 } USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER;
    113 
    114 typedef struct _PACKET_PARAMETERS {
    115   UCHAR DeviceAddress;
    116   UCHAR EndpointAddress;
    117   USHORT MaximumPacketSize;
    118   ULONG Timeout;
    119   ULONG Flags;
    120   ULONG DataLength;
    121   USHORT HubDeviceAddress;
    122   USHORT PortTTNumber;
    123   UCHAR ErrorCount;
    124   UCHAR Pad[3];
    125   USBD_STATUS UsbdStatusCode;
    126   UCHAR Data[4];
    127 } PACKET_PARAMETERS, *PPACKET_PARAMETERS;
    128 
    129 typedef struct _USBUSER_SEND_ONE_PACKET {
    130   USBUSER_REQUEST_HEADER Header;
    131   PACKET_PARAMETERS PacketParameters;
    132 } USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET;
    133 
    134 typedef struct _RAW_RESET_PORT_PARAMETERS {
    135   USHORT PortNumber;
    136   USHORT PortStatus;
    137 } RAW_RESET_PORT_PARAMETERS, *PRAW_RESET_PORT_PARAMETERS;
    138 
    139 typedef struct _USBUSER_RAW_RESET_ROOT_PORT {
    140   USBUSER_REQUEST_HEADER Header;
    141   RAW_RESET_PORT_PARAMETERS Parameters;
    142 } USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT;
    143 
    144 typedef struct _RAW_ROOTPORT_FEATURE {
    145   USHORT PortNumber;
    146   USHORT PortFeature;
    147   USHORT PortStatus;
    148 } RAW_ROOTPORT_FEATURE, *PRAW_ROOTPORT_FEATURE;
    149 
    150 typedef struct _USBUSER_ROOTPORT_FEATURE_REQUEST {
    151   USBUSER_REQUEST_HEADER Header;
    152   RAW_ROOTPORT_FEATURE Parameters;
    153 } USBUSER_ROOTPORT_FEATURE_REQUEST, *PUSBUSER_ROOTPORT_FEATURE_REQUEST;
    154 
    155 typedef struct _RAW_ROOTPORT_PARAMETERS {
    156   USHORT PortNumber;
    157   USHORT PortStatus;
    158 } RAW_ROOTPORT_PARAMETERS, *PRAW_ROOTPORT_PARAMETERS;
    159 
    160 typedef struct _USBUSER_ROOTPORT_PARAMETERS {
    161   USBUSER_REQUEST_HEADER Header;
    162   RAW_ROOTPORT_PARAMETERS Parameters;
    163 } USBUSER_ROOTPORT_PARAMETERS, *PUSBUSER_ROOTPORT_PARAMETERS;
    164 
    165 typedef struct _USB_CONTROLLER_INFO_0 {
    166   ULONG PciVendorId;
    167   ULONG PciDeviceId;
    168   ULONG PciRevision;
    169   ULONG NumberOfRootPorts;
    170   USB_CONTROLLER_FLAVOR ControllerFlavor;
    171   ULONG HcFeatureFlags;
    172 } USB_CONTROLLER_INFO_0 , *PUSB_CONTROLLER_INFO_0;
    173 
    174 typedef struct _USBUSER_CONTROLLER_INFO_0 {
    175   USBUSER_REQUEST_HEADER Header;
    176   USB_CONTROLLER_INFO_0 Info0;
    177 } USBUSER_CONTROLLER_INFO_0, *PUSBUSER_CONTROLLER_INFO_0;
    178 
    179 typedef struct _USB_UNICODE_NAME {
    180   ULONG Length;
    181   WCHAR String[1];
    182 } USB_UNICODE_NAME, *PUSB_UNICODE_NAME;
    183 
    184 typedef struct _USBUSER_CONTROLLER_UNICODE_NAME {
    185   USBUSER_REQUEST_HEADER Header;
    186   USB_UNICODE_NAME UnicodeName;
    187 } USBUSER_CONTROLLER_UNICODE_NAME, *PUSBUSER_CONTROLLER_UNICODE_NAME;
    188 
    189 typedef struct _USB_PASS_THRU_PARAMETERS {
    190   GUID FunctionGUID;
    191   ULONG ParameterLength;
    192   UCHAR Parameters[4];
    193 } USB_PASS_THRU_PARAMETERS, *PUSB_PASS_THRU_PARAMETERS;
    194 
    195 typedef struct _USBUSER_PASS_THRU_REQUEST {
    196   USBUSER_REQUEST_HEADER Header;
    197   USB_PASS_THRU_PARAMETERS PassThru;
    198 } USBUSER_PASS_THRU_REQUEST, *PUSBUSER_PASS_THRU_REQUEST;
    199 
    200 typedef enum _WDMUSB_POWER_STATE {
    201   WdmUsbPowerNotMapped = 0,
    202   WdmUsbPowerSystemUnspecified = 100,
    203   WdmUsbPowerSystemWorking,
    204   WdmUsbPowerSystemSleeping1,
    205   WdmUsbPowerSystemSleeping2,
    206   WdmUsbPowerSystemSleeping3,
    207   WdmUsbPowerSystemHibernate,
    208   WdmUsbPowerSystemShutdown,
    209   WdmUsbPowerDeviceUnspecified = 200,
    210   WdmUsbPowerDeviceD0,
    211   WdmUsbPowerDeviceD1,
    212   WdmUsbPowerDeviceD2,
    213   WdmUsbPowerDeviceD3
    214 } WDMUSB_POWER_STATE;
    215 
    216 typedef struct _USB_POWER_INFO {
    217   WDMUSB_POWER_STATE SystemState;
    218   WDMUSB_POWER_STATE HcDevicePowerState;
    219   WDMUSB_POWER_STATE HcDeviceWake;
    220   WDMUSB_POWER_STATE HcSystemWake;
    221   WDMUSB_POWER_STATE RhDevicePowerState;
    222   WDMUSB_POWER_STATE RhDeviceWake;
    223   WDMUSB_POWER_STATE RhSystemWake;
    224   WDMUSB_POWER_STATE LastSystemSleepState;
    225   BOOLEAN CanWakeup;
    226   BOOLEAN IsPowered;
    227 } USB_POWER_INFO, *PUSB_POWER_INFO;
    228 
    229 typedef struct _USBUSER_POWER_INFO_REQUEST {
    230   USBUSER_REQUEST_HEADER Header;
    231   USB_POWER_INFO PowerInformation;
    232 } USBUSER_POWER_INFO_REQUEST, *PUSBUSER_POWER_INFO_REQUEST;
    233 
    234 typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS {
    235   USHORT PortStatus;
    236   USHORT MaxPacketEp0;
    237 } USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS;
    238 
    239 typedef struct _USBUSER_OPEN_RAW_DEVICE {
    240   USBUSER_REQUEST_HEADER Header;
    241   USB_OPEN_RAW_DEVICE_PARAMETERS Parameters;
    242 } USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE;
    243 
    244 typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS {
    245   ULONG xxx;
    246 } USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS;
    247 
    248 typedef struct _USBUSER_CLOSE_RAW_DEVICE {
    249   USBUSER_REQUEST_HEADER Header;
    250   USB_CLOSE_RAW_DEVICE_PARAMETERS Parameters;
    251 } USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE;
    252 
    253 typedef struct _USB_SEND_RAW_COMMAND_PARAMETERS {
    254   UCHAR Usb_bmRequest;
    255   UCHAR Usb_bRequest;
    256   USHORT Usb_wVlaue;
    257   USHORT Usb_wIndex;
    258   USHORT Usb_wLength;
    259   USHORT DeviceAddress;
    260   USHORT MaximumPacketSize;
    261   ULONG Timeout;
    262   ULONG DataLength;
    263   USBD_STATUS UsbdStatusCode;
    264   UCHAR Data[4];
    265 } USB_SEND_RAW_COMMAND_PARAMETERS, *PUSB_SEND_RAW_COMMAND_PARAMETERS;
    266 
    267 typedef struct _USBUSER_SEND_RAW_COMMAND {
    268   USBUSER_REQUEST_HEADER Header;
    269   USB_SEND_RAW_COMMAND_PARAMETERS Parameters;
    270 } USBUSER_SEND_RAW_COMMAND, *PUSBUSER_SEND_RAW_COMMAND;
    271 
    272 typedef struct _USB_BANDWIDTH_INFO {
    273   ULONG DeviceCount;
    274   ULONG TotalBusBandwidth;
    275   ULONG Total32secBandwidth;
    276   ULONG AllocedBulkAndControl;
    277   ULONG AllocedIso;
    278   ULONG AllocedInterrupt_1ms;
    279   ULONG AllocedInterrupt_2ms;
    280   ULONG AllocedInterrupt_4ms;
    281   ULONG AllocedInterrupt_8ms;
    282   ULONG AllocedInterrupt_16ms;
    283   ULONG AllocedInterrupt_32ms;
    284 } USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO;
    285 
    286 typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST {
    287   USBUSER_REQUEST_HEADER Header;
    288   USB_BANDWIDTH_INFO BandwidthInformation;
    289 } USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST;
    290 
    291 typedef struct _USB_BUS_STATISTICS_0 {
    292   ULONG DeviceCount;
    293   LARGE_INTEGER CurrentSystemTime;
    294   ULONG CurrentUsbFrame;
    295   ULONG BulkBytes;
    296   ULONG IsoBytes;
    297   ULONG InterruptBytes;
    298   ULONG ControlDataBytes;
    299   ULONG PciInterruptCount;
    300   ULONG HardResetCount;
    301   ULONG WorkerSignalCount;
    302   ULONG CommonBufferBytes;
    303   ULONG WorkerIdleTimeMs;
    304   BOOLEAN RootHubEnabled;
    305   UCHAR RootHubDevicePowerState;
    306   UCHAR Unused;
    307   UCHAR NameIndex;
    308 } USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0;
    309 
    310 typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST {
    311   USBUSER_REQUEST_HEADER Header;
    312   USB_BUS_STATISTICS_0 BusStatistics0;
    313 } USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST;
    314 
    315 typedef struct _USB_DRIVER_VERSION_PARAMETERS {
    316   ULONG DriverTrackingCode;
    317   ULONG USBDI_Version;
    318   ULONG USBUSER_Version;
    319   BOOLEAN CheckedPortDriver;
    320   BOOLEAN CheckedMiniportDriver;
    321   USHORT USB_Version;
    322 } USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS;
    323 
    324 typedef struct _USBUSER_GET_DRIVER_VERSION {
    325   USBUSER_REQUEST_HEADER Header;
    326   USB_DRIVER_VERSION_PARAMETERS Parameters;
    327 } USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION;
    328 
    329 typedef struct _USB_USB2HW_VERSION_PARAMETERS {
    330   UCHAR Usb2HwRevision;
    331 } USB_USB2HW_VERSION_PARAMETERS, *PUSB_USB2HW_VERSION_PARAMETERS;
    332 
    333 typedef struct _USBUSER_GET_USB2HW_VERSION {
    334   USBUSER_REQUEST_HEADER Header;
    335   USB_USB2HW_VERSION_PARAMETERS Parameters;
    336 } USBUSER_GET_USB2HW_VERSION, *PUSBUSER_GET_USB2HW_VERSION;
    337 
    338 typedef struct _USBUSER_REFRESH_HCT_REG {
    339   USBUSER_REQUEST_HEADER Header;
    340   ULONG Flags;
    341 } USBUSER_REFRESH_HCT_REG, *PUSBUSER_REFRESH_HCT_REG;
    342 
    343 #include <poppack.h>
    344 
    345 #endif /* _WIN32_WINNT >= 0x0501 */
    346 
    347 #ifdef __cplusplus
    348 }
    349 #endif
    350