private static object ConvertPropertyValue(byte[] rawData, DEVPROP_TYPE type)
        {
            object value         = null;
            var    baseType      = type & DEVPROP_MASK_TYPE;
            var    typeModifiers = type & DEVPROP_MASK_TYPEMOD;

            switch (baseType)
            {
            case DEVPROP_TYPE.DEVPROP_TYPE_EMPTY:
            case DEVPROP_TYPE.DEVPROP_TYPE_NULL:
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_SBYTE:
                if (typeModifiers.HasFlag(DEVPROP_TYPEMOD_ARRAY))
                {
                    value = rawData.Cast <sbyte>();
                }
                else
                {
                    value = (sbyte)rawData[0];
                }
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_BYTE:
                if (typeModifiers.HasFlag(DEVPROP_TYPEMOD_ARRAY))
                {
                    value = rawData.Cast <byte>();
                }
                else
                {
                    value = (byte)rawData[0];
                }
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_BOOLEAN:
                if (typeModifiers.HasFlag(DEVPROP_TYPEMOD_ARRAY))
                {
                    value = rawData.Select(b => b != 0);
                }
                else
                {
                    value = rawData[0] != 0;
                }
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_STRING:
            case DEVPROP_TYPE.DEVPROP_TYPE_STRING_INDIRECT:
                // NOTE: Strings and lists of strings always have a NULL-terminator -- two bytes.
                var s            = Encoding.Unicode.GetString(rawData, 0, rawData.Length);
                var dataAsString = Encoding.Unicode.GetString(rawData, 0, rawData.Length - 2);
                if (typeModifiers.HasFlag(DEVPROP_TYPEMOD_LIST))
                {
                    var stringValues = dataAsString.Split('\0');
                    value = stringValues;
                }
                else
                {
                    value = dataAsString;
                }
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_DEVPROPKEY:
                System.Diagnostics.Debug.WriteLine("Conversion for DEVPROP_TYPE not implemented: " + baseType);
                break;

            case DEVPROP_TYPE.DEVPROP_TYPE_INT16:
            case DEVPROP_TYPE.DEVPROP_TYPE_UINT16:
            case DEVPROP_TYPE.DEVPROP_TYPE_INT32:
            case DEVPROP_TYPE.DEVPROP_TYPE_UINT32:
            case DEVPROP_TYPE.DEVPROP_TYPE_INT64:
            case DEVPROP_TYPE.DEVPROP_TYPE_UINT64:
            case DEVPROP_TYPE.DEVPROP_TYPE_FLOAT:
            case DEVPROP_TYPE.DEVPROP_TYPE_DOUBLE:
            case DEVPROP_TYPE.DEVPROP_TYPE_DECIMAL:
            case DEVPROP_TYPE.DEVPROP_TYPE_GUID:
            case DEVPROP_TYPE.DEVPROP_TYPE_CURRENCY:
            case DEVPROP_TYPE.DEVPROP_TYPE_DATE:
            case DEVPROP_TYPE.DEVPROP_TYPE_FILETIME:
            case DEVPROP_TYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR:
            case DEVPROP_TYPE.DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING:
            case DEVPROP_TYPE.DEVPROP_TYPE_DEVPROPTYPE:
            case DEVPROP_TYPE.DEVPROP_TYPE_BINARY:
            case DEVPROP_TYPE.DEVPROP_TYPE_ERROR:
            case DEVPROP_TYPE.DEVPROP_TYPE_NTSTATUS:
            default:
                System.Diagnostics.Debug.WriteLine("Conversion for DEVPROP_TYPE not implemented: " + baseType);
                value = rawData;
                break;
            }
            return(value);
        }
 private static extern bool SetupDiGetDevicePropertyW(IntPtr deviceInfoSet, [In] ref SP_DEVINFO_DATA deviceInfoData, [In] ref DEVPROPKEY propertyKey, [Out] out DEVPROP_TYPE propertyType, IntPtr propertyBuffer, uint propertyBufferSize, out uint requiredSize, uint flags);