1 // Copyright © 2016-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms.
7 //! USB Definitions.
8 use shared::minwindef::{UCHAR, ULONG, USHORT};
9 use shared::usbspec::{
10     PUSB_CONFIGURATION_DESCRIPTOR, USB_DEVICE_DESCRIPTOR, USB_ENDPOINT_DIRECTION_MASK,
11 };
12 use um::winnt::{LONG, PVOID, WCHAR};
13 pub type PRIP = PVOID;
14 pub type PMDL = PVOID;
15 pub const USBDI_VERSION: ULONG = 0x00000600;
16 pub const USB_PORTATTR_NO_CONNECTOR: ULONG = 0x00000001;
17 pub const USB_PORTATTR_SHARED_USB2: ULONG = 0x00000002;
18 pub const USB_PORTATTR_MINI_CONNECTOR: ULONG = 0x00000004;
19 pub const USB_PORTATTR_OEM_CONNECTOR: ULONG = 0x00000008;
20 pub const USB_PORTATTR_OWNED_BY_CC: ULONG = 0x01000000;
21 pub const USB_PORTATTR_NO_OVERCURRENT_UI: ULONG = 0x02000000;
22 ENUM!{enum USB_CONTROLLER_FLAVOR {
23     USB_HcGeneric = 0,
24     OHCI_Generic = 100,
25     OHCI_Hydra,
26     OHCI_NEC,
27     UHCI_Generic = 200,
28     UHCI_Piix4 = 201,
29     UHCI_Piix3 = 202,
30     UHCI_Ich2 = 203,
31     UHCI_Reserved204 = 204,
32     UHCI_Ich1 = 205,
33     UHCI_Ich3m = 206,
34     UHCI_Ich4 = 207,
35     UHCI_Ich5 = 208,
36     UHCI_Ich6 = 209,
37     UHCI_Intel = 249,
38     UHCI_VIA = 250,
39     UHCI_VIA_x01 = 251,
40     UHCI_VIA_x02 = 252,
41     UHCI_VIA_x03 = 253,
42     UHCI_VIA_x04 = 254,
43     UHCI_VIA_x0E_FIFO = 264,
44     EHCI_Generic = 1000,
45     EHCI_NEC = 2000,
46     EHCI_Lucent = 3000,
47     EHCI_NVIDIA_Tegra2 = 4000,
48     EHCI_NVIDIA_Tegra3 = 4001,
49     EHCI_Intel_Medfield = 5001,
50 }}
51 pub const USB_DEFAULT_DEVICE_ADDRESS: UCHAR = 0;
52 pub const USB_DEFAULT_ENDPOINT_ADDRESS: UCHAR = 0;
53 pub const USB_DEFAULT_MAX_PACKET: USHORT = 64;
54 pub const URB_FUNCTION_SELECT_CONFIGURATION: USHORT = 0x0000;
55 pub const URB_FUNCTION_SELECT_INTERFACE: USHORT = 0x0001;
56 pub const URB_FUNCTION_ABORT_PIPE: USHORT = 0x0002;
57 pub const URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL: USHORT = 0x0003;
58 pub const URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL: USHORT = 0x0004;
59 pub const URB_FUNCTION_GET_FRAME_LENGTH: USHORT = 0x0005;
60 pub const URB_FUNCTION_SET_FRAME_LENGTH: USHORT = 0x0006;
61 pub const URB_FUNCTION_GET_CURRENT_FRAME_NUMBER: USHORT = 0x0007;
62 pub const URB_FUNCTION_CONTROL_TRANSFER: USHORT = 0x0008;
63 pub const URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: USHORT = 0x0009;
64 pub const URB_FUNCTION_ISOCH_TRANSFER: USHORT = 0x000A;
65 pub const URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: USHORT = 0x000B;
66 pub const URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE: USHORT = 0x000C;
67 pub const URB_FUNCTION_SET_FEATURE_TO_DEVICE: USHORT = 0x000D;
68 pub const URB_FUNCTION_SET_FEATURE_TO_INTERFACE: USHORT = 0x000E;
69 pub const URB_FUNCTION_SET_FEATURE_TO_ENDPOINT: USHORT = 0x000F;
70 pub const URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE: USHORT = 0x0010;
71 pub const URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE: USHORT = 0x0011;
72 pub const URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT: USHORT = 0x0012;
73 pub const URB_FUNCTION_GET_STATUS_FROM_DEVICE: USHORT = 0x0013;
74 pub const URB_FUNCTION_GET_STATUS_FROM_INTERFACE: USHORT = 0x0014;
75 pub const URB_FUNCTION_GET_STATUS_FROM_ENDPOINT: USHORT = 0x0015;
76 pub const URB_FUNCTION_RESERVED_0X0016: USHORT = 0x0016;
77 pub const URB_FUNCTION_VENDOR_DEVICE: USHORT = 0x0017;
78 pub const URB_FUNCTION_VENDOR_INTERFACE: USHORT = 0x0018;
79 pub const URB_FUNCTION_VENDOR_ENDPOINT: USHORT = 0x0019;
80 pub const URB_FUNCTION_CLASS_DEVICE: USHORT = 0x001A;
81 pub const URB_FUNCTION_CLASS_INTERFACE: USHORT = 0x001B;
82 pub const URB_FUNCTION_CLASS_ENDPOINT: USHORT = 0x001C;
83 pub const URB_FUNCTION_RESERVE_0X001D: USHORT = 0x001D;
84 pub const URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL: USHORT = 0x001E;
85 pub const URB_FUNCTION_CLASS_OTHER: USHORT = 0x001F;
86 pub const URB_FUNCTION_VENDOR_OTHER: USHORT = 0x0020;
87 pub const URB_FUNCTION_GET_STATUS_FROM_OTHER: USHORT = 0x0021;
88 pub const URB_FUNCTION_CLEAR_FEATURE_TO_OTHER: USHORT = 0x0022;
89 pub const URB_FUNCTION_SET_FEATURE_TO_OTHER: USHORT = 0x0023;
90 pub const URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT: USHORT = 0x0024;
91 pub const URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT: USHORT = 0x0025;
92 pub const URB_FUNCTION_GET_CONFIGURATION: USHORT = 0x0026;
93 pub const URB_FUNCTION_GET_INTERFACE: USHORT = 0x0027;
94 pub const URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE: USHORT = 0x0028;
95 pub const URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE: USHORT = 0x0029;
96 pub const URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR: USHORT = 0x002A;
97 pub const URB_FUNCTION_SYNC_RESET_PIPE: USHORT = 0x0030;
98 pub const URB_FUNCTION_SYNC_CLEAR_STALL: USHORT = 0x0031;
99 pub const URB_FUNCTION_CONTROL_TRANSFER_EX: USHORT = 0x0032;
100 pub const URB_FUNCTION_RESERVE_0X0033: USHORT = 0x0033;
101 pub const URB_FUNCTION_RESERVE_0X0034: USHORT = 0x0034;
102 pub const URB_FUNCTION_OPEN_STATIC_STREAMS: USHORT = 0x0035;
103 pub const URB_FUNCTION_CLOSE_STATIC_STREAMS: USHORT = 0x0036;
104 pub const URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDL: USHORT = 0x0037;
105 pub const URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL: USHORT = 0x0038;
106 pub const URB_FUNCTION_RESERVE_0X002B: USHORT = 0x002B;
107 pub const URB_FUNCTION_RESERVE_0X002C: USHORT = 0x002C;
108 pub const URB_FUNCTION_RESERVE_0X002D: USHORT = 0x002D;
109 pub const URB_FUNCTION_RESERVE_0X002E: USHORT = 0x002E;
110 pub const URB_FUNCTION_RESERVE_0X002F: USHORT = 0x002F;
111 pub const URB_FUNCTION_RESET_PIPE: USHORT = URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL;
112 pub const USBD_SHORT_TRANSFER_OK: ULONG = 0x00000002;
113 pub const USBD_START_ISO_TRANSFER_ASAP: ULONG = 0x00000004;
114 pub const USBD_DEFAULT_PIPE_TRANSFER: ULONG = 0x00000008;
115 pub const USBD_TRANSFER_DIRECTION_OUT: ULONG = 0;
116 pub const USBD_TRANSFER_DIRECTION_IN: ULONG = 1;
117 pub const USBD_TRANSFER_DIRECTION: ULONG = USBD_TRANSFER_DIRECTION_IN;
118 #[inline]
USBD_TRANSFER_DIRECTION_FLAG(flags: ULONG) -> ULONG119 pub fn USBD_TRANSFER_DIRECTION_FLAG(flags: ULONG) -> ULONG {
120     flags & USBD_TRANSFER_DIRECTION
121 }
122 pub const VALID_TRANSFER_FLAGS_MASK: ULONG = USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION
123     | USBD_START_ISO_TRANSFER_ASAP | USBD_DEFAULT_PIPE_TRANSFER;
124 pub const USBD_ISO_START_FRAME_RANGE: ULONG = 1024;
125 pub type USBD_STATUS = LONG;
126 #[inline]
USBD_SUCCESS(Status: USBD_STATUS) -> bool127 pub fn USBD_SUCCESS(Status: USBD_STATUS) -> bool {
128     Status >= 0
129 }
130 #[inline]
USBD_PENDING(Status: ULONG) -> bool131 pub fn USBD_PENDING(Status: ULONG) -> bool {
132     (Status >> 30) == 1
133 }
134 pub const USBD_STATUS_SUCCESS: USBD_STATUS = 0x00000000;
135 pub const USBD_STATUS_PORT_OPERATION_PENDING: USBD_STATUS = 0x00000001;
136 pub const USBD_STATUS_PENDING: USBD_STATUS = 0x40000000;
137 pub const USBD_STATUS_CRC: USBD_STATUS = 0xC0000001;
138 pub const USBD_STATUS_BTSTUFF: USBD_STATUS = 0xC0000002;
139 pub const USBD_STATUS_DATA_TOGGLE_MISMATCH: USBD_STATUS = 0xC0000003;
140 pub const USBD_STATUS_STALL_PID: USBD_STATUS = 0xC0000004;
141 pub const USBD_STATUS_DEV_NOT_RESPONDING: USBD_STATUS = 0xC0000005;
142 pub const USBD_STATUS_PID_CHECK_FAILURE: USBD_STATUS = 0xC0000006;
143 pub const USBD_STATUS_UNEXPECTED_PID: USBD_STATUS = 0xC0000007;
144 pub const USBD_STATUS_DATA_OVERRUN: USBD_STATUS = 0xC0000008;
145 pub const USBD_STATUS_DATA_UNDERRUN: USBD_STATUS = 0xC0000009;
146 pub const USBD_STATUS_RESERVED1: USBD_STATUS = 0xC000000A;
147 pub const USBD_STATUS_RESERVED2: USBD_STATUS = 0xC000000B;
148 pub const USBD_STATUS_BUFFER_OVERRUN: USBD_STATUS = 0xC000000C;
149 pub const USBD_STATUS_BUFFER_UNDERRUN: USBD_STATUS = 0xC000000D;
150 pub const USBD_STATUS_NOT_ACCESSED: USBD_STATUS = 0xC000000F;
151 pub const USBD_STATUS_FIFO: USBD_STATUS = 0xC0000010;
152 pub const USBD_STATUS_XACT_ERROR: USBD_STATUS = 0xC0000011;
153 pub const USBD_STATUS_BABBLE_DETECTED: USBD_STATUS = 0xC0000012;
154 pub const USBD_STATUS_DATA_BUFFER_ERROR: USBD_STATUS = 0xC0000013;
155 pub const USBD_STATUS_NO_PING_RESPONSE: USBD_STATUS = 0xC0000014;
156 pub const USBD_STATUS_INVALID_STREAM_TYPE: USBD_STATUS = 0xC0000015;
157 pub const USBD_STATUS_INVALID_STREAM_ID: USBD_STATUS = 0xC0000016;
158 pub const USBD_STATUS_ENDPOINT_HALTED: USBD_STATUS = 0xC0000030;
159 pub const USBD_STATUS_INVALID_URB_FUNCTION: USBD_STATUS = 0x80000200;
160 pub const USBD_STATUS_INVALID_PARAMETER: USBD_STATUS = 0x80000300;
161 pub const USBD_STATUS_ERROR_BUSY: USBD_STATUS = 0x80000400;
162 pub const USBD_STATUS_INVALID_PIPE_HANDLE: USBD_STATUS = 0x80000600;
163 pub const USBD_STATUS_NO_BANDWIDTH: USBD_STATUS = 0x80000700;
164 pub const USBD_STATUS_INTERNAL_HC_ERROR: USBD_STATUS = 0x80000800;
165 pub const USBD_STATUS_ERROR_SHORT_TRANSFER: USBD_STATUS = 0x80000900;
166 pub const USBD_STATUS_BAD_START_FRAME: USBD_STATUS = 0xC0000A00;
167 pub const USBD_STATUS_ISOCH_REQUEST_FAILED: USBD_STATUS = 0xC0000B00;
168 pub const USBD_STATUS_FRAME_CONTROL_OWNED: USBD_STATUS = 0xC0000C00;
169 pub const USBD_STATUS_FRAME_CONTROL_NOT_OWNED: USBD_STATUS = 0xC0000D00;
170 pub const USBD_STATUS_NOT_SUPPORTED: USBD_STATUS = 0xC0000E00;
171 pub const USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR: USBD_STATUS = 0xC0000F00;
172 pub const USBD_STATUS_INVALID_CONFIGURATION_DESCRIPTOR: USBD_STATUS = 0xC0000F00;
173 pub const USBD_STATUS_INSUFFICIENT_RESOURCES: USBD_STATUS = 0xC0001000;
174 pub const USBD_STATUS_SET_CONFIG_FAILED: USBD_STATUS = 0xC0002000;
175 pub const USBD_STATUS_BUFFER_TOO_SMALL: USBD_STATUS = 0xC0003000;
176 pub const USBD_STATUS_INTERFACE_NOT_FOUND: USBD_STATUS = 0xC0004000;
177 pub const USBD_STATUS_INAVLID_PIPE_FLAGS: USBD_STATUS = 0xC0005000;
178 pub const USBD_STATUS_TIMEOUT: USBD_STATUS = 0xC0006000;
179 pub const USBD_STATUS_DEVICE_GONE: USBD_STATUS = 0xC0007000;
180 pub const USBD_STATUS_STATUS_NOT_MAPPED: USBD_STATUS = 0xC0008000;
181 pub const USBD_STATUS_HUB_INTERNAL_ERROR: USBD_STATUS = 0xC0009000;
182 pub const USBD_STATUS_CANCELED: USBD_STATUS = 0xC0010000;
183 pub const USBD_STATUS_ISO_NOT_ACCESSED_BY_HW: USBD_STATUS = 0xC0020000;
184 pub const USBD_STATUS_ISO_TD_ERROR: USBD_STATUS = 0xC0030000;
185 pub const USBD_STATUS_ISO_NA_LATE_USBPORT: USBD_STATUS = 0xC0040000;
186 pub const USBD_STATUS_ISO_NOT_ACCESSED_LATE: USBD_STATUS = 0xC0050000;
187 pub const USBD_STATUS_BAD_DESCRIPTOR: USBD_STATUS = 0xC0100000;
188 pub const USBD_STATUS_BAD_DESCRIPTOR_BLEN: USBD_STATUS = 0xC0100001;
189 pub const USBD_STATUS_BAD_DESCRIPTOR_TYPE: USBD_STATUS = 0xC0100002;
190 pub const USBD_STATUS_BAD_INTERFACE_DESCRIPTOR: USBD_STATUS = 0xC0100003;
191 pub const USBD_STATUS_BAD_ENDPOINT_DESCRIPTOR: USBD_STATUS = 0xC0100004;
192 pub const USBD_STATUS_BAD_INTERFACE_ASSOC_DESCRIPTOR: USBD_STATUS = 0xC0100005;
193 pub const USBD_STATUS_BAD_CONFIG_DESC_LENGTH: USBD_STATUS = 0xC0100006;
194 pub const USBD_STATUS_BAD_NUMBER_OF_INTERFACES: USBD_STATUS = 0xC0100007;
195 pub const USBD_STATUS_BAD_NUMBER_OF_ENDPOINTS: USBD_STATUS = 0xC0100008;
196 pub const USBD_STATUS_BAD_ENDPOINT_ADDRESS: USBD_STATUS = 0xC0100009;
197 pub type USBD_PIPE_HANDLE = PVOID;
198 pub type USBD_CONFIGURATION_HANDLE = PVOID;
199 pub type USBD_INTERFACE_HANDLE = PVOID;
200 pub const USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE: ULONG = 0xFFFFFFFF;
201 STRUCT!{struct USBD_VERSION_INFORMATION {
202     USBDI_Version: ULONG,
203     Supported_USB_Version: ULONG,
204 }}
205 pub type PUSBD_VERSION_INFORMATION = *mut USBD_VERSION_INFORMATION;
206 ENUM!{enum USBD_PIPE_TYPE {
207     UsbdPipeTypeControl,
208     UsbdPipeTypeIsochronous,
209     UsbdPipeTypeBulk,
210     UsbdPipeTypeInterrupt,
211 }}
212 #[inline]
USBD_PIPE_DIRECTION_IN(pipeInformation: &USBD_PIPE_INFORMATION) -> UCHAR213 pub fn USBD_PIPE_DIRECTION_IN(pipeInformation: &USBD_PIPE_INFORMATION) -> UCHAR {
214     pipeInformation.EndpointAddress & USB_ENDPOINT_DIRECTION_MASK
215 }
216 STRUCT!{struct USBD_DEVICE_INFORMATION {
217     OffsetNext: ULONG,
218     UsbdDeviceHandle: PVOID,
219     DeviceDescriptor: USB_DEVICE_DESCRIPTOR,
220 }}
221 pub type PUSBD_DEVICE_INFORMATION = *mut USBD_DEVICE_INFORMATION;
222 STRUCT!{struct USBD_PIPE_INFORMATION {
223     MaximumPacketSize: USHORT,
224     EndpointAddress: UCHAR,
225     Interval: UCHAR,
226     PipeType: USBD_PIPE_TYPE,
227     PipeHandle: USBD_PIPE_HANDLE,
228     MaximumTransferSize: ULONG,
229     PipeFlags: ULONG,
230 }}
231 pub type PUSBD_PIPE_INFORMATION = *mut USBD_PIPE_INFORMATION;
232 pub const USBD_PF_CHANGE_MAX_PACKET: ULONG = 0x00000001;
233 pub const USBD_PF_SHORT_PACKET_OPT: ULONG = 0x00000002;
234 pub const USBD_PF_ENABLE_RT_THREAD_ACCESS: ULONG = 0x00000004;
235 pub const USBD_PF_MAP_ADD_TRANSFERS: ULONG = 0x00000008;
236 pub const USBD_PF_VALID_MASK: ULONG = USBD_PF_CHANGE_MAX_PACKET | USBD_PF_SHORT_PACKET_OPT
237     | USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS;
238 STRUCT!{struct USBD_INTERFACE_INFORMATION {
239     Length: USHORT,
240     InterfaceNumber: UCHAR,
241     AlternateSetting: UCHAR,
242     Class: UCHAR,
243     SubClass: UCHAR,
244     Protocol: UCHAR,
245     Reserved: UCHAR,
246     InterfaceHandle: USBD_INTERFACE_HANDLE,
247     NumberOfPipes: ULONG,
248     Pipes: [USBD_PIPE_INFORMATION; 1],
249 }}
250 pub type PUSBD_INTERFACE_INFORMATION = *mut USBD_INTERFACE_INFORMATION;
251 STRUCT!{struct URB_HCD_AREA {
252     Reserved8: [PVOID; 8],
253 }}
254 STRUCT!{struct URB_HEADER {
255     Length: USHORT,
256     Function: USHORT,
257     Status: USBD_STATUS,
258     UsbdDeviceHandle: PVOID,
259     UsbdFlags: ULONG,
260 }}
261 STRUCT!{struct URB_SELECT_INTERFACE {
262     Hdr: URB_HEADER,
263     ConfigurationHandle: USBD_CONFIGURATION_HANDLE,
264     Interface: USBD_INTERFACE_INFORMATION,
265 }}
266 STRUCT!{struct URB_SELECT_CONFIGURATION {
267     Hdr: URB_HEADER,
268     ConfigurationDescriptor: PUSB_CONFIGURATION_DESCRIPTOR,
269     ConfigurationHandle: USBD_CONFIGURATION_HANDLE,
270     Interface: USBD_INTERFACE_INFORMATION,
271 }}
272 STRUCT!{struct URB_PIPE_REQUEST {
273     Hdr: URB_HEADER,
274     PipeHandle: USBD_PIPE_HANDLE,
275     Reserved: ULONG,
276 }}
277 STRUCT!{struct URB_FRAME_LENGTH_CONTROL {
278     Hdr: URB_HEADER,
279 }}
280 STRUCT!{struct URB_GET_FRAME_LENGTH {
281     Hdr: URB_HEADER,
282     FrameLength: ULONG,
283     FrameNumber: ULONG,
284 }}
285 STRUCT!{struct URB_SET_FRAME_LENGTH {
286     Hdr: URB_HEADER,
287     FrameLengthDelta: LONG,
288 }}
289 STRUCT!{struct URB_GET_CURRENT_FRAME_NUMBER {
290     Hdr: URB_HEADER,
291     FrameNumber: ULONG,
292 }}
293 STRUCT!{struct URB_CONTROL_DESCRIPTOR_REQUEST {
294     Hdr: URB_HEADER,
295     Reserved: PVOID,
296     Reserved0: ULONG,
297     TransferBufferLength: ULONG,
298     TransferBuffer: PVOID,
299     TransferBufferMDL: PMDL,
300     UrbLink: *mut URB,
301     hca: URB_HCD_AREA,
302     Reserved1: USHORT,
303     Index: UCHAR,
304     DescriptorType: UCHAR,
305     LanguageId: USHORT,
306     Reserved2: USHORT,
307 }}
308 STRUCT!{struct URB_CONTROL_GET_STATUS_REQUEST {
309     Hdr: URB_HEADER,
310     Reserved: PVOID,
311     Reserved0: ULONG,
312     TransferBufferLength: ULONG,
313     TransferBuffer: PVOID,
314     TransferBufferMDL: PMDL,
315     UrbLink: *mut URB,
316     hca: URB_HCD_AREA,
317     Reserved1: [UCHAR; 4],
318     Index: USHORT,
319     Reserved2: USHORT,
320 }}
321 STRUCT!{struct URB_CONTROL_FEATURE_REQUEST {
322     Hdr: URB_HEADER,
323     Reserved: PVOID,
324     Reserved2: ULONG,
325     Reserved3: ULONG,
326     Reserved4: PVOID,
327     Reserved5: PMDL,
328     UrbLink: *mut URB,
329     hca: URB_HCD_AREA,
330     Reserved0: USHORT,
331     FeatureSelector: USHORT,
332     Index: USHORT,
333     Reserved1: USHORT,
334 }}
335 STRUCT!{struct URB_CONTROL_VENDOR_OR_CLASS_REQUEST {
336     Hdr: URB_HEADER,
337     Reserved: PVOID,
338     TransferFlags: ULONG,
339     TransferBufferLength: ULONG,
340     TransferBuffer: PVOID,
341     TransferBufferMDL: PMDL,
342     UrbLink: *mut URB,
343     hca: URB_HCD_AREA,
344     RequestTypeReservedBits: UCHAR,
345     Request: UCHAR,
346     Value: USHORT,
347     Index: USHORT,
348     Reserved1: USHORT,
349 }}
350 STRUCT!{struct URB_CONTROL_GET_INTERFACE_REQUEST {
351     Hdr: URB_HEADER,
352     Reserved: PVOID,
353     Reserved0: ULONG,
354     TransferBufferLength: ULONG,
355     TransferBuffer: PVOID,
356     TransferBufferMDL: PMDL,
357     UrbLink: *mut URB,
358     hca: URB_HCD_AREA,
359     Reserved1: [UCHAR; 4],
360     Interface: USHORT,
361     Reserved2: USHORT,
362 }}
363 STRUCT!{struct URB_CONTROL_GET_CONFIGURATION_REQUEST {
364     Hdr: URB_HEADER,
365     Reserved: PVOID,
366     Reserved0: ULONG,
367     TransferBufferLength: ULONG,
368     TransferBuffer: PVOID,
369     TransferBufferMDL: PMDL,
370     UrbLink: *mut URB,
371     hca: URB_HCD_AREA,
372     Reserved1: [UCHAR; 8],
373 }}
374 pub const OS_STRING_DESCRIPTOR_INDEX: UCHAR = 0xEE;
375 pub const MS_GENRE_DESCRIPTOR_INDEX: USHORT = 0x0001;
376 pub const MS_POWER_DESCRIPTOR_INDEX: USHORT = 0x0002;
377 pub const MS_OS_STRING_SIGNATURE: &'static str = "MSFT100";
378 pub const MS_OS_FLAGS_CONTAINERID: UCHAR = 0x02;
379 UNION!{union OS_STRING_u {
380     [u8; 1],
381     bPad bPad_mut: UCHAR,
382     bFlags bFlags_mut: UCHAR,
383 }}
384 STRUCT!{struct OS_STRING {
385     bLength: UCHAR,
386     bDescriptorType: UCHAR,
387     MicrosoftString: [WCHAR; 7],
388     bVendorCode: UCHAR,
389     u: OS_STRING_u,
390 }}
391 pub type POS_STRING = *mut OS_STRING;
392 STRUCT!{struct URB_OS_FEATURE_DESCRIPTOR_REQUEST {
393     Hdr: URB_HEADER,
394     Reserved: PVOID,
395     Reserved0: ULONG,
396     TransferBufferLength: ULONG,
397     TransferBuffer: PVOID,
398     TransferBufferMDL: PMDL,
399     UrbLink: *mut URB,
400     hca: URB_HCD_AREA,
401     BitField: UCHAR,
402     Reserved2: UCHAR,
403     InterfaceNumber: UCHAR,
404     MS_PageIndex: UCHAR,
405     MS_FeatureDescriptorIndex: USHORT,
406     Reserved3: USHORT,
407 }}
408 BITFIELD!{URB_OS_FEATURE_DESCRIPTOR_REQUEST BitField: UCHAR [
409     Recipient set_Recipient[0..5],
410     Reserved1 set_Reserved1[5..8],
411 ]}
412 STRUCT!{struct URB_CONTROL_TRANSFER {
413     Hdr: URB_HEADER,
414     PipeHandle: USBD_PIPE_HANDLE,
415     TransferFlags: ULONG,
416     TransferBufferLength: ULONG,
417     TransferBuffer: PVOID,
418     TransferBufferMDL: PMDL,
419     UrbLink: *mut URB,
420     hca: URB_HCD_AREA,
421     SetupPacket: [UCHAR; 8],
422 }}
423 #[cfg(target_arch = "x86_64")]
424 STRUCT!{struct URB_CONTROL_TRANSFER_EX {
425     Hdr: URB_HEADER,
426     PipeHandle: USBD_PIPE_HANDLE,
427     TransferFlags: ULONG,
428     TransferBufferLength: ULONG,
429     TransferBuffer: PVOID,
430     TransferBufferMDL: PMDL,
431     Timeout: ULONG,
432     Pad: ULONG,
433     hca: URB_HCD_AREA,
434     SetupPacket: [UCHAR; 8],
435 }}
436 #[cfg(target_arch = "x86")]
437 STRUCT!{struct URB_CONTROL_TRANSFER_EX {
438     Hdr: URB_HEADER,
439     PipeHandle: USBD_PIPE_HANDLE,
440     TransferFlags: ULONG,
441     TransferBufferLength: ULONG,
442     TransferBuffer: PVOID,
443     TransferBufferMDL: PMDL,
444     Timeout: ULONG,
445     hca: URB_HCD_AREA,
446     SetupPacket: [UCHAR; 8],
447 }}
448 STRUCT!{struct URB_BULK_OR_INTERRUPT_TRANSFER {
449     Hdr: URB_HEADER,
450     PipeHandle: USBD_PIPE_HANDLE,
451     TransferFlags: ULONG,
452     TransferBufferLength: ULONG,
453     TransferBuffer: PVOID,
454     TransferBufferMDL: PMDL,
455     UrbLink: *mut URB,
456     hca: URB_HCD_AREA,
457 }}
458 STRUCT!{struct USBD_ISO_PACKET_DESCRIPTOR {
459     Offset: ULONG,
460     Length: ULONG,
461     Status: USBD_STATUS,
462 }}
463 pub type PUSBD_ISO_PACKET_DESCRIPTOR = *mut USBD_ISO_PACKET_DESCRIPTOR;
464 STRUCT!{struct URB_ISOCH_TRANSFER {
465     Hdr: URB_HEADER,
466     PipeHandle: USBD_PIPE_HANDLE,
467     TransferFlags: ULONG,
468     TransferBufferLength: ULONG,
469     TransferBuffer: PVOID,
470     TransferBufferMDL: PMDL,
471     UrbLink: *mut URB,
472     hca: URB_HCD_AREA,
473     StartFrame: ULONG,
474     NumberOfPackets: ULONG,
475     ErrorCount: ULONG,
476     IsoPacket: [USBD_ISO_PACKET_DESCRIPTOR; 1],
477 }}
478 pub const URB_OPEN_STATIC_STREAMS_VERSION_100: USHORT = 0x100;
479 STRUCT!{struct USBD_STREAM_INFORMATION {
480     PipeHandle: USBD_PIPE_HANDLE,
481     StreamID: ULONG,
482     MaximumTransferSize: ULONG,
483     PipeFlags: ULONG,
484 }}
485 pub type PUSBD_STREAM_INFORMATION = *mut USBD_STREAM_INFORMATION;
486 STRUCT!{struct URB_OPEN_STATIC_STREAMS {
487     Hdr: URB_HEADER,
488     PipeHandle: USBD_PIPE_HANDLE,
489     NumberOfStreams: ULONG,
490     StreamInfoVersion: USHORT,
491     StreamInfoSize: USHORT,
492     Streams: PUSBD_STREAM_INFORMATION,
493 }}
494 UNION!{union URB_u {
495     [u32; 24] [u64; 19],
496     UrbHeader UrbHeader_mut: URB_HEADER,
497     UrbSelectInterface UrbSelectInterface_mut: URB_SELECT_INTERFACE,
498     UrbSelectConfiguration UrbSelectConfiguration_mut: URB_SELECT_CONFIGURATION,
499     UrbPipeRequest UrbPipeRequest_mut: URB_PIPE_REQUEST,
500     UrbFrameLengthControl UrbFrameLengthControl_mut: URB_FRAME_LENGTH_CONTROL,
501     UrbGetFrameLength UrbGetFrameLength_mut: URB_GET_FRAME_LENGTH,
502     UrbSetFrameLength UrbSetFrameLength_mut: URB_SET_FRAME_LENGTH,
503     UrbGetCurrentFrameNumber UrbGetCurrentFrameNumber_mut: URB_GET_CURRENT_FRAME_NUMBER,
504     UrbControlTransfer UrbControlTransfer_mut: URB_CONTROL_TRANSFER,
505     UrbControlTransferEx UrbControlTransferEx_mut: URB_CONTROL_TRANSFER_EX,
506     UrbBulkOrInterruptTransfer UrbBulkOrInterruptTransfer_mut: URB_BULK_OR_INTERRUPT_TRANSFER,
507     UrbIsochronousTransfer UrbIsochronousTransfer_mut: URB_ISOCH_TRANSFER,
508     UrbControlDescriptorRequest UrbControlDescriptorRequest_mut: URB_CONTROL_DESCRIPTOR_REQUEST,
509     UrbControlGetStatusRequest UrbControlGetStatusRequest_mut: URB_CONTROL_GET_STATUS_REQUEST,
510     UrbControlFeatureRequest UrbControlFeatureRequest_mut: URB_CONTROL_FEATURE_REQUEST,
511     UrbControlVendorClassRequest UrbControlVendorClassRequest_mut:
512         URB_CONTROL_VENDOR_OR_CLASS_REQUEST,
513     UrbControlGetInterfaceRequest UrbControlGetInterfaceRequest_mut:
514         URB_CONTROL_GET_INTERFACE_REQUEST,
515     UrbControlGetConfigurationRequest UrbControlGetConfigurationRequest_mut:
516         URB_CONTROL_GET_CONFIGURATION_REQUEST,
517     UrbOSFeatureDescriptorRequest UrbOSFeatureDescriptorRequest_mut:
518         URB_OS_FEATURE_DESCRIPTOR_REQUEST,
519     UrbOpenStaticStreams UrbOpenStaticStreams_mut: URB_OPEN_STATIC_STREAMS,
520 }}
521 STRUCT!{struct URB {
522     u: URB_u,
523 }}
524 pub type PURB = *mut URB;
525