Skip to content

Instantly share code, notes, and snippets.

@sergev
Created October 28, 2018 05:02
Show Gist options
  • Save sergev/b55656ebcdfa1cd8a40f0d9ecdeac1bf to your computer and use it in GitHub Desktop.
Save sergev/b55656ebcdfa1cd8a40f0d9ecdeac1bf to your computer and use it in GitHub Desktop.
#include <setupapi.h>
#define MAX_NAME_PORTS 7
#define RegDisposition_OpenExisting (0x00000001) // open key only if exists
#define CM_REGISTRY_HARDWARE (0x00000000)
typedef DWORD WINAPI
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);
HANDLE BeginEnumeratePorts(VOID)
{
BOOL guidTest=FALSE;
DWORD RequiredSize=0;
int j;
HDEVINFO DeviceInfoSet;
char* buf;
guidTest=SetupDiClassGuidsFromNameA(
"Ports",0,0,&RequiredSize);
if(RequiredSize < 1)return -1;
buf=malloc(RequiredSize*sizeof(GUID));
guidTest=SetupDiClassGuidsFromNameA(
"Ports",buf,RequiredSize*sizeof(GUID),&RequiredSize);
if(!guidTest)return -1;
DeviceInfoSet=SetupDiGetClassDevs(
buf,NULL,NULL,DIGCF_PRESENT);
if(DeviceInfoSet == INVALID_HANDLE_VALUE)return -1;
free(buf);
return DeviceInfoSet;
}
BOOL EnumeratePortsNext(HANDLE DeviceInfoSet, LPTSTR lpBuffer)
{
static CM_Open_DevNode_Key OpenDevNodeKey=NULL;
static HINSTANCE CfgMan;
int res1;
char DevName[MAX_NAME_PORTS]={0};
static int numDev=0;
int numport;
SP_DEVINFO_DATA DeviceInfoData={0};
DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
if(!DeviceInfoSet || !lpBuffer)return -1;
if(!OpenDevNodeKey)
{
CfgMan=LoadLibrary("cfgmgr32");
if(!CfgMan)return FALSE;
OpenDevNodeKey=
(CM_Open_DevNode_Key)GetProcAddress(CfgMan,"CM_Open_DevNode_Key");
if(!OpenDevNodeKey)
{
FreeLibrary(CfgMan);
return FALSE;
}
}
while(TRUE)
{
HKEY KeyDevice;
DWORD len;
res1=SetupDiEnumDeviceInfo(
DeviceInfoSet,numDev,&DeviceInfoData);
if(!res1)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
FreeLibrary(CfgMan);
OpenDevNodeKey=NULL;
return FALSE;
}
res1=OpenDevNodeKey(DeviceInfoData.DevInst,KEY_QUERY_VALUE,0,
RegDisposition_OpenExisting,&KeyDevice,CM_REGISTRY_HARDWARE);
if(res1 != ERROR_SUCCESS)return NULL;
len=MAX_NAME_PORTS;
res1=RegQueryValueEx(
KeyDevice, // handle of key to query
"portname", // address of name of value to query
NULL, // reserved
NULL, // address of buffer for value type
DevName, // address of data buffer
&len // address of data buffer size
);
RegCloseKey(KeyDevice);
if(res1 != ERROR_SUCCESS)return NULL;
numDev++;
if(memicmp(DevName, "com", 3))continue;
numport=atoi(DevName+3);
if(numport > 0 && numport <= 256)
{
strcpy(lpBuffer,DevName);
return TRUE;
}
FreeLibrary(CfgMan);
OpenDevNodeKey=NULL;
return FALSE;
}
}
BOOL EndEnumeratePorts(HANDLE DeviceInfoSet)
{
if(SetupDiDestroyDeviceInfoList(DeviceInfoSet))return TRUE;
else return FALSE;
}
@sergev
Copy link
Author

sergev commented Oct 28, 2018

					// To find out the serial port for our K8090 device,
					// we'll need to check the registry:

					hKey = SetupDiOpenDevRegKey(
								hDevInfo,
								&DevData,
								DICS_FLAG_GLOBAL,
								0,
								DIREG_DEV,
								KEY_READ
							);

					dwType = REG_SZ;
					dwSize = sizeof(lpData);
					RegQueryValueEx(hKey, _T("PortName"), NULL, &dwType, lpData, &dwSize);
					RegCloseKey(hKey);

					// Eureka!
					wprintf(_T("Found a device on port '%s'\n"), lpData);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment