using Microsoft.Win32; using static NibblePoker.Library.RegistryHelpers.RegistryHelpers; namespace NibblePoker.Library.ComPortWatcher; public static class ComPortHelper { private const string RegistryKeySerial = "HARDWARE\\DEVICEMAP\\SERIALCOMM"; private const string RegistryKeyDeviceEnum = "SYSTEM\\ControlSet001\\Enum"; private static readonly string[] IgnoredRegistryDeviceEnums = { "ACPI", "ACPI_HAL", "HDAUDIO", "SCSI", "STORAGE", "SW", "SWD", "UEFI" }; private const string RegistryNameFriendlyName = "FriendlyName"; private static void AddFriendlyNamesToPortsInfo(List comPortsInfo) { List subKeys = GetSubKeys(Registry.LocalMachine, RegistryKeyDeviceEnum); List intermediateSubKeys = new List(); List finalSubKeys = new List(); List friendlyNames = new List(); foreach(var subKey in subKeys.Where(subKey => !IgnoredRegistryDeviceEnums.Contains(subKey))) { intermediateSubKeys.AddRange(GetSubKeys( Registry.LocalMachine, RegistryKeyDeviceEnum + "\\" + subKey, true)); } subKeys.Clear(); foreach(string subSubKey in intermediateSubKeys) { finalSubKeys.AddRange(GetSubKeys( Registry.LocalMachine, subSubKey, true)); } intermediateSubKeys.Clear(); foreach(string finalSubKey in finalSubKeys) { Dictionary mappedKeyValues = GetMappedKeyNameStringValue(Registry.LocalMachine, finalSubKey); if(mappedKeyValues.ContainsKey(RegistryNameFriendlyName)) { friendlyNames.Add(mappedKeyValues[RegistryNameFriendlyName]); } } finalSubKeys.Clear(); foreach(ComPortInfo comPortInfo in comPortsInfo) { foreach(string friendlyName in friendlyNames) { if(!friendlyName.Contains("(" + comPortInfo.RawName + ")")) { continue; } comPortInfo.FriendlyName = friendlyName; break; } } friendlyNames.Clear(); } public static List GetComList(bool addFriendlyNames = false) { List portsInfo = new List(); foreach(KeyValuePair rawPortInfo in GetMappedKeyNameStringValue(Registry.LocalMachine, RegistryKeySerial)) { portsInfo.Add(new ComPortInfo(rawPortInfo.Value, rawPortInfo.Key)); } if(addFriendlyNames && portsInfo.Count > 0) { AddFriendlyNamesToPortsInfo(portsInfo); } return portsInfo; } }