winapi_ui_automation/shared/
usbioctl.rs

1use shared::basetsd::ULONG64;
2use shared::guiddef::GUID;
3use shared::minwindef::{DWORD, UCHAR, ULONG, USHORT};
4use shared::ntdef::{BOOLEAN, HANDLE, LARGE_INTEGER, LONG, NTSTATUS, PWCHAR, WCHAR};
5use shared::usb::USBD_STATUS;
6use shared::usbiodef::{
7    FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, HCD_DIAGNOSTIC_MODE_ON, HCD_DISABLE_PORT,
8    HCD_ENABLE_PORT, HCD_GET_DRIVERKEY_NAME, HCD_GET_ROOT_HUB_NAME, HCD_GET_STATS_1,
9    HCD_GET_STATS_2, USB_CYCLE_PORT, USB_DIAG_IGNORE_HUBS_OFF, USB_DIAG_IGNORE_HUBS_ON,
10    USB_ENABLE_PORT, USB_FAIL_GET_STATUS, USB_GET_BUSGUID_INFO, USB_GET_BUS_INFO,
11    USB_GET_CONTROLLER_NAME, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
12    USB_GET_DEVICE_CHARACTERISTICS, USB_GET_DEVICE_HANDLE, USB_GET_DEVICE_HANDLE_EX,
13    USB_GET_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC, USB_GET_HUB_CAPABILITIES,
14    USB_GET_HUB_CAPABILITIES_EX, USB_GET_HUB_CONFIG_INFO, USB_GET_HUB_COUNT,
15    USB_GET_HUB_INFORMATION_EX, USB_GET_HUB_NAME, USB_GET_NODE_CONNECTION_ATTRIBUTES,
16    USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, USB_GET_NODE_CONNECTION_INFORMATION,
17    USB_GET_NODE_CONNECTION_INFORMATION_EX, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2,
18    USB_GET_NODE_CONNECTION_NAME, USB_GET_NODE_INFORMATION, USB_GET_PARENT_HUB_INFO,
19    USB_GET_PORT_CONNECTOR_PROPERTIES, USB_GET_PORT_STATUS, USB_GET_ROOTHUB_PDO,
20    USB_GET_TOPOLOGY_ADDRESS, USB_GET_TRANSPORT_CHARACTERISTICS, USB_GET_TT_DEVICE_HANDLE,
21    USB_HUB_CYCLE_PORT, USB_IDLE_NOTIFICATION, USB_IDLE_NOTIFICATION_EX,
22    USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE, USB_RECORD_FAILURE,
23    USB_REGISTER_COMPOSITE_DEVICE, USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE,
24    USB_REQUEST_REMOTE_WAKE_NOTIFICATION, USB_REQ_GLOBAL_RESUME, USB_REQ_GLOBAL_SUSPEND,
25    USB_RESET_HUB, USB_RESET_PORT, USB_START_TRACKING_FOR_TIME_SYNC,
26    USB_STOP_TRACKING_FOR_TIME_SYNC, USB_SUBMIT_URB, USB_UNREGISTER_COMPOSITE_DEVICE,
27    USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE,
28};
29use shared::usbspec::{
30    USB_30_HUB_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR, USB_DEVICE_DESCRIPTOR, USB_DEVICE_SPEED,
31    USB_ENDPOINT_DESCRIPTOR, USB_HUB_DESCRIPTOR,
32};
33use um::winioctl::{FILE_ANY_ACCESS, FILE_DEVICE_USBEX, METHOD_BUFFERED, METHOD_NEITHER};
34pub const IOCTL_INTERNAL_USB_SUBMIT_URB: DWORD
35    = CTL_CODE!(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS);
36pub const IOCTL_INTERNAL_USB_RESET_PORT: DWORD
37    = CTL_CODE!(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS);
38pub const IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: DWORD
39    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS);
40pub const USBD_PORT_ENABLED: DWORD = 0x00000001;
41pub const USBD_PORT_CONNECTED: DWORD = 0x00000002;
42pub const IOCTL_INTERNAL_USB_GET_PORT_STATUS: DWORD
43    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS);
44pub const IOCTL_INTERNAL_USB_ENABLE_PORT: DWORD
45    = CTL_CODE!(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS);
46pub const IOCTL_INTERNAL_USB_GET_HUB_COUNT: DWORD
47    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS);
48pub const IOCTL_INTERNAL_USB_CYCLE_PORT: DWORD
49    = CTL_CODE!(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS);
50pub const IOCTL_INTERNAL_USB_GET_HUB_NAME: DWORD
51    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS);
52pub const IOCTL_INTERNAL_USB_GET_BUS_INFO: DWORD
53    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS);
54pub const IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME: DWORD
55    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS);
56pub const IOCTL_INTERNAL_USB_GET_BUSGUID_INFO: DWORD
57    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS);
58pub const IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO: DWORD
59    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS);
60pub const IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: DWORD
61    = CTL_CODE!(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS);
62pub const IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: DWORD
63    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS);
64pub const IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY: DWORD
65    = CTL_CODE!(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION_EX, METHOD_NEITHER, FILE_ANY_ACCESS);
66pub const IOCTL_INTERNAL_USB_REQ_GLOBAL_SUSPEND: DWORD
67    = CTL_CODE!(FILE_DEVICE_USB, USB_REQ_GLOBAL_SUSPEND, METHOD_NEITHER, FILE_ANY_ACCESS);
68pub const IOCTL_INTERNAL_USB_REQ_GLOBAL_RESUME: DWORD
69    = CTL_CODE!(FILE_DEVICE_USB, USB_REQ_GLOBAL_RESUME, METHOD_NEITHER, FILE_ANY_ACCESS);
70STRUCT!{struct USB_START_FAILDATA {
71    LengthInBytes: ULONG,
72    NtStatus: NTSTATUS,
73    UsbdStatus: USBD_STATUS,
74    ConnectStatus: ULONG,
75    DriverData: [UCHAR; 4],
76}}
77pub type PUSB_START_FAILDATA = *mut USB_START_FAILDATA;
78pub const IOCTL_INTERNAL_USB_RECORD_FAILURE: DWORD
79    = CTL_CODE!(FILE_DEVICE_USB, USB_RECORD_FAILURE, METHOD_NEITHER, FILE_ANY_ACCESS);
80pub const IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX: DWORD
81    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE_EX, METHOD_NEITHER, FILE_ANY_ACCESS);
82pub const IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE: DWORD
83    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_TT_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS);
84STRUCT!{struct USB_TOPOLOGY_ADDRESS {
85    PciBusNumber: ULONG,
86    PciDeviceNumber: ULONG,
87    PciFunctionNumber: ULONG,
88    Reserved: ULONG,
89    RootHubPortNumber: USHORT,
90    HubPortNumber: [USHORT; 5],
91    Reserved2: USHORT,
92}}
93pub type PUSB_TOPOLOGY_ADDRESS = *mut USB_TOPOLOGY_ADDRESS;
94pub const IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS: DWORD
95    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_TOPOLOGY_ADDRESS, METHOD_NEITHER, FILE_ANY_ACCESS);
96pub const IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO: DWORD
97    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_CONFIG_INFO, METHOD_NEITHER, FILE_ANY_ACCESS);
98pub const IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DEVICE: DWORD
99    = CTL_CODE!(FILE_DEVICE_USBEX, USB_REGISTER_COMPOSITE_DEVICE, METHOD_NEITHER, FILE_ANY_ACCESS);
100pub const IOCTL_INTERNAL_USB_UNREGISTER_COMPOSITE_DEVICE: DWORD
101    = CTL_CODE!(FILE_DEVICE_USBEX, USB_UNREGISTER_COMPOSITE_DEVICE, METHOD_NEITHER,
102        FILE_ANY_ACCESS);
103pub const IOCTL_INTERNAL_USB_REQUEST_REMOTE_WAKE_NOTIFICATION: DWORD
104    = CTL_CODE!(FILE_DEVICE_USBEX, USB_REQUEST_REMOTE_WAKE_NOTIFICATION, METHOD_NEITHER,
105        FILE_ANY_ACCESS);
106pub const IOCTL_INTERNAL_USB_FAIL_GET_STATUS_FROM_DEVICE: DWORD
107    = CTL_CODE!(FILE_DEVICE_USB, USB_FAIL_GET_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS);
108pub const IOCTL_USB_HCD_GET_STATS_1: DWORD
109    = CTL_CODE!(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS);
110pub const IOCTL_USB_HCD_GET_STATS_2: DWORD
111    = CTL_CODE!(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS);
112pub const IOCTL_USB_HCD_DISABLE_PORT: DWORD
113    = CTL_CODE!(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS);
114pub const IOCTL_USB_HCD_ENABLE_PORT: DWORD
115    = CTL_CODE!(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS);
116pub const IOCTL_USB_DIAGNOSTIC_MODE_ON: DWORD
117    = CTL_CODE!(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS);
118pub const IOCTL_USB_DIAGNOSTIC_MODE_OFF: DWORD
119    = CTL_CODE!(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS);
120pub const IOCTL_USB_GET_ROOT_HUB_NAME: DWORD
121    = CTL_CODE!(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS);
122pub const IOCTL_GET_HCD_DRIVERKEY_NAME: DWORD
123    = CTL_CODE!(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS);
124pub const IOCTL_USB_GET_NODE_INFORMATION: DWORD
125    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS);
126pub const IOCTL_USB_GET_NODE_CONNECTION_INFORMATION: DWORD
127    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED,
128        FILE_ANY_ACCESS);
129pub const IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION: DWORD
130    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED,
131        FILE_ANY_ACCESS);
132pub const IOCTL_USB_GET_NODE_CONNECTION_NAME: DWORD
133    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS);
134pub const IOCTL_USB_DIAG_IGNORE_HUBS_ON: DWORD
135    = CTL_CODE!(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS);
136pub const IOCTL_USB_DIAG_IGNORE_HUBS_OFF: DWORD
137    = CTL_CODE!(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS);
138pub const IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME: DWORD
139    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED,
140        FILE_ANY_ACCESS);
141pub const IOCTL_USB_GET_HUB_CAPABILITIES: DWORD
142    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS);
143pub const IOCTL_USB_HUB_CYCLE_PORT: DWORD
144    = CTL_CODE!(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS);
145pub const IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES: DWORD
146    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED,
147        FILE_ANY_ACCESS);
148pub const IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX: DWORD
149    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED,
150        FILE_ANY_ACCESS);
151pub const IOCTL_USB_RESET_HUB: DWORD
152    = CTL_CODE!(FILE_DEVICE_USB, USB_RESET_HUB, METHOD_BUFFERED, FILE_ANY_ACCESS);
153pub const IOCTL_USB_GET_HUB_CAPABILITIES_EX: DWORD
154    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS);
155pub const IOCTL_USB_GET_HUB_INFORMATION_EX: DWORD
156    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_HUB_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS);
157pub const IOCTL_USB_GET_PORT_CONNECTOR_PROPERTIES: DWORD
158    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_PORT_CONNECTOR_PROPERTIES, METHOD_BUFFERED,
159        FILE_ANY_ACCESS);
160pub const IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2: DWORD
161    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED,
162        FILE_ANY_ACCESS);
163pub const IOCTL_USB_GET_TRANSPORT_CHARACTERISTICS: DWORD
164    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_TRANSPORT_CHARACTERISTICS, METHOD_BUFFERED,
165        FILE_ANY_ACCESS);
166pub const IOCTL_USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE: DWORD
167    = CTL_CODE!(FILE_DEVICE_USB, USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE,
168        METHOD_BUFFERED, FILE_ANY_ACCESS);
169pub const IOCTL_USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE: DWORD
170    = CTL_CODE!(FILE_DEVICE_USB, USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE, METHOD_BUFFERED,
171        FILE_ANY_ACCESS);
172pub const IOCTL_USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE: DWORD
173    = CTL_CODE!(FILE_DEVICE_USB, USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE,
174        METHOD_BUFFERED, FILE_ANY_ACCESS);
175pub const IOCTL_USB_START_TRACKING_FOR_TIME_SYNC: DWORD
176    = CTL_CODE!(FILE_DEVICE_USB, USB_START_TRACKING_FOR_TIME_SYNC, METHOD_BUFFERED,
177        FILE_ANY_ACCESS);
178pub const IOCTL_USB_GET_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC: DWORD
179    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC, METHOD_BUFFERED,
180        FILE_ANY_ACCESS);
181pub const IOCTL_USB_STOP_TRACKING_FOR_TIME_SYNC: DWORD
182    = CTL_CODE!(FILE_DEVICE_USB, USB_STOP_TRACKING_FOR_TIME_SYNC, METHOD_BUFFERED,
183        FILE_ANY_ACCESS);
184pub const IOCTL_USB_GET_DEVICE_CHARACTERISTICS: DWORD
185    = CTL_CODE!(FILE_DEVICE_USB, USB_GET_DEVICE_CHARACTERISTICS, METHOD_BUFFERED, FILE_ANY_ACCESS);
186ENUM!{enum USB_HUB_NODE {
187    UsbHub,
188    UsbMIParent,
189}}
190STRUCT!{#[repr(packed)] struct USB_HUB_INFORMATION {
191    HubDescriptor: USB_HUB_DESCRIPTOR,
192    HubIsBusPowered: BOOLEAN,
193}}
194pub type PUSB_HUB_INFORMATION = *mut USB_HUB_INFORMATION;
195STRUCT!{#[repr(packed)] struct USB_MI_PARENT_INFORMATION {
196    NumberOfInterfaces: ULONG,
197}}
198pub type PUSB_MI_PARENT_INFORMATION = *mut USB_MI_PARENT_INFORMATION;
199STRUCT!{#[repr(packed)] struct USB_NODE_INFORMATION {
200    NodeType: USB_HUB_NODE,
201    u: USB_NODE_INFORMATION_u,
202}}
203UNION!{union USB_NODE_INFORMATION_u {
204    [u8; 72],
205    HubInformation HubInformation_mut: USB_HUB_INFORMATION,
206    MiParentInformation MiParentInformation_mut: USB_MI_PARENT_INFORMATION,
207}}
208pub type PUSB_NODE_INFORMATION = *mut USB_NODE_INFORMATION;
209STRUCT!{#[repr(packed)] struct USB_PIPE_INFO {
210    EndpointDescriptor: USB_ENDPOINT_DESCRIPTOR,
211    ScheduleOffset: ULONG,
212}}
213pub type PUSB_PIPE_INFO = *mut USB_PIPE_INFO;
214ENUM!{enum USB_CONNECTION_STATUS {
215    NoDeviceConnected,
216    DeviceConnected,
217    DeviceFailedEnumeration,
218    DeviceGeneralFailure,
219    DeviceCausedOvercurrent,
220    DeviceNotEnoughPower,
221    DeviceNotEnoughBandwidth,
222    DeviceHubNestedTooDeeply,
223    DeviceInLegacyHub,
224    DeviceEnumerating,
225    DeviceReset,
226}}
227pub type PUSB_CONNECTION_STATUS = *mut USB_CONNECTION_STATUS;
228STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_INFORMATION {
229    ConnectionIndex: ULONG,
230    DeviceDescriptor: USB_DEVICE_DESCRIPTOR,
231    CurrentConfigurationValue: UCHAR,
232    LowSpeed: BOOLEAN,
233    DeviceIsHub: BOOLEAN,
234    DeviceAddress: USHORT,
235    NumberOfOpenPipes: ULONG,
236    ConnectionStatus: USB_CONNECTION_STATUS,
237    PipeList: [USB_PIPE_INFO; 0],
238}}
239pub type PUSB_NODE_CONNECTION_INFORMATION = *mut USB_NODE_CONNECTION_INFORMATION;
240STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_DRIVERKEY_NAME {
241    ConnectionIndex: ULONG,
242    ActualLength: ULONG,
243    DriverKeyName: [WCHAR; 1],
244}}
245pub type PUSB_NODE_CONNECTION_DRIVERKEY_NAME = *mut USB_NODE_CONNECTION_DRIVERKEY_NAME;
246STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_NAME {
247    ConnectionIndex: ULONG,
248    ActualLength: ULONG,
249    NodeName: [WCHAR; 1],
250}}
251pub type PUSB_NODE_CONNECTION_NAME = *mut USB_NODE_CONNECTION_NAME;
252STRUCT!{#[repr(packed)] struct USB_HUB_NAME {
253    ActualLength: ULONG,
254    HubName: [WCHAR; 1],
255}}
256pub type PUSB_HUB_NAME = *mut USB_HUB_NAME;
257STRUCT!{#[repr(packed)] struct USB_ROOT_HUB_NAME {
258    ActualLength: ULONG,
259    RootHubName: [WCHAR; 1],
260}}
261pub type PUSB_ROOT_HUB_NAME = *mut USB_ROOT_HUB_NAME;
262STRUCT!{#[repr(packed)] struct USB_HCD_DRIVERKEY_NAME {
263    ActualLength: ULONG,
264    DriverKeyName: [WCHAR; 1],
265}}
266pub type PUSB_HCD_DRIVERKEY_NAME = *mut USB_HCD_DRIVERKEY_NAME;
267STRUCT!{#[repr(packed)] struct USB_DESCRIPTOR_REQUEST {
268    ConnectionIndex: ULONG,
269    SetupPacket: USB_DESCRIPTOR_REQUEST_SetupPacket,
270    Data: [UCHAR; 0],
271}}
272STRUCT!{#[repr(packed)] struct USB_DESCRIPTOR_REQUEST_SetupPacket {
273    bmRequest: UCHAR,
274    bRequest: UCHAR,
275    wValue: USHORT,
276    wIndex: USHORT,
277    wLength: USHORT,
278}}
279pub type PUSB_DESCRIPTOR_REQUEST = *mut USB_DESCRIPTOR_REQUEST;
280STRUCT!{#[repr(packed)] struct USB_HUB_CAPABILITIES {
281    bitfield: ULONG,
282}}
283BITFIELD!{USB_HUB_CAPABILITIES bitfield: ULONG [
284    HubIs2xCapable set_HubIs2xCapable[0..1],
285]}
286pub type PUSB_HUB_CAPABILITIES = *mut USB_HUB_CAPABILITIES;
287STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_ATTRIBUTES {
288    ConnectionIndex: ULONG,
289    ConnectionStatus: USB_CONNECTION_STATUS,
290    PortAttributes: ULONG,
291}}
292pub type PUSB_NODE_CONNECTION_ATTRIBUTES = *mut USB_NODE_CONNECTION_ATTRIBUTES;
293STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_INFORMATION_EX {
294    ConnectionIndex: ULONG,
295    DeviceDescriptor: USB_DEVICE_DESCRIPTOR,
296    CurrentConfigurationValue: UCHAR,
297    Speed: UCHAR,
298    DeviceIsHub: BOOLEAN,
299    DeviceAddress: USHORT,
300    NumberOfOpenPipes: ULONG,
301    ConnectionStatus: USB_CONNECTION_STATUS,
302    PipeList: [USB_PIPE_INFO; 0],
303}}
304pub type PUSB_NODE_CONNECTION_INFORMATION_EX = *mut USB_NODE_CONNECTION_INFORMATION_EX;
305STRUCT!{#[repr(packed)] struct USB_HUB_CAP_FLAGS {
306    ul: ULONG,
307}}
308BITFIELD!{USB_HUB_CAP_FLAGS ul: ULONG [
309    HubIsHighSpeedCapable set_HubIsHighSpeedCapable[0..1],
310    HubIsHighSpeed set_HubIsHighSpeed[1..2],
311    HubIsMultiTtCapable set_HubIsMultiTtCapable[2..3],
312    HubIsMultiTt set_HubIsMultiTt[3..4],
313    HubIsRoot set_HubIsRoot[4..5],
314    HubIsArmedWakeOnConnect set_HubIsArmedWakeOnConnect[5..6],
315    HubIsBusPowered set_HubIsBusPowered[6..7],
316    ReservedMBZ set_ReservedMBZ[7..32],
317]}
318pub type PUSB_HUB_CAP_FLAGS = *mut USB_HUB_CAP_FLAGS;
319STRUCT!{#[repr(packed)] struct USB_HUB_CAPABILITIES_EX {
320    CapabilityFlags: USB_HUB_CAP_FLAGS,
321}}
322pub type PUSB_HUB_CAPABILITIES_EX = *mut USB_HUB_CAPABILITIES_EX;
323STRUCT!{#[repr(packed)] struct USB_CYCLE_PORT_PARAMS {
324    ConnectionIndex: ULONG,
325    StatusReturned: ULONG,
326}}
327pub type PUSB_CYCLE_PORT_PARAMS = *mut USB_CYCLE_PORT_PARAMS;
328STRUCT!{#[repr(packed)] struct USB_ID_STRING {
329    LanguageId: USHORT,
330    Pad: USHORT,
331    LengthInBytes: ULONG,
332    Buffer: PWCHAR,
333}}
334pub type PUSB_ID_STRING = *mut USB_ID_STRING;
335STRUCT!{#[repr(packed)] struct USB_HUB_DEVICE_UXD_SETTINGS {
336    Version: ULONG,
337    PnpGuid: GUID,
338    OwnerGuid: GUID,
339    DeleteOnShutdown: ULONG,
340    DeleteOnReload: ULONG,
341    DeleteOnDisconnect: ULONG,
342    Reserved: [ULONG; 5],
343}}
344pub type PUSB_HUB_DEVICE_UXD_SETTINGS = *mut USB_HUB_DEVICE_UXD_SETTINGS;
345STRUCT!{#[repr(packed)] struct HUB_DEVICE_CONFIG_INFO {
346    Version: ULONG,
347    Length: ULONG,
348    HubFlags: USB_HUB_CAP_FLAGS,
349    HardwareIds: USB_ID_STRING,
350    CompatibleIds: USB_ID_STRING,
351    DeviceDescription: USB_ID_STRING,
352    Reserved: [ULONG; 19],
353    UxdSettings: USB_HUB_DEVICE_UXD_SETTINGS,
354}}
355pub type PHUB_DEVICE_CONFIG_INFO = *mut HUB_DEVICE_CONFIG_INFO;
356STRUCT!{#[repr(packed)] struct HCD_STAT_COUNTERS {
357    BytesTransferred: ULONG,
358    IsoMissedCount: USHORT,
359    DataOverrunErrorCount: USHORT,
360    CrcErrorCount: USHORT,
361    ScheduleOverrunCount: USHORT,
362    TimeoutErrorCount: USHORT,
363    InternalHcErrorCount: USHORT,
364    BufferOverrunErrorCount: USHORT,
365    SWErrorCount: USHORT,
366    StallPidCount: USHORT,
367    PortDisableCount: USHORT,
368}}
369pub type PHCD_STAT_COUNTERS = *mut HCD_STAT_COUNTERS;
370STRUCT!{#[repr(packed)] struct HCD_ISO_STAT_COUNTERS {
371    LateUrbs: USHORT,
372    DoubleBufferedPackets: USHORT,
373    TransfersCF_5ms: USHORT,
374    TransfersCF_2ms: USHORT,
375    TransfersCF_1ms: USHORT,
376    MaxInterruptLatency: USHORT,
377    BadStartFrame: USHORT,
378    StaleUrbs: USHORT,
379    IsoPacketNotAccesed: USHORT,
380    IsoPacketHWError: USHORT,
381    SmallestUrbPacketCount: USHORT,
382    LargestUrbPacketCount: USHORT,
383    IsoCRC_Error: USHORT,
384    IsoOVERRUN_Error: USHORT,
385    IsoINTERNAL_Error: USHORT,
386    IsoUNKNOWN_Error: USHORT,
387    IsoBytesTransferred: ULONG,
388    LateMissedCount: USHORT,
389    HWIsoMissedCount: USHORT,
390    Reserved7: [ULONG; 8],
391}}
392pub type PHCD_ISO_STAT_COUNTERS = *mut HCD_ISO_STAT_COUNTERS;
393STRUCT!{#[repr(packed)] struct HCD_STAT_INFORMATION_1 {
394    Reserved1: ULONG,
395    Reserved2: ULONG,
396    ResetCounters: ULONG,
397    TimeRead: LARGE_INTEGER,
398    Counters: HCD_STAT_COUNTERS,
399}}
400pub type PHCD_STAT_INFORMATION_1 = *mut HCD_STAT_INFORMATION_1;
401STRUCT!{#[repr(packed)] struct HCD_STAT_INFORMATION_2 {
402    Reserved1: ULONG,
403    Reserved2: ULONG,
404    ResetCounters: ULONG,
405    TimeRead: LARGE_INTEGER,
406    LockedMemoryUsed: LONG,
407    Counters: HCD_STAT_COUNTERS,
408    IsoCounters: HCD_ISO_STAT_COUNTERS,
409}}
410pub type PHCD_STAT_INFORMATION_2 = *mut HCD_STAT_INFORMATION_2;
411pub const WMI_USB_DRIVER_INFORMATION: ULONG = 0;
412pub const WMI_USB_DRIVER_NOTIFICATION: ULONG = 1;
413pub const WMI_USB_POWER_DEVICE_ENABLE: ULONG = 2;
414pub const WMI_USB_HUB_NODE_INFORMATION: ULONG = 4;
415pub const WMI_USB_PERFORMANCE_INFORMATION: ULONG = 1;
416pub const WMI_USB_DEVICE_NODE_INFORMATION: ULONG = 2;
417ENUM!{enum USB_NOTIFICATION_TYPE {
418    EnumerationFailure = 0,
419    InsufficentBandwidth,
420    InsufficentPower,
421    OverCurrent,
422    ResetOvercurrent,
423    AcquireBusInfo,
424    AcquireHubName,
425    AcquireControllerName,
426    HubOvercurrent,
427    HubPowerChange,
428    HubNestedTooDeeply,
429    ModernDeviceInLegacyHub,
430}}
431STRUCT!{#[repr(packed)] struct USB_NOTIFICATION {
432    NotificationType: USB_NOTIFICATION_TYPE,
433}}
434pub type PUSB_NOTIFICATION = *mut USB_NOTIFICATION;
435STRUCT!{#[repr(packed)] struct USB_CONNECTION_NOTIFICATION {
436    NotificationType: USB_NOTIFICATION_TYPE,
437    ConnectionNumber: ULONG,
438    RequestedBandwidth: ULONG,
439    EnumerationFailReason: ULONG,
440    PowerRequested: ULONG,
441    HubNameLength: ULONG,
442}}
443pub type PUSB_CONNECTION_NOTIFICATION = *mut USB_CONNECTION_NOTIFICATION;
444STRUCT!{#[repr(packed)] struct USB_BUS_NOTIFICATION {
445    NotificationType: USB_NOTIFICATION_TYPE,
446    TotalBandwidth: ULONG,
447    ConsumedBandwidth: ULONG,
448    ControllerNameLength: ULONG,
449}}
450pub type PUSB_BUS_NOTIFICATION = *mut USB_BUS_NOTIFICATION;
451STRUCT!{#[repr(packed)] struct USB_ACQUIRE_INFO {
452    NotificationType: USB_NOTIFICATION_TYPE,
453    TotalSize: ULONG,
454    Buffer: [WCHAR; 1],
455}}
456pub type PUSB_ACQUIRE_INFO = *mut USB_ACQUIRE_INFO;
457ENUM!{enum USB_WMI_DEVICE_NODE_TYPE {
458    UsbDevice,
459    HubDevice,
460    CompositeDevice,
461    UsbController,
462}}
463pub type PUSB_WMI_DEVICE_NODE_TYPE = *mut USB_WMI_DEVICE_NODE_TYPE;
464STRUCT!{#[repr(packed)] struct USB_DEVICE_STATE {
465    bitfield: ULONG,
466}}
467BITFIELD!{USB_DEVICE_STATE bitfield: ULONG [
468    DeviceConnected set_DeviceConnected[0..1],
469    DeviceStarted set_DeviceStarted[1..2],
470]}
471pub type PUSB_DEVICE_STATE = *mut USB_DEVICE_STATE;
472STRUCT!{#[repr(packed)] struct USB_HUB_PORT_INFORMATION {
473    DeviceState: USB_DEVICE_STATE,
474    PortNumber: USHORT,
475    DeviceAddress: USHORT,
476    ConnectionIndex: ULONG,
477    ConnectionStatus: USB_CONNECTION_STATUS,
478}}
479pub type PUSB_HUB_PORT_INFORMATION = *mut USB_HUB_PORT_INFORMATION;
480STRUCT!{#[repr(packed)] struct USB_HUB_DEVICE_INFO {
481    HubDescriptor: USB_HUB_DESCRIPTOR,
482    HubNumber: ULONG,
483    DeviceAddress: USHORT,
484    HubIsSelfPowered: BOOLEAN,
485    HubIsRootHub: BOOLEAN,
486    HubCapabilities: USB_HUB_CAPABILITIES,
487    NumberOfHubPorts: ULONG,
488    PortInfo: [USB_HUB_PORT_INFORMATION; 1],
489}}
490pub type PUSB_HUB_DEVICE_INFO = *mut USB_HUB_DEVICE_INFO;
491STRUCT!{#[repr(packed)] struct USB_COMPOSITE_FUNCTION_INFO {
492    FunctionNumber: UCHAR,
493    BaseInterfaceNumber: UCHAR,
494    NumberOfInterfaces: UCHAR,
495    FunctionIsIdle: BOOLEAN,
496}}
497pub type PUSB_COMPOSITE_FUNCTION_INFO = *mut USB_COMPOSITE_FUNCTION_INFO;
498STRUCT!{#[repr(packed)] struct USB_COMPOSITE_DEVICE_INFO {
499    DeviceDescriptor: USB_DEVICE_DESCRIPTOR,
500    CurrentConfigDescriptor: USB_CONFIGURATION_DESCRIPTOR,
501    CurrentConfigurationValue: UCHAR,
502    NumberOfFunctions: UCHAR,
503    FunctionInfo: [USB_COMPOSITE_FUNCTION_INFO; 1],
504}}
505pub type PUSB_COMPOSITE_DEVICE_INFO = *mut USB_COMPOSITE_DEVICE_INFO;
506STRUCT!{#[repr(packed)] struct USB_CONTROLLER_DEVICE_INFO {
507    PciVendorId: ULONG,
508    PciDeviceId: ULONG,
509    PciRevision: ULONG,
510    NumberOfRootPorts: ULONG,
511    HcFeatureFlags: ULONG,
512}}
513pub type PUSB_CONTROLLER_DEVICE_INFO = *mut USB_CONTROLLER_DEVICE_INFO;
514STRUCT!{#[repr(packed)] struct USB_DEVICE_INFO {
515    DeviceState: USB_DEVICE_STATE,
516    PortNumber: USHORT,
517    DeviceDescriptor: USB_DEVICE_DESCRIPTOR,
518    CurrentConfigurationValue: UCHAR,
519    Speed: USB_DEVICE_SPEED,
520    DeviceAddress: USHORT,
521    ConnectionIndex: ULONG,
522    ConnectionStatus: USB_CONNECTION_STATUS,
523    PnpHardwareId: [WCHAR; 128],
524    PnpCompatibleId: [WCHAR; 128],
525    SerialNumberId: [WCHAR; 128],
526    PnpDeviceDescription: [WCHAR; 128],
527    NumberOfOpenPipes: ULONG,
528    PipeList: [USB_PIPE_INFO; 1],
529}}
530pub type PUSB_DEVICE_INFO = *mut USB_DEVICE_INFO;
531STRUCT!{#[repr(packed)] struct USB_DEVICE_NODE_INFO {
532    Sig: ULONG,
533    LengthInBytes: ULONG,
534    DeviceDescription: [WCHAR; 40],
535    NodeType: USB_WMI_DEVICE_NODE_TYPE,
536    BusAddress: USB_TOPOLOGY_ADDRESS,
537    u: USB_DEVICE_NODE_INFO_u,
538}}
539UNION!{union USB_DEVICE_NODE_INFO_u {
540    [u8; 1078],
541    UsbDeviceInfo UsbDeviceInfo_mut: USB_DEVICE_INFO,
542    HubDeviceInfo HubDeviceInfo_mut: USB_HUB_DEVICE_INFO,
543    CompositeDeviceInfo CompositeDeviceInfo_mut: USB_COMPOSITE_DEVICE_INFO,
544    ControllerDeviceInfo ControllerDeviceInfo_mut: USB_CONTROLLER_DEVICE_INFO,
545    DeviceInformation DeviceInformation_mut: [UCHAR; 4],
546}}
547pub type PUSB_DEVICE_NODE_INFO = *mut USB_DEVICE_NODE_INFO;
548STRUCT!{#[repr(packed)] struct USB_DEVICE_PERFORMANCE_INFO {
549    BulkBytes: ULONG,
550    ControlDataBytes: ULONG,
551    IsoBytes: ULONG,
552    InterruptBytes: ULONG,
553    BulkUrbCount: ULONG,
554    ControlUrbCount: ULONG,
555    IsoUrbCount: ULONG,
556    InterruptUrbCount: ULONG,
557    AllocedInterrupt: [ULONG; 6],
558    AllocedIso: ULONG,
559    Total32secBandwidth: ULONG,
560    TotalTtBandwidth: ULONG,
561    DeviceDescription: [WCHAR; 60],
562    DeviceSpeed: USB_DEVICE_SPEED,
563    TotalIsoLatency: ULONG,
564    DroppedIsoPackets: ULONG,
565    TransferErrors: ULONG,
566    PciInterruptCount: ULONG,
567    HcIdleState: ULONG,
568    HcAsyncIdleState: ULONG,
569    HcAsyncCacheFlushCount: ULONG,
570    HcPeriodicIdleState: ULONG,
571    HcPeriodicCacheFlushCount: ULONG,
572}}
573pub type PUSB_DEVICE_PERFORMANCE_INFO = *mut USB_DEVICE_PERFORMANCE_INFO;
574ENUM!{enum USB_HUB_TYPE {
575    UsbRootHub = 1,
576    Usb20Hub = 2,
577    Usb30Hub = 3,
578}}
579STRUCT!{#[repr(packed)] struct USB_HUB_INFORMATION_EX {
580    HubType: USB_HUB_TYPE,
581    HighestPortNumber: USHORT,
582    u: USB_HUB_INFORMATION_EX_u,
583}}
584UNION!{union USB_HUB_INFORMATION_EX_u {
585    [u8; 71],
586    UsbHubDescriptor UsbHubDescriptor_mut: USB_HUB_DESCRIPTOR,
587    Usb30HubDescriptor Usb30HubDescriptor_mut: USB_30_HUB_DESCRIPTOR,
588}}
589pub type PUSB_HUB_INFORMATION_EX = *mut USB_HUB_INFORMATION_EX;
590STRUCT!{#[repr(packed)] struct USB_PORT_PROPERTIES {
591    ul: ULONG,
592}}
593BITFIELD!{USB_PORT_PROPERTIES ul: ULONG [
594    PortIsUserConnectable set_PortIsUserConnectable[0..1],
595    PortIsDebugCapable set_PortIsDebugCapable[1..2],
596    PortHasMultipleCompanions set_PortHasMultipleCompanions[2..3],
597    PortConnectorIsTypeC set_PortConnectorIsTypeC[3..4],
598    ReservedMBZ set_ReservedMBZ[4..32],
599]}
600pub type PUSB_PORT_PROPERTIES = *mut USB_PORT_PROPERTIES;
601STRUCT!{#[repr(packed)] struct USB_PORT_CONNECTOR_PROPERTIES {
602    ConnectionIndex: ULONG,
603    ActualLength: ULONG,
604    UsbPortProperties: USB_PORT_PROPERTIES,
605    CompanionIndex: USHORT,
606    CompanionPortNumber: USHORT,
607    CompanionHubSymbolicLinkName: [WCHAR; 1],
608}}
609pub type PUSB_PORT_CONNECTOR_PROPERTIES = *mut USB_PORT_CONNECTOR_PROPERTIES;
610STRUCT!{#[repr(packed)] struct USB_PROTOCOLS {
611    ul: ULONG,
612}}
613BITFIELD!{USB_PROTOCOLS ul: ULONG [
614    Usb110 set_Usb110[0..1],
615    Usb200 set_Usb200[1..2],
616    Usb300 set_Usb300[2..3],
617    ReservedMBZ set_ReservedMBZ[3..32],
618]}
619pub type PUSB_PROTOCOLS = *mut USB_PROTOCOLS;
620STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {
621    ul: ULONG,
622}}
623BITFIELD!{USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS ul: ULONG [
624    DeviceIsOperatingAtSuperSpeedOrHigher set_DeviceIsOperatingAtSuperSpeedOrHigher[0..1],
625    DeviceIsSuperSpeedCapableOrHigher set_DeviceIsSuperSpeedCapableOrHigher[1..2],
626    DeviceIsOperatingAtSuperSpeedPlusOrHigher set_DeviceIsOperatingAtSuperSpeedPlusOrHigher[2..3],
627    DeviceIsSuperSpeedPlusCapableOrHigher set_DeviceIsSuperSpeedPlusCapableOrHigher[3..4],
628    ReservedMBZ set_ReservedMBZ[4..32],
629]}
630pub type PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS
631    = *mut USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;
632STRUCT!{#[repr(packed)] struct USB_NODE_CONNECTION_INFORMATION_EX_V2 {
633    ConnectionIndex: ULONG,
634    Length: ULONG,
635    SupportedUsbProtocols: USB_PROTOCOLS,
636    Flags: USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS,
637}}
638pub type PUSB_NODE_CONNECTION_INFORMATION_EX_V2 = *mut USB_NODE_CONNECTION_INFORMATION_EX_V2;
639pub const USB_TRANSPORT_CHARACTERISTICS_VERSION_1: ULONG = 0x01;
640pub const USB_TRANSPORT_CHARACTERISTICS_LATENCY_AVAILABLE: ULONG = 0x1;
641pub const USB_TRANSPORT_CHARACTERISTICS_BANDWIDTH_AVAILABLE: ULONG = 0x2;
642STRUCT!{#[repr(packed)] struct USB_TRANSPORT_CHARACTERISTICS {
643    Version: ULONG,
644    TransportCharacteristicsFlags: ULONG,
645    CurrentRoundtripLatencyInMilliSeconds: ULONG64,
646    MaxPotentialBandwidth: ULONG64,
647}}
648pub type PUSB_TRANSPORT_CHARACTERISTICS = *mut USB_TRANSPORT_CHARACTERISTICS;
649pub const USB_REGISTER_FOR_TRANSPORT_LATENCY_CHANGE: ULONG = 0x1;
650pub const USB_REGISTER_FOR_TRANSPORT_BANDWIDTH_CHANGE: ULONG = 0x2;
651DECLARE_HANDLE!(USB_CHANGE_REGISTRATION_HANDLE, USB_CHANGE_REGISTRATION_HANDLE__);
652STRUCT!{#[repr(packed)] struct USB_TRANSPORT_CHARACTERISTICS_CHANGE_REGISTRATION {
653    ChangeNotificationInputFlags: ULONG,
654    Handle: USB_CHANGE_REGISTRATION_HANDLE,
655    UsbTransportCharacteristics: USB_TRANSPORT_CHARACTERISTICS,
656}}
657pub type PUSB_TRANSPORT_CHARACTERISTICS_CHANGE_REGISTRATION
658    = *mut USB_TRANSPORT_CHARACTERISTICS_CHANGE_REGISTRATION;
659STRUCT!{#[repr(packed)] struct USB_TRANSPORT_CHARACTERISTICS_CHANGE_NOTIFICATION {
660    Handle: USB_CHANGE_REGISTRATION_HANDLE,
661    UsbTransportCharacteristics: USB_TRANSPORT_CHARACTERISTICS,
662}}
663pub type PUSB_TRANSPORT_CHARACTERISTICS_CHANGE_NOTIFICATION
664    = *mut USB_TRANSPORT_CHARACTERISTICS_CHANGE_NOTIFICATION;
665STRUCT!{#[repr(packed)] struct USB_TRANSPORT_CHARACTERISTICS_CHANGE_UNREGISTRATION {
666    Handle: USB_CHANGE_REGISTRATION_HANDLE,
667}}
668pub type PUSB_TRANSPORT_CHARACTERISTICS_CHANGE_UNREGISTRATION
669    = *mut USB_TRANSPORT_CHARACTERISTICS_CHANGE_UNREGISTRATION;
670pub const USB_DEVICE_CHARACTERISTICS_VERSION_1: ULONG = 0x01;
671pub const USB_DEVICE_CHARACTERISTICS_MAXIMUM_PATH_DELAYS_AVAILABLE: ULONG = 0x1;
672STRUCT!{#[repr(packed)] struct USB_DEVICE_CHARACTERISTICS {
673    Version: ULONG,
674    Reserved: [ULONG; 2],
675    UsbDeviceCharacteristicsFlags: ULONG,
676    MaximumSendPathDelayInMilliSeconds: ULONG,
677    MaximumCompletionPathDelayInMilliSeconds: ULONG,
678}}
679pub type PUSB_DEVICE_CHARACTERISTICS = *mut USB_DEVICE_CHARACTERISTICS;
680STRUCT!{#[repr(packed)] struct USB_START_TRACKING_FOR_TIME_SYNC_INFORMATION {
681    TimeTrackingHandle: HANDLE,
682    IsStartupDelayTolerable: BOOLEAN,
683}}
684pub type PUSB_START_TRACKING_FOR_TIME_SYNC_INFORMATION
685    = *mut USB_START_TRACKING_FOR_TIME_SYNC_INFORMATION;
686STRUCT!{#[repr(packed)] struct USB_STOP_TRACKING_FOR_TIME_SYNC_INFORMATION {
687    TimeTrackingHandle: HANDLE,
688}}
689pub type PUSB_STOP_TRACKING_FOR_TIME_SYNC_INFORMATION
690    = *mut USB_STOP_TRACKING_FOR_TIME_SYNC_INFORMATION;
691STRUCT!{#[repr(packed)] struct USB_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC_INFORMATION {
692    TimeTrackingHandle: HANDLE,
693    InputFrameNumber: ULONG,
694    InputMicroFrameNumber: ULONG,
695    QueryPerformanceCounterAtInputFrameOrMicroFrame: LARGE_INTEGER,
696    QueryPerformanceCounterFrequency: LARGE_INTEGER,
697    PredictedAccuracyInMicroSeconds: ULONG,
698    CurrentGenerationID: ULONG,
699    CurrentQueryPerformanceCounter: LARGE_INTEGER,
700    CurrentHardwareFrameNumber: ULONG,
701    CurrentHardwareMicroFrameNumber: ULONG,
702    CurrentUSBFrameNumber: ULONG,
703}}
704pub type PUSB_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC_INFORMATION
705    = *mut USB_FRAME_NUMBER_AND_QPC_FOR_TIME_SYNC_INFORMATION;