private static byte[] GetUsbDeviceProperty(
                Interop.Windows.SafeDevInfoSetHandle deviceInfoSetHandle,
                ref Interop.Windows.SetupDeviceInfoData deviceInfoData,
                Interop.Windows.SetupDeviceRegistryProperty property,
                ref Interop.Windows.RegType regType)
            {
                var requiredSize = 0U;
                var success      = Interop.Windows.SetupDiGetDeviceRegistryPropertyW(
                    deviceInfoSetHandle,
                    ref deviceInfoData,
                    property,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    0,
                    ref requiredSize
                    );

                if (!success)
                {
                    var win32Error = Marshal.GetLastWin32Error();
                    if (win32Error == (int)Interop.Windows.Error.InvalidData)
                    {
                        Logger.GetInstance(typeof(Windows)).Debug($"The requested property {property} does not exist");
                        regType = 0;
                        return(null);
                    }
                    if (win32Error != (int)Interop.Windows.Error.InsufficientBuffer)
                    {
                        Logger.GetInstance(typeof(Windows)).Error($"Can not query USB device registry property, error code: {win32Error}");
                        regType = 0;
                        return(null);
                    }
                }

                var propertyBuffer = new byte[requiredSize];

                success = Interop.Windows.SetupDiGetDeviceRegistryPropertyW(
                    deviceInfoSetHandle,
                    ref deviceInfoData,
                    property,
                    ref regType,
                    propertyBuffer,
                    (uint)propertyBuffer.Length,
                    ref requiredSize
                    );
                if (!success)
                {
                    var win32Error = Marshal.GetLastWin32Error();
                    Logger.GetInstance(typeof(Windows)).Error($"Can not get USB device registry property, error code: {win32Error}");
                    return(null);
                }
                return(propertyBuffer);
            }
            private static string GetUsbDeviceStringProperty(
                Interop.Windows.SafeDevInfoSetHandle deviceInfoSetHandle,
                ref Interop.Windows.SetupDeviceInfoData deviceInfoData,
                Interop.Windows.SetupDeviceRegistryProperty property)
            {
                var regType = Interop.Windows.RegType.None;
                var bytes   = GetUsbDeviceProperty(
                    deviceInfoSetHandle,
                    ref deviceInfoData,
                    property,
                    ref regType
                    );

                if (bytes == null || bytes.Length == 0 || regType != Interop.Windows.RegType.Sz)
                {
                    return(string.Empty);
                }
                return(Encoding.Unicode.GetString(bytes, 0, bytes.Length - sizeof(char)).Trim());
            }
            private static string[] GetUsbDeviceMultiStringProperty(
                Interop.Windows.SafeDevInfoSetHandle deviceInfoSetHandle,
                ref Interop.Windows.SetupDeviceInfoData deviceInfoData,
                Interop.Windows.SetupDeviceRegistryProperty property)
            {
                var regType = Interop.Windows.RegType.None;
                var bytes   = GetUsbDeviceProperty(
                    deviceInfoSetHandle,
                    ref deviceInfoData,
                    property,
                    ref regType
                    );

                if (bytes == null || bytes.Length == 0 || regType != Interop.Windows.RegType.MultiSz)
                {
                    return(new string[] { });
                }
                return(Encoding.Unicode.GetString(bytes).Split(
                           new[] { '\0' },
                           StringSplitOptions.RemoveEmptyEntries
                           ));
            }