#include <windows.h>
#include <Setupapi.h>
#include <stdio.h>
static /*const*/ GUID hidGUID = { 0xA5DCBF10L, 0x6530, 0x11D2,
{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
char **split ( char *string, const char sep) {
char **lista;
char *p = string;
int i = 0;
int pos;
const int len = strlen (string);
lista = (char **) malloc (sizeof (char *));
if (lista == NULL) { /* Cannot allocate memory */
return NULL;
}
lista[pos=0] = NULL;
while (i <len) {
while ((p[i] == sep) && (i <len))
i++;
if (i <len) {
char **tmp = (char **) realloc (lista , (pos + 2) * sizeof (char *));
if (tmp == NULL) { /* Cannot allocate memory */
free (lista);
return NULL;
}
lista = tmp;
tmp = NULL;
lista[pos + 1] = NULL;
lista[pos] = (char *) malloc (sizeof (char));
if (lista[pos] == NULL) { /* Cannot allocate memory */
for (i = 0; i <pos; i++)
free (lista[i]);
free (lista);
return NULL;
}
int j = 0;
for (i; ((p[i] != sep) && (i <len)); i++) {
lista[pos][j] = p[i];
j++;
char *tmp2 = (char *) realloc (lista[pos],(j + 1) * sizeof (char));
if (lista[pos] == NULL) { /* Cannot allocate memory */
for (i = 0; i <pos; i++)
free (lista[i]);
free (lista);
return NULL;
}
lista[pos] = tmp2;
tmp2 = NULL;
}
lista[pos][j] = '\0';
pos++;
}
}
return lista;
}
HANDLE connectDeviceNumber(DWORD deviceIndex)
{
//GUID hidGUID;
HDEVINFO hardwareDeviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
ULONG requiredSize;
HANDLE deviceHandle = INVALID_HANDLE_VALUE;
DWORD result;
//Get the HID GUID value - used as mask to get list of devices
//HidD_GetHidGuid (&hidGUID);
//hidGUID = new GUID(GUID GUID_DEVINTERFACE_USB_DEVICE);
//Get a list of devices matching the criteria (hid interface, present)
hardwareDeviceInfoSet = SetupDiGetClassDevs (&hidGUID,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_DEVICEINTERFACE)); // Function class devices.
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
//Go through the list and get the interface data
result = SetupDiEnumDeviceInterfaces (hardwareDeviceInfoSet,
NULL, //infoData,
&hidGUID, //interfaceClassGuid,
deviceIndex,
&deviceInterfaceData);
/* Failed to get a device - possibly the index is larger than the number of devices */
if (result == FALSE)
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
printf("hidin: -- failed to get specified device number");
return INVALID_HANDLE_VALUE;
}
//Get the details with null values to get the required size of the buffer
SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,
NULL, //interfaceDetail,
0, //interfaceDetailSize,
&requiredSize,
0); //infoData))
//Allocate the buffer
deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
//Fill the buffer with the device details
if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,
deviceDetail,
requiredSize,
&requiredSize,
NULL))
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
free (deviceDetail);
printf("hidin: -- failed to get device info");
return INVALID_HANDLE_VALUE;
}
char **listSplit;
listSplit = split(deviceDetail->DevicePath,'#');
//printf("Opening device with path: %s", deviceDetail->DevicePath);
printf("Serial: %s\n",listSplit[2] );
}
int main(int argc, char* argv[]) {
connectDeviceNumber(0);
getchar();
return 0;
}