📄 osrbulk.cpp
字号:
ReadLen = atoi(&argv[i+1][0]);
WriteLen = ReadLen;
fWrite = TRUE;
fRead = TRUE;
i++;
break;
case 'c':
case 'C':
IterationCount = atoi(&argv[i+1][0]);
i++;
break;
case 'u':
case 'U':
fDumpUsbConfig = TRUE;
i++;
break;
case 'v':
case 'V':
fDumpReadData = TRUE;
i++;
break;
default:
usage();
}
}
}
}
/*++
Routine Description:
Called to verify read and write buffers match for loopback test
Arguments:
buffers to compare and length
Return Value:
TRUE if buffers match, else FALSE
--*/
BOOL compare_buffs(char *buff1, char *buff2, int length)
{
int ok = 1;
if (memcmp(buff1, buff2, length )) {
// Edi, and Esi point to the mismatching char and ecx indicates the
// remaining length.
ok = 0;
}
return ok;
}
///////////////////////////////////////////////////////////////////////////////
//
// Dump
//
// Called to do formatted ascii dump to console from io buffer.
//
// INPUTS:
//
// b - Address of buffer
// len - length
//
// OUTPUTS:
//
// None
//
// RETURNS:
//
// None
//
// NOTES:
//
///////////////////////////////////////////////////////////////////////////////
void Dump(CHAR *b,int len)
/*++
Routine Description:
Called to do formatted ascii dump to console of the io buffer
Arguments:
buffer and length
Return Value:
none
--*/
{
ULONG i;
ULONG longLen = (ULONG)len / sizeof( ULONG );
PULONG pBuf = (PULONG) b;
// dump an ordinal ULONG for each sizeof(ULONG)'th byte
printf("\n****** BEGIN DUMP LEN decimal %d, 0x%x\n", len,len);
for (i=0; i<longLen; i++) {
printf("%04X ", *pBuf++);
if (i % NPERLN == (NPERLN - 1)) {
printf("\n");
}
}
if (i % NPERLN != 0) {
printf("\n");
}
printf("\n****** END DUMP LEN decimal %d, 0x%x\n", len,len);
}
// Begin, routines for USB configuration dump (Cmdline "rwbulk -u" )
/*++
Routine Description:
Called to get ascii string of USB descriptor
Arguments:
PUSB_ENDPOINT_DESCRIPTOR->bDescriptorType or
PUSB_DEVICE_DESCRIPTOR->bDescriptorType or
PUSB_INTERFACE_DESCRIPTOR->bDescriptorType or
PUSB_STRING_DESCRIPTOR->bDescriptorType or
PUSB_POWER_DESCRIPTOR->bDescriptorType or
PUSB_CONFIGURATION_DESCRIPTOR->bDescriptorType
Return Value:
ptr to string
--*/
char *usbDescriptorTypeString(UCHAR bDescriptorType )
{
switch(bDescriptorType) {
case USB_DEVICE_DESCRIPTOR_TYPE:
return "USB_DEVICE_DESCRIPTOR_TYPE";
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
return "USB_CONFIGURATION_DESCRIPTOR_TYPE";
case USB_STRING_DESCRIPTOR_TYPE:
return "USB_STRING_DESCRIPTOR_TYPE";
case USB_INTERFACE_DESCRIPTOR_TYPE:
return "USB_INTERFACE_DESCRIPTOR_TYPE";
case USB_ENDPOINT_DESCRIPTOR_TYPE:
return "USB_ENDPOINT_DESCRIPTOR_TYPE";
#ifdef USB_POWER_DESCRIPTOR_TYPE // this is the older definintion which is actually obsolete
// workaround for temporary bug in 98ddk, older USB100.h file
case USB_POWER_DESCRIPTOR_TYPE:
return "USB_POWER_DESCRIPTOR_TYPE";
#endif
#ifdef USB_RESERVED_DESCRIPTOR_TYPE // this is the current version of USB100.h as in NT5DDK
case USB_RESERVED_DESCRIPTOR_TYPE:
return "USB_RESERVED_DESCRIPTOR_TYPE";
case USB_CONFIG_POWER_DESCRIPTOR_TYPE:
return "USB_CONFIG_POWER_DESCRIPTOR_TYPE";
case USB_INTERFACE_POWER_DESCRIPTOR_TYPE:
return "USB_INTERFACE_POWER_DESCRIPTOR_TYPE";
#endif // for current nt5ddk version of USB100.h
default:
return "??? UNKNOWN!!";
}
}
/*++
Routine Description:
Called to get ascii string of endpt descriptor type
Arguments:
PUSB_ENDPOINT_DESCRIPTOR->bmAttributes
Return Value:
ptr to string
--*/
char *usbEndPointTypeString(UCHAR bmAttributes)
{
UINT typ = bmAttributes & USB_ENDPOINT_TYPE_MASK;
switch( typ) {
case USB_ENDPOINT_TYPE_INTERRUPT:
return "USB_ENDPOINT_TYPE_INTERRUPT";
case USB_ENDPOINT_TYPE_BULK:
return "USB_ENDPOINT_TYPE_BULK";
case USB_ENDPOINT_TYPE_ISOCHRONOUS:
return "USB_ENDPOINT_TYPE_ISOCHRONOUS";
case USB_ENDPOINT_TYPE_CONTROL:
return "USB_ENDPOINT_TYPE_CONTROL";
default:
return "??? UNKNOWN!!";
}
}
/*++
Routine Description:
Called to get ascii string of USB_CONFIGURATION_DESCRIPTOR attributes
Arguments:
PUSB_CONFIGURATION_DESCRIPTOR->bmAttributes
Return Value:
ptr to string
--*/
char *usbConfigAttributesString(UCHAR bmAttributes)
{
UINT typ = bmAttributes & USB_CONFIG_POWERED_MASK;
static CHAR usbAttributesBuffer[256];
memset(usbAttributesBuffer,0,sizeof(usbAttributesBuffer));
switch( typ) {
case USB_CONFIG_BUS_POWERED:
strcat(usbAttributesBuffer,"USB_CONFIG_BUS_POWERED");
break;
case USB_CONFIG_SELF_POWERED:
strcat(usbAttributesBuffer,"USB_CONFIG_SELF_POWERED");
break;
default:
break;
}
if(bmAttributes & USB_CONFIG_REMOTE_WAKEUP) {
strcat(usbAttributesBuffer," USB_CONFIG_REMOTE_WAKEUP");
}
return usbAttributesBuffer;
}
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB config descriptor
Arguments:
ptr to USB configuration descriptor
Return Value:
none
--*/
void print_USB_CONFIGURATION_DESCRIPTOR(PUSB_CONFIGURATION_DESCRIPTOR cd)
{
printf("\n===================\nUSB_CONFIGURATION_DESCRIPTOR\n");
printf(
"bLength = 0x%x, decimal %d\n", cd->bLength, cd->bLength
);
printf(
"bDescriptorType = 0x%x ( %s )\n", cd->bDescriptorType, usbDescriptorTypeString( cd->bDescriptorType )
);
printf(
"wTotalLength = 0x%x, decimal %d\n", cd->wTotalLength, cd->wTotalLength
);
printf(
"bNumInterfaces = 0x%x, decimal %d\n", cd->bNumInterfaces, cd->bNumInterfaces
);
printf(
"bConfigurationValue = 0x%x, decimal %d\n", cd->bConfigurationValue, cd->bConfigurationValue
);
printf(
"iConfiguration = 0x%x, decimal %d\n", cd->iConfiguration, cd->iConfiguration
);
printf(
"bmAttributes = 0x%x ( %s )\n", cd->bmAttributes, usbConfigAttributesString( cd->bmAttributes )
);
printf(
"MaxPower = 0x%x, decimal %d\n", cd->MaxPower, cd->MaxPower
);
}
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB interface descriptor
Arguments:
ptr to USB interface descriptor
Return Value:
none
--*/
void print_USB_INTERFACE_DESCRIPTOR(PUSB_INTERFACE_DESCRIPTOR id, UINT ix)
{
printf("\n-----------------------------\nUSB_INTERFACE_DESCRIPTOR #%d\n", ix);
printf(
"bLength = 0x%x\n", id->bLength
);
printf(
"bDescriptorType = 0x%x ( %s )\n", id->bDescriptorType, usbDescriptorTypeString( id->bDescriptorType )
);
printf(
"bInterfaceNumber = 0x%x\n", id->bInterfaceNumber
);
printf(
"bAlternateSetting = 0x%x\n", id->bAlternateSetting
);
printf(
"bNumEndpoints = 0x%x\n", id->bNumEndpoints
);
printf(
"bInterfaceClass = 0x%x\n", id->bInterfaceClass
);
printf(
"bInterfaceSubClass = 0x%x\n", id->bInterfaceSubClass
);
printf(
"bInterfaceProtocol = 0x%x\n", id->bInterfaceProtocol
);
printf(
"bInterface = 0x%x\n", id->iInterface
);
}
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB pipe information
Arguments:
ptr to USB pipe information
Return Value:
none
--*/
void print_USBD_PIPE_INFORMATION(PUSBD_PIPE_INFORMATION PipeInfo,ULONG PipeNumber)
{
PUCHAR text;
printf("\n-----------------------------\nUSBD_PIPE_INFORMATION #%d\n", PipeNumber);
printf(
"MaximumPacketSize = 0x%x\n", PipeInfo->MaximumPacketSize
);
printf(
"EndpointAddress = 0x%x\n", PipeInfo->EndpointAddress
);
printf(
"Interval = 0x%x\n", PipeInfo->Interval
);
switch(PipeInfo->PipeType) {
case UsbdPipeTypeControl:
text = (PUCHAR) "UsbdPipeTypeControl";
break;
case UsbdPipeTypeIsochronous:
text = (PUCHAR) "UsbdPipeTypeIsochronous";
break;
case UsbdPipeTypeBulk:
text = (PUCHAR) "UsbdPipeTypeBulk";
break;
case UsbdPipeTypeInterrupt:
text = (PUCHAR) "UsbdPipeTypeInterrupt";
break;
}
printf(
"PipeType = 0x%x %s\n", PipeInfo->PipeType,text
);
printf(
"PipeHandle = 0x%p\n", PipeInfo->PipeHandle
);
printf(
"MaximumTransferSize = 0x%x\n", PipeInfo->MaximumPacketSize
);
}
/*++
Routine Description:
Called to do formatted ascii dump to console of a USB interface information
Arguments:
ptr to USB interface information
Return Value:
none
--*/
void print_USBD_INTERFACE_INFORMATION(PUSBD_INTERFACE_INFORMATION InterfaceInformation)
{
printf("\n-----------------------------\nUSBD_INTERFACE_INFORMATION\n");
printf(
"Length = 0x%x\n", InterfaceInformation->Length
);
printf(
"InterfaceNumber = 0x%x\n", InterfaceInformation->InterfaceNumber
);
printf(
"AlternateSetting = 0x%x\n", InterfaceInformation->AlternateSetting
);
printf(
"Class = 0x%x\n", InterfaceInformation->Class
);
printf(
"SubClass = 0x%x\n", InterfaceInformation->SubClass
);
printf(
"Protocol = 0x%x\n", InterfaceInformation->Protocol
);
printf(
"InterfaceHandle = 0x%p\n", InterfaceInformation->InterfaceHandle
);
printf(
"NumberofPipes = 0x%x\n", InterfaceInformation->NumberOfPipes
);
for(ULONG index = 0; index < InterfaceInformation->NumberOfPipes; index++) {
print_USBD_PIPE_INFORMATION(&InterfaceInformation->Pipes[index],index);
}
}
/*++
Routine Description:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -