11
#pragma message("WARNING: OSR21_COMPAT SWITCH NOT SUPPORTED")
21
#define USBDI_VERSION 0x00000500
25
typedef LONG USBD_STATUS;
26
typedef PVOID USBD_PIPE_HANDLE;
27
typedef PVOID USBD_CONFIGURATION_HANDLE;
28
typedef PVOID USBD_INTERFACE_HANDLE;
30
typedef enum _USB_CONTROLLER_FLAVOR
46
} USB_CONTROLLER_FLAVOR;
48
typedef enum _USBD_PIPE_TYPE
51
UsbdPipeTypeIsochronous,
56
typedef struct _USBD_VERSION_INFORMATION
59
ULONG Supported_USB_Version;
60
} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION;
62
typedef struct _USBD_PIPE_INFORMATION
64
USHORT MaximumPacketSize;
65
UCHAR EndpointAddress;
67
USBD_PIPE_TYPE PipeType;
68
USBD_PIPE_HANDLE PipeHandle;
69
ULONG MaximumTransferSize;
71
} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION;
73
typedef struct _USBD_DEVICE_INFORMATION
76
PVOID UsbdDeviceHandle;
77
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
78
} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION;
80
typedef struct _USBD_INTERFACE_INFORMATION
83
UCHAR InterfaceNumber;
84
UCHAR AlternateSetting;
89
USBD_INTERFACE_HANDLE InterfaceHandle;
91
USBD_PIPE_INFORMATION Pipes[1];
92
} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION;
104
PVOID UsbdDeviceHandle;
108
struct _URB_SELECT_INTERFACE
110
struct _URB_HEADER Hdr;
111
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
112
USBD_INTERFACE_INFORMATION Interface;
115
struct _URB_SELECT_CONFIGURATION
117
struct _URB_HEADER Hdr;
118
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
119
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
120
USBD_INTERFACE_INFORMATION Interface;
123
struct _URB_PIPE_REQUEST
125
struct _URB_HEADER Hdr;
126
USBD_PIPE_HANDLE PipeHandle;
130
struct _URB_FRAME_LENGTH_CONTROL
132
struct _URB_HEADER Hdr;
135
struct _URB_GET_FRAME_LENGTH
137
struct _URB_HEADER Hdr;
142
struct _URB_SET_FRAME_LENGTH
144
struct _URB_HEADER Hdr;
145
LONG FrameLengthDelta;
148
struct _URB_GET_CURRENT_FRAME_NUMBER
150
struct _URB_HEADER Hdr;
154
struct _URB_CONTROL_DESCRIPTOR_REQUEST
156
struct _URB_HEADER Hdr;
159
ULONG TransferBufferLength;
160
PVOID TransferBuffer;
161
PMDL TransferBufferMDL;
162
struct _URB *UrbLink;
163
struct _URB_HCD_AREA hca;
166
UCHAR DescriptorType;
171
struct _URB_CONTROL_GET_STATUS_REQUEST
173
struct _URB_HEADER Hdr;
176
ULONG TransferBufferLength;
177
PVOID TransferBuffer;
178
PMDL TransferBufferMDL;
179
struct _URB *UrbLink;
180
struct _URB_HCD_AREA hca;
186
struct _URB_CONTROL_FEATURE_REQUEST
188
struct _URB_HEADER Hdr;
194
struct _URB *UrbLink;
195
struct _URB_HCD_AREA hca;
197
USHORT FeatureSelector;
202
struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
204
struct _URB_HEADER Hdr;
207
ULONG TransferBufferLength;
208
PVOID TransferBuffer;
209
PMDL TransferBufferMDL;
210
struct _URB *UrbLink;
211
struct _URB_HCD_AREA hca;
212
UCHAR RequestTypeReservedBits;
219
struct _URB_CONTROL_GET_INTERFACE_REQUEST
221
struct _URB_HEADER Hdr;
224
ULONG TransferBufferLength;
225
PVOID TransferBuffer;
226
PMDL TransferBufferMDL;
227
struct _URB *UrbLink;
228
struct _URB_HCD_AREA hca;
234
struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
236
struct _URB_HEADER Hdr;
239
ULONG TransferBufferLength;
240
PVOID TransferBuffer;
241
PMDL TransferBufferMDL;
242
struct _URB *UrbLink;
243
struct _URB_HCD_AREA hca;
247
typedef struct _OS_STRING
250
UCHAR bDescriptorType;
251
WCHAR MicrosoftString[7];
254
} OS_STRING, *POS_STRING;
257
struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
259
struct _URB_HEADER Hdr;
262
ULONG TransferBufferLength;
263
PVOID TransferBuffer;
264
PMDL TransferBufferMDL;
265
struct _URB *UrbLink;
266
struct _URB_HCD_AREA hca;
270
UCHAR InterfaceNumber;
272
USHORT MS_FeatureDescriptorIndex;
276
struct _URB_CONTROL_TRANSFER
278
struct _URB_HEADER Hdr;
279
USBD_PIPE_HANDLE PipeHandle;
281
ULONG TransferBufferLength;
282
PVOID TransferBuffer;
283
PMDL TransferBufferMDL;
284
struct _URB *UrbLink;
285
struct _URB_HCD_AREA hca;
286
UCHAR SetupPacket[8];
289
struct _URB_BULK_OR_INTERRUPT_TRANSFER
291
struct _URB_HEADER Hdr;
292
USBD_PIPE_HANDLE PipeHandle;
294
ULONG TransferBufferLength;
295
PVOID TransferBuffer;
296
PMDL TransferBufferMDL;
297
struct _URB *UrbLink;
298
struct _URB_HCD_AREA hca;
301
typedef struct _USBD_ISO_PACKET_DESCRIPTOR
306
} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR;
308
struct _URB_ISOCH_TRANSFER
310
struct _URB_HEADER Hdr;
311
USBD_PIPE_HANDLE PipeHandle;
313
ULONG TransferBufferLength;
314
PVOID TransferBuffer;
315
PMDL TransferBufferMDL;
316
struct _URB *UrbLink;
317
struct _URB_HCD_AREA hca;
319
ULONG NumberOfPackets;
321
USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
330
struct _URB_SELECT_INTERFACE
332
struct _URB_SELECT_CONFIGURATION
333
UrbSelectConfiguration;
334
struct _URB_PIPE_REQUEST
336
struct _URB_FRAME_LENGTH_CONTROL
337
UrbFrameLengthControl;
338
struct _URB_GET_FRAME_LENGTH
340
struct _URB_SET_FRAME_LENGTH
342
struct _URB_GET_CURRENT_FRAME_NUMBER
343
UrbGetCurrentFrameNumber;
344
struct _URB_CONTROL_TRANSFER
346
struct _URB_BULK_OR_INTERRUPT_TRANSFER
347
UrbBulkOrInterruptTransfer;
348
struct _URB_ISOCH_TRANSFER
349
UrbIsochronousTransfer;
350
struct _URB_CONTROL_DESCRIPTOR_REQUEST
351
UrbControlDescriptorRequest;
352
struct _URB_CONTROL_GET_STATUS_REQUEST
353
UrbControlGetStatusRequest;
354
struct _URB_CONTROL_FEATURE_REQUEST
355
UrbControlFeatureRequest;
356
struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
357
UrbControlVendorClassRequest;
358
struct _URB_CONTROL_GET_INTERFACE_REQUEST
359
UrbControlGetInterfaceRequest;
360
struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
361
UrbControlGetConfigurationRequest;
362
struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
363
UrbOSFeatureDescriptorRequest;
367
#define USB_PORTATTR_NO_CONNECTOR 0x00000001
368
#define USB_PORTATTR_SHARED_USB2 0x00000002
369
#define USB_PORTATTR_MINI_CONNECTOR 0x00000004
370
#define USB_PORTATTR_OEM_CONNECTOR 0x00000008
371
#define USB_PORTATTR_OWNED_BY_CC 0x01000000
372
#define USB_PORTATTR_NO_OVERCURRENT_UI 0x02000000
373
#define USB_DEFAULT_DEVICE_ADDRESS 0
374
#define USB_DEFAULT_ENDPOINT_ADDRESS 0
375
#define USB_DEFAULT_MAX_PACKET 64
376
#define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1)
377
#define URB_FUNCTION_SELECT_CONFIGURATION 0x0000
378
#define URB_FUNCTION_SELECT_INTERFACE 0x0001
379
#define URB_FUNCTION_ABORT_PIPE 0x0002
380
#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003
381
#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004
382
#define URB_FUNCTION_GET_FRAME_LENGTH 0x0005
383
#define URB_FUNCTION_SET_FRAME_LENGTH 0x0006
384
#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007
385
#define URB_FUNCTION_CONTROL_TRANSFER 0x0008
386
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009
387
#define URB_FUNCTION_ISOCH_TRANSFER 0x000A
388
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B
389
#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C
390
#define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D
391
#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E
392
#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F
393
#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010
394
#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011
395
#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012
396
#define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013
397
#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014
398
#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015
399
#define URB_FUNCTION_RESERVED_0X0016 0x0016
400
#define URB_FUNCTION_VENDOR_DEVICE 0x0017
401
#define URB_FUNCTION_VENDOR_INTERFACE 0x0018
402
#define URB_FUNCTION_VENDOR_ENDPOINT 0x0019
403
#define URB_FUNCTION_CLASS_DEVICE 0x001A
404
#define URB_FUNCTION_CLASS_INTERFACE 0x001B
405
#define URB_FUNCTION_CLASS_ENDPOINT 0x001C
406
#define URB_FUNCTION_RESERVE_0X001D 0x001D
407
#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL 0x001E
408
#define URB_FUNCTION_CLASS_OTHER 0x001F
409
#define URB_FUNCTION_VENDOR_OTHER 0x0020
410
#define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021
411
#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022
412
#define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023
413
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024
414
#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025
415
#define URB_FUNCTION_GET_CONFIGURATION 0x0026
416
#define URB_FUNCTION_GET_INTERFACE 0x0027
417
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028
418
#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029
419
#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR 0x002A
420
#define URB_FUNCTION_RESERVE_0X002B 0x002B
421
#define URB_FUNCTION_RESERVE_0X002C 0x002C
422
#define URB_FUNCTION_RESERVE_0X002D 0x002D
423
#define URB_FUNCTION_RESERVE_0X002E 0x002E
424
#define URB_FUNCTION_RESERVE_0X002F 0x002F
425
#define URB_FUNCTION_SYNC_RESET_PIPE 0x0030
426
#define URB_FUNCTION_SYNC_CLEAR_STALL 0x0031
427
#define URB_FUNCTION_RESET_PIPE URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
428
#define USBD_TRANSFER_DIRECTION 0x00000001
429
#define USBD_SHORT_TRANSFER_OK 0x00000002
430
#define USBD_START_ISO_TRANSFER_ASAP 0x00000004
431
#define USBD_DEFAULT_PIPE_TRANSFER 0x00000008
432
#define USBD_TRANSFER_DIRECTION_FLAG(flags) ((flags) & USBD_TRANSFER_DIRECTION)
434
#define USBD_TRANSFER_DIRECTION_OUT 0
435
#define USBD_TRANSFER_DIRECTION_IN 1
436
#define VALID_TRANSFER_FLAGS_MASK (USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION | \
437
USBD_START_ISO_TRANSFER_ASAP | USBD_DEFAULT_PIPE_TRANSFER)
438
#define USBD_ISO_START_FRAME_RANGE 1024
439
#define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0)
440
#define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1)
441
#define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0)
442
#define USBD_STATUS_SUCCESS ((USBD_STATUS)0x00000000L)
443
#define USBD_STATUS_PENDING ((USBD_STATUS)0x40000000L)
444
#define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L)
445
#define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L)
446
#define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L)
447
#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L)
448
#define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L)
449
#define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L)
450
#define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L)
451
#define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L)
452
#define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L)
453
#define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL)
454
#define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL)
455
#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL)
456
#define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL)
457
#define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL)
458
#define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L)
459
#define USBD_STATUS_XACT_ERROR ((USBD_STATUS)0xC0000011L)
460
#define USBD_STATUS_BABBLE_DETECTED ((USBD_STATUS)0xC0000012L)
461
#define USBD_STATUS_DATA_BUFFER_ERROR ((USBD_STATUS)0xC0000013L)
462
#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L)
463
#define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L)
464
#define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L)
465
#define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L)
466
#define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L)
467
#define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L)
468
#define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L)
469
#define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L)
470
#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L)
471
#define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L)
472
#define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L)
473
#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED ((USBD_STATUS)0xC0000D00L)
474
#define USBD_STATUS_NOT_SUPPORTED ((USBD_STATUS)0xC0000E00L)
475
#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR ((USBD_STATUS)0xC0000F00L)
476
#define USBD_STATUS_INSUFFICIENT_RESOURCES ((USBD_STATUS)0xC0001000L)
477
#define USBD_STATUS_SET_CONFIG_FAILED ((USBD_STATUS)0xC0002000L)
478
#define USBD_STATUS_BUFFER_TOO_SMALL ((USBD_STATUS)0xC0003000L)
479
#define USBD_STATUS_INTERFACE_NOT_FOUND ((USBD_STATUS)0xC0004000L)
480
#define USBD_STATUS_INAVLID_PIPE_FLAGS ((USBD_STATUS)0xC0005000L)
481
#define USBD_STATUS_TIMEOUT ((USBD_STATUS)0xC0006000L)
482
#define USBD_STATUS_DEVICE_GONE ((USBD_STATUS)0xC0007000L)
483
#define USBD_STATUS_STATUS_NOT_MAPPED ((USBD_STATUS)0xC0008000L)
484
#define USBD_STATUS_CANCELED ((USBD_STATUS)0xC0010000L)
485
#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW ((USBD_STATUS)0xC0020000L)
486
#define USBD_STATUS_ISO_TD_ERROR ((USBD_STATUS)0xC0030000L)
487
#define USBD_STATUS_ISO_NA_LATE_USBPORT ((USBD_STATUS)0xC0040000L)
488
#define USBD_STATUS_ISO_NOT_ACCESSED_LATE ((USBD_STATUS)0xC0050000L)
489
#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE 0xFFFFFFFF
490
#define USBD_PF_CHANGE_MAX_PACKET 0x00000001
491
#define USBD_PF_SHORT_PACKET_OPT 0x00000002
492
#define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004
493
#define USBD_PF_MAP_ADD_TRANSFERS 0x00000008
494
#define USBD_PF_VALID_MASK (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_SHORT_PACKET_OPT | \
495
USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS)
496
#define OS_STRING_DESCRIPTOR_INDEX 0xEE
497
#define MS_GENRE_DESCRIPTOR_INDEX 0x0001
498
#define MS_POWER_DESCRIPTOR_INDEX 0x0002
499
#define MS_OS_STRING_SIGNATURE L"MSFT100"
500
#define USBD_PIPE_DIRECTION_IN(pipeInformation) ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK)