/// <summary>Extract the value of this registry type from a pointer.</summary> /// <param name="value">The registry type value.</param> /// <param name="ptr">The allocated memory pointer.</param> /// <param name="size">The size of the allocated memory.</param> /// <returns>The extracted value.</returns> public static object GetValue(this Vanara.PInvoke.REG_VALUE_TYPE value, IntPtr ptr, uint size) { switch (value) { case PInvoke.REG_VALUE_TYPE.REG_DWORD: case PInvoke.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: var data = IntPtrConverter.Convert <byte[]>(ptr, 4); if (BitConverter.IsLittleEndian && value == REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN || !BitConverter.IsLittleEndian && value == REG_VALUE_TYPE.REG_DWORD) { Array.Reverse(data); } return(BitConverter.ToUInt32(data, 0)); case PInvoke.REG_VALUE_TYPE.REG_EXPAND_SZ: return(Environment.ExpandEnvironmentVariables(StringHelper.GetString(ptr, System.Runtime.InteropServices.CharSet.Auto, size))); case PInvoke.REG_VALUE_TYPE.REG_MULTI_SZ: return(ptr.ToStringEnum(System.Runtime.InteropServices.CharSet.Auto, 0, size).ToArray()); case PInvoke.REG_VALUE_TYPE.REG_QWORD: return(IntPtrConverter.Convert <ulong>(ptr, size)); case PInvoke.REG_VALUE_TYPE.REG_SZ: return(StringHelper.GetString(ptr, System.Runtime.InteropServices.CharSet.Auto, size)); case PInvoke.REG_VALUE_TYPE.REG_RESOURCE_LIST: case PInvoke.REG_VALUE_TYPE.REG_FULL_RESOURCE_DESCRIPTOR: case PInvoke.REG_VALUE_TYPE.REG_RESOURCE_REQUIREMENTS_LIST: case PInvoke.REG_VALUE_TYPE.REG_BINARY: return(IntPtrConverter.Convert <byte[]>(ptr, size)); case PInvoke.REG_VALUE_TYPE.REG_LINK: throw new InvalidOperationException("Registry links cannot be retrived from a pointer. Please use RegOpenKeyEx."); default: case PInvoke.REG_VALUE_TYPE.REG_NONE: return(ptr); } }
/// <summary>Extract the value of this registry type from a pointer.</summary> /// <param name="value">The registry type value.</param> /// <param name="ptr">The allocated memory pointer.</param> /// <param name="size">The size of the allocated memory.</param> /// <returns>The extracted value.</returns> public static object GetValue(this Vanara.PInvoke.REG_VALUE_TYPE value, IntPtr ptr, uint size) { switch (value) { case PInvoke.REG_VALUE_TYPE.REG_DWORD: return(IntPtrConverter.Convert <uint>(ptr, size)); case PInvoke.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: var data = IntPtrConverter.Convert <byte[]>(ptr, 4); return(unchecked ((uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]))); case PInvoke.REG_VALUE_TYPE.REG_EXPAND_SZ: return(Environment.ExpandEnvironmentVariables(StringHelper.GetString(ptr))); case PInvoke.REG_VALUE_TYPE.REG_LINK: return(new Uri(StringHelper.GetString(ptr))); case PInvoke.REG_VALUE_TYPE.REG_MULTI_SZ: return(ptr.ToStringEnum()); case PInvoke.REG_VALUE_TYPE.REG_QWORD: return(IntPtrConverter.Convert <ulong>(ptr, size)); case PInvoke.REG_VALUE_TYPE.REG_SZ: return(StringHelper.GetString(ptr)); case PInvoke.REG_VALUE_TYPE.REG_RESOURCE_LIST: case PInvoke.REG_VALUE_TYPE.REG_FULL_RESOURCE_DESCRIPTOR: case PInvoke.REG_VALUE_TYPE.REG_RESOURCE_REQUIREMENTS_LIST: case PInvoke.REG_VALUE_TYPE.REG_BINARY: return(IntPtrConverter.Convert <byte[]>(ptr, size)); default: case PInvoke.REG_VALUE_TYPE.REG_NONE: return(ptr); } }