#include "examples.h"
BOOL Examples_GetTestDevice(KLST_HANDLE* DeviceList,
KLST_DEVINFO_HANDLE* DeviceInfo,
int argc,
char* argv[])
{
return Examples_GetTestDeviceEx(DeviceList,
DeviceInfo,
argc,
argv,
0);
}
BOOL Examples_GetArgVal(int argc, char* argv[], LPCSTR argName, PUINT argValue, BOOL isHex)
{
int argPos;
BOOL useNextArg = FALSE;
for (argPos = 1; argPos < argc; argPos++)
{
CHAR buf[128];
UINT i;
CHAR* pFound;
const UINT len = strlen(argv[argPos]);
for (i = 0; i < len && i < _countof(buf) - 1; i++)
buf[i] = (char) tolower(argv[argPos][i]);
buf[i] = 0;
if (useNextArg)
{
PCHAR pBuf = buf;
if (pBuf[0] == '\"') pBuf++;
if (pBuf[0] == '0' && (pBuf[1] == 'x'))
{
pBuf += 2;
isHex = TRUE;
}
*argValue = strtoul(pBuf, NULL, (isHex ? 16 : 10));
return TRUE;
}
pFound = strstr(buf, argName);
if (pFound)
{
pFound += strlen(argName);
if (pFound[0] == '=') pFound++;
if (pFound[0]=='\0')
{
useNextArg = TRUE;
continue;
}
if (pFound[0] == '0' && (pFound[1] == 'x'))
{
pFound += 2;
isHex = TRUE;
}
*argValue = strtoul(pFound, NULL, (isHex?16:10));
return TRUE;
}
}
return FALSE;
}
BOOL Examples_GetArgStr(int argc, char* argv[], LPCSTR argName, LPSTR argValue, PUINT argValLength)
{
int argPos;
BOOL useNextArg = FALSE;
for (argPos = 1; argPos < argc; argPos++)
{
CHAR buf[128];
CHAR* pFound;
UINT i;
const UINT len = strlen(argv[argPos]);
for (i = 0; i < len && i < _countof(buf) - 1; i++)
buf[i] = (char)tolower(argv[argPos][i]);
buf[i] = 0;
if (useNextArg)
{
PCHAR pBuf = buf;
*argValLength = min(strlen(buf), *argValLength);
if (buf[0]=='\"' && buf[strlen(buf)-1]=='\"')
{
pBuf++;
*argValLength = *argValLength-2;
}
strncpy(argValue, pBuf, *argValLength);
argValue[*argValLength] = '\0';
return TRUE;
}
pFound = strstr(buf, argName);
if (pFound)
{
pFound += strlen(argName);
if (pFound[0] == '=') pFound++;
if (pFound[0] == '\0')
{
useNextArg = TRUE;
continue;
}
*argValLength = min(strlen(pFound), *argValLength);
if (pFound[0] == '\"' && pFound[strlen(pFound)-1]=='\"')
{
pFound++;
*argValLength = *argValLength - 2;
}
strncpy(argValue, pFound, *argValLength);
argValue[*argValLength] = '\0';
return TRUE;
}
}
return FALSE;
}
BOOL Examples_GetTestDeviceEx(KLST_HANDLE* DeviceList,
KLST_DEVINFO_HANDLE* DeviceInfo,
int argc,
char* argv[],
KLST_FLAG Flags)
{
UINT vidArg = EXAMPLE_VID;
UINT pidArg = EXAMPLE_PID;
ULONG deviceCount = 0;
KLST_HANDLE deviceList = NULL;
KLST_DEVINFO_HANDLE deviceInfo = NULL;
*DeviceList = NULL;
*DeviceInfo = NULL;
Examples_GetArgVal(argc, argv, "vid=", &vidArg, TRUE);
Examples_GetArgVal(argc, argv, "pid=", &pidArg, TRUE);
if (!LstK_Init(&deviceList, Flags))
{
printf("Error initializing device list.\n");
return FALSE;
}
LstK_Count(deviceList, &deviceCount);
if (!deviceCount)
{
printf("Device list empty.\n");
SetLastError(ERROR_DEVICE_NOT_CONNECTED);
LstK_Free(deviceList);
return FALSE;
}
printf("Looking for device vid/pid %04X/%04X..\n", vidArg, pidArg);
LstK_FindByVidPid(deviceList, vidArg, pidArg, &deviceInfo);
if (deviceInfo)
{
*DeviceList = deviceList;
*DeviceInfo = deviceInfo;
printf("Using %04X:%04X (%s): %s - %s\n",
deviceInfo->Common.Vid,
deviceInfo->Common.Pid,
deviceInfo->Common.InstanceID,
deviceInfo->DeviceDesc,
deviceInfo->Mfg);
return TRUE;
}
else
{
CHAR programPath[MAX_PATH] = {0};
PCHAR programExe = programPath;
GetModuleFileNameA(GetModuleHandleA(NULL), programPath, sizeof(programPath));
while(strpbrk(programExe, "\\/")) programExe = strpbrk(programExe, "\\/") + 1;
printf("Device vid/pid %04X/%04X not found.\n\n", vidArg, pidArg);
printf("USAGE: %s vid=%04X pid=%04X\n\n", programExe, vidArg, pidArg);
LstK_Free(deviceList);
return FALSE;
}
}
BOOL Bench_Configure(KUSB_HANDLE UsbHandle,
BM_COMMAND Command,
UCHAR InterfaceNumber,
PKUSB_DRIVER_API DriverAPI,
PBM_TEST_TYPE TestType)
{
#if (EXAMPLES_USE_BENCHMARK_CONFIGURE==1)
DWORD transferred = 0;
BOOL success;
WINUSB_SETUP_PACKET Pkt;
KUSB_SETUP_PACKET* defPkt = (KUSB_SETUP_PACKET*)&Pkt;
memset(&Pkt, 0, sizeof(Pkt));
defPkt->BmRequest.Dir = BMREQUEST_DIR_DEVICE_TO_HOST;
defPkt->BmRequest.Type = BMREQUEST_TYPE_VENDOR;
defPkt->Request = (UCHAR) Command;
defPkt->Value = (UCHAR) * TestType;
defPkt->Index = InterfaceNumber;
defPkt->Length = 1;
if (DriverAPI)
success = DriverAPI->ControlTransfer(UsbHandle, Pkt, (PUCHAR)TestType, 1, &transferred, NULL);
else
success = UsbK_ControlTransfer(UsbHandle, Pkt, (PUCHAR)TestType, 1, &transferred, NULL);
return success;
#else
UNREFERENCED_PARAMETER(UsbHandle);
UNREFERENCED_PARAMETER(Command);
UNREFERENCED_PARAMETER(InterfaceNumber);
UNREFERENCED_PARAMETER(DriverAPI);
UNREFERENCED_PARAMETER(TestType);
return TRUE;
#endif
}