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;