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