Ejemplo n.º 1
0
        public static bool GetUSBDevice(uint VID, uint PID, List <USBClass.DeviceProperties> DPList, bool GetCOMPort, uint?MI = null)
        {
            IntPtr num1 = Marshal.AllocHGlobal(1024);
            IntPtr num2 = IntPtr.Zero;

            DPList.Clear();
            try
            {
                var Enumerator      = "USB";
                var empty           = string.Empty;
                var str             = string.Empty;
                var lowerInvariant1 = ("VID_" + VID.ToString("X4") + "&PID_" + PID.ToString("X4")).ToLowerInvariant();
                if (MI.HasValue)
                {
                    str = ("MI_" + MI.Value.ToString("X2")).ToLowerInvariant();
                }

                num2 = Win32Wrapper.SetupDiGetClassDevs(IntPtr.Zero, Enumerator, IntPtr.Zero, 6);
                if (num2.ToInt64() != -1L)
                {
                    var  flag        = true;
                    uint MemberIndex = 0;
                    while (flag)
                    {
                        if (flag)
                        {
                            uint RequiredSize        = 0;
                            uint PropertyRegDataType = 0;
                            var  DeviceInfoData      = new USBClass.Win32Wrapper.SP_DEVINFO_DATA();
                            DeviceInfoData.cbSize = (uint)Marshal.SizeOf <USBClass.Win32Wrapper.SP_DEVINFO_DATA>(DeviceInfoData);
                            flag = Win32Wrapper.SetupDiEnumDeviceInfo(num2, MemberIndex, ref DeviceInfoData);
                            if (flag)
                            {
                                Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 1U, ref PropertyRegDataType, IntPtr.Zero, 0U, ref RequiredSize);
                                if (Marshal.GetLastWin32Error() == 122 && RequiredSize <= 1024U && Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 1U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                {
                                    var lowerInvariant2 = Marshal.PtrToStringAuto(num1).ToLowerInvariant();
                                    if (lowerInvariant2.Contains(lowerInvariant1) && (MI.HasValue && lowerInvariant2.Contains(str) || !MI.HasValue && !lowerInvariant2.Contains("mi")))
                                    {
                                        var deviceProperties = new DeviceProperties
                                        {
                                            FriendlyName = string.Empty
                                        };
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 12U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.FriendlyName = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DeviceType = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 25U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DeviceType = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DeviceClass = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 7U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DeviceClass = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DeviceManufacturer = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 11U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DeviceManufacturer = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DeviceLocation = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 13U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DeviceLocation = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DevicePath = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 35U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DevicePath = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DevicePhysicalObjectName = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 14U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DevicePhysicalObjectName = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.DeviceDescription = string.Empty;
                                        if (Win32Wrapper.SetupDiGetDeviceRegistryProperty(num2, ref DeviceInfoData, 0U, ref PropertyRegDataType, num1, 1024U, ref RequiredSize))
                                        {
                                            deviceProperties.DeviceDescription = Marshal.PtrToStringAuto(num1);
                                        }

                                        deviceProperties.COMPort = string.Empty;
                                        if (GetCOMPort)
                                        {
                                            IntPtr hKey = Win32Wrapper.SetupDiOpenDevRegKey(num2, ref DeviceInfoData, 1U, 0U, 1U, 131097U);
                                            if (hKey.ToInt32() == -1)
                                            {
                                                deviceProperties.COMPort = null;
                                            }
                                            else
                                            {
                                                var lpData   = new StringBuilder(1024);
                                                var capacity = (uint)lpData.Capacity;
                                                if (Win32Wrapper.RegQueryValueEx(hKey, "PortName", 0U, out var lpType, lpData, ref capacity) == 0)
                                                {
                                                    deviceProperties.COMPort = lpData.ToString();
                                                }

                                                Win32Wrapper.RegCloseKey(hKey);
                                            }
                                        }
                                        DPList.Add(deviceProperties);
                                    }
                                }
                            }
                        }
                        else
                        {
                            var lastWin32Error = (long)Marshal.GetLastWin32Error();
                        }
                        ++MemberIndex;
                    }
                }
                return(DPList.Count > 0);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                Win32Wrapper.SetupDiDestroyDeviceInfoList(num2);
                Marshal.FreeHGlobal(num1);
            }
        }