Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }