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