C#查询到的HardwareID与通过SetupApi的实例ID不匹配

时间:2019-01-17 20:39:13

标签: c# setupapi device-manager

我的主要目标是通过代码启用/禁用USB蓝牙连接的加密狗设备。

现在我以这种方式查询设备:

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;
                }
            }
        }

我想将其存储在本地数据库中以便启用/禁用设备时使用。我正在遵循此post上可接受的答案来处理启用/禁用功能。但是,单步执行此代码时,它与我最初查询设备时提取的硬件ID不匹配。

以下是处理比较的代码:

// 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仅基于初始查询返回的classGuid返回1个结果,因此,我假设这是正确的设备,只是要与之比较的错误ID。

我已经了解到,设备实例ID可能因操作系统而异,但是,如果我要查询同一台计算机上的设备,那么hardwareID是否应保持一致?

初始查询的HardwareID :“ FTDIBUS \ COMPORT&VID_0403&PID_6001”

实例ID :“ FTDIBUS \ VID_0403 + PID_6001 + A506WQGGA \ 0000”

操作系统:Windows 10

两个值之间有明显的相似性,但是由于它们不相同,因此继续失败。我对这方面一点都不熟悉,所以任何帮助都会很棒。

0 个答案:

没有答案