URB
typedef _Struct_size_bytes_(UrbHeader.Length) struct _URB {
union {
struct _URB_HEADER
UrbHeader;
struct _URB_SELECT_INTERFACE
UrbSelectInterface;
struct _URB_SELECT_CONFIGURATION
UrbSelectConfiguration;
struct _URB_PIPE_REQUEST
UrbPipeRequest;
struct _URB_FRAME_LENGTH_CONTROL
UrbFrameLengthControl;
struct _URB_GET_FRAME_LENGTH
UrbGetFrameLength;
struct _URB_SET_FRAME_LENGTH
UrbSetFrameLength;
struct _URB_GET_CURRENT_FRAME_NUMBER
UrbGetCurrentFrameNumber;
struct _URB_CONTROL_TRANSFER
UrbControlTransfer;
#if (_WIN32_WINNT >= 0x0600)
struct _URB_CONTROL_TRANSFER_EX
UrbControlTransferEx;
#endif
struct _URB_BULK_OR_INTERRUPT_TRANSFER
UrbBulkOrInterruptTransfer;
struct _URB_ISOCH_TRANSFER
UrbIsochronousTransfer;
struct _URB_CONTROL_DESCRIPTOR_REQUEST
UrbControlDescriptorRequest;
struct _URB_CONTROL_GET_STATUS_REQUEST
UrbControlGetStatusRequest;
struct _URB_CONTROL_FEATURE_REQUEST
UrbControlFeatureRequest;
struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
UrbControlVendorClassRequest;
struct _URB_CONTROL_GET_INTERFACE_REQUEST
UrbControlGetInterfaceRequest;
struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
UrbControlGetConfigurationRequest;
#if (_WIN32_WINNT >= 0x0501)
struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
UrbOSFeatureDescriptorRequest;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN8)
struct _URB_OPEN_STATIC_STREAMS
UrbOpenStaticStreams;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_RS3)
struct _URB_GET_ISOCH_PIPE_TRANSFER_PATH_DELAYS
UrbGetIsochPipeTransferPathDelays;
#endif
};
} URB, *PURB;
URB是一个其实就是一个大大的联合体,这里使用的是结构体URB_SELECT_CONFIGURATION
struct _URB_SELECT_CONFIGURATION {
struct _URB_HEADER Hdr;
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
USBD_INTERFACE_INFORMATION Interface;
URB_SELECT_INTERFACE定义如下:
struct _URB_SELECT_INTERFACE {
struct _URB_HEADER Hdr;
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
USBD_INTERFACE_INFORMATION Interface;
};
USBD_INTERFACE_INFORMATION定义如下:
typedef struct _USBD_INTERFACE_INFORMATION {
USHORT Length;
UCHAR InterfaceNumber;
UCHAR AlternateSetting;
UCHAR Class;
UCHAR SubClass;
UCHAR Protocol;
UCHAR Reserved;
USBD_INTERFACE_HANDLE InterfaceHandle;
ULONG NumberOfPipes;
USBD_PIPE_INFORMATION Pipes[1];
} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION;