C# Запрошенный HardwareID не совпадает с идентификатором экземпляра через SetupApi
Моя главная цель - включить / отключить USB-устройство, подключенное через Bluetooth, в коде.
Сейчас я запрашиваю устройства следующим образом:
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_PnPEntity");
foreach (ManagementObject queryObj in searcher.Get())
{
if (queryObj["Caption"] != null && queryObj["Caption"].ToString().Contains("(COM"))
{
if(queryObj["Caption"] != null)
{
string caption = queryObj["Caption"].ToString();
string[] portNames = SerialPort.GetPortNames();
foreach (var port in portNames)
{
if(caption.Contains(port))
{
settings.PortName = port;
break;
}
}
}
if (queryObj["HardwareID"] != null)
{
string[] hardwareID = queryObj["HardwareID"] as string[];
// set our hardwareID
settings.HardwareID = hardwareID.FirstOrDefault();
}
if (queryObj["ClassGuid"] != null)
{
Guid classGuid = Guid.Parse(queryObj["ClassGuid"].ToString());
// set our guid
settings.Guid = classGuid;
}
}
}
Который я храню в локальной базе данных для использования, когда я хочу включить / отключить мое устройство. Я следую принятому ответу в этом посте для обработки функции включения / выключения. Однако при пошаговом выполнении этого кода он не совпадает с идентификатором оборудования, который я извлек при первоначальном запросе устройств.
Вот код, который обрабатывает сравнение:
// Find the index of the particular DeviceInfoData for the instanceId.
private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle, DeviceInfoData[] diData, string instanceId)
{
const int ERROR_INSUFFICIENT_BUFFER = 122;
for (int index = 0; index <= diData.Length - 1; index++)
{
StringBuilder sb = new StringBuilder(1);
int requiredSize = 0;
bool result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
{
sb.Capacity = requiredSize;
result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
}
if (result == false)
throw new Win32Exception();
if (instanceId.Equals(sb.ToString()))
{
return index;
}
}
// not found
return -1;
}
SetupDiGetDeviceInstanceId возвращает только 1 результат на основе classGuid, возвращенного из исходного запроса, поэтому я предполагаю, что это правильное устройство, просто неправильный идентификатор для сравнения.
Я читал, что идентификатор экземпляра устройства может отличаться в зависимости от ОС, однако, если я запрашиваю устройства на одном и том же компьютере, не должен ли аппаратный идентификатор быть согласованным?
Начальный запрос HardwareID: "FTDIBUS \ COMPORT & VID_0403 & PID_6001"
Идентификатор экземпляра: "FTDIBUS\VID_0403+PID_6001+A506WQGGA\0000"
ОС: Windows 10
Между этими двумя значениями есть четкое сходство, но оно продолжает терпеть неудачу из-за того, что они не совпадают. Я совсем не знаком с этой областью, поэтому любая помощь будет отличной.