[DllImport("CfgMgr32.dll", CharSet = CharSet.Unicode)]
static extern uint CM_Get_Device_Interface_List(ref Guid interfaceClassGuid, string deviceID, char[] buffer, uint bufferLength, uint flags);
const ulong CM_GETIDLIST_FILTER_PRESENT = 0x00000100;
const uint CM_GET_DEVICE_INTERFACE_LIST_PRESENT = 0x0;
const int CR_SUCCESS = 0x0;
static Guid GUID_DEVINTERFACE_COMPORT = new Guid("{86E0D1E0-8089-11D0-9CE4-08003E301F73}");
public static string[] GetPortNames()
{
var cr = CM_Get_Device_Interface_List_Size(out uint size, ref GUID_DEVINTERFACE_COMPORT, null, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
if (cr == CR_SUCCESS && size != 0)
{
char[] data = new char[size];
cr = CM_Get_Device_Interface_List(ref GUID_DEVINTERFACE_COMPORT, null, data, (uint)data.Length, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
if (cr == CR_SUCCESS)
return new string(data).Split('\0').ToList().Where(m=>!string.IsNullOrEmpty(m)).ToArray();
}
return null;
}