# ifndef GUID_CLASS_COMPORT
DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
# endif
void getPorts(YourPortStorageStruct *ports)
{
// WINDOWS SERIAL ENUM
GUID *guidDev;
HDEVINFO devInfo;
bool bok;
SP_DEVICE_INTERFACE_DATA ifcData;
DWORD detDataSize;
SP_DEVICE_INTERFACE_DETAIL_DATA *detData;
DWORD ii;
SP_DEVINFO_DATA devData;
char tempName[1024];
char tempDesc[1024];
COMHANDLE comHandle;
//setup
guidDev = (GUID*)&GUID_CLASS_COMPORT;
devInfo = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(devInfo == INVALID_HANDLE_VALUE)
return ports;
// enumerate the serial ports
detDataSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
detData = (SP_DEVICE_INTERFACE_DETAIL_DATA*)malloc(detDataSize);
ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
detData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bok = true;
ii = 0;
do
{
bok = SetupDiEnumDeviceInterfaces(devInfo, NULL, guidDev, ii, &ifcData);
if (bok)
{
//Got a device. Get the details.
devData.cbSize = sizeof(SP_DEVINFO_DATA);
bok = SetupDiGetDeviceInterfaceDetailW(devInfo, &ifcData, detData, detDataSize, NULL, &devData);
if (bok)
{
//take note of detData->DevicePath here
ports[ii].availiable = false;
ports[ii].path = detData->DevicePath;
if (SetupDiGetDeviceRegistryPropertyW(devInfo, &devData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)tempName, 512, NULL))
ports[i]].friendlyName = (ushort*)tempName;
if (SetupDiGetDeviceRegistryPropertyW(devInfo, &devData, SPDRP_DEVICEDESC, NULL, (PBYTE)tempDesc, 512, NULL))
ports[ii].description = tempDesc;
//test for port already used or usage error
comHandle = CreateFile(detData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (comHandle != INVALID_HANDLE_VALUE)
{
//port good, close it
ports[ii].availiable = true;
CloseHandle(comHandle);
}
}
}
ii++;
} while(bok);
if (detData != NULL)
free(detData);
if (devInfo != INVALID_HANDLE_VALUE)
SetupDiDestroyDeviceInfoList(devInfo);
return ports;
}