Exemple #1
0
        public static RegistryKey OpenBaseKey(RegistryHive registryHive, RegistryHiveType registryType, bool bWritable = false)
        {
            UIntPtr hiveKey = _hiveKeys[registryHive];

            if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major > 5)
            {
                RegistryAccessMask flags = RegistryAccessMask.QueryValue | RegistryAccessMask.EnumerateSubKeys | _accessMasks[registryType];
                if (bWritable)
                {
                    flags |= (RegistryAccessMask.SetValue | RegistryAccessMask.CreateSubKey);
                }
                IntPtr keyHandlePointer = IntPtr.Zero;
                int    result           = RegOpenKeyEx(hiveKey, String.Empty, 0, (uint)flags, out keyHandlePointer);
                if (result == 0)
                {
                    var safeRegistryHandleType        = typeof(SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle");
                    var safeRegistryHandleConstructor = safeRegistryHandleType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(IntPtr), typeof(bool) }, null); // .NET < 4
                    if (safeRegistryHandleConstructor == null)
                    {
                        safeRegistryHandleConstructor = safeRegistryHandleType.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new[] { typeof(IntPtr), typeof(bool) }, null); // .NET >= 4
                    }
                    var    keyHandle       = safeRegistryHandleConstructor.Invoke(new object[] { keyHandlePointer, true });
                    var    net3Constructor = typeof(RegistryKey).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { safeRegistryHandleType, typeof(bool) }, null);
                    var    net4Constructor = typeof(RegistryKey).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(IntPtr), typeof(bool), typeof(bool), typeof(bool), typeof(bool) }, null);
                    object key;
                    if (net4Constructor != null)
                    {
                        key = net4Constructor.Invoke(new object[] { keyHandlePointer, true, false, false, hiveKey == _hiveKeys[RegistryHive.PerformanceData] });
                    }
                    else if (net3Constructor != null)
                    {
                        key = net3Constructor.Invoke(new object[] { keyHandle, true });
                    }
                    else
                    {
                        var keyFromHandleMethod = typeof(RegistryKey).GetMethod("FromHandle", BindingFlags.Static | BindingFlags.Public, null, new[] { safeRegistryHandleType }, null);
                        key = keyFromHandleMethod.Invoke(null, new object[] { keyHandle });
                    }
                    var field = typeof(RegistryKey).GetField("keyName", BindingFlags.Instance | BindingFlags.NonPublic);
                    if (field != null)
                    {
                        field.SetValue(key, String.Empty);
                    }
                    return((RegistryKey)key);
                }
                else if (result == 2) // The key does not exist.
                {
                    return(null);
                }
                throw new Win32Exception(result);
            }
            throw new PlatformNotSupportedException("The platform or operating system must be Windows 2000 or later.");
        }
        public static GenericRegistryValue get_value(RegistryHiveType hive, string subKeyPath, string registryValue)
        {
            var hiveActual = (RegistryHive)Enum.Parse(typeof(RegistryHive), hive.to_string(), ignoreCase: true);
            IList <RegistryKey> keyLocations = new List <RegistryKey>();

            if (Environment.Is64BitOperatingSystem)
            {
                keyLocations.Add(RegistryKey.OpenBaseKey(hiveActual, RegistryView.Registry64));
            }

            keyLocations.Add(RegistryKey.OpenBaseKey(hiveActual, RegistryView.Registry32));

            GenericRegistryValue value = null;

            foreach (var topLevelRegistryKey in keyLocations)
            {
                using (topLevelRegistryKey)
                {
                    var key = topLevelRegistryKey.OpenSubKey(subKeyPath, RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey);
                    if (key != null)
                    {
                        value = FaultTolerance.try_catch_with_logging_exception(
                            () =>
                        {
                            if (key.GetValueNames().Contains(registryValue, StringComparer.InvariantCultureIgnoreCase))
                            {
                                return(new GenericRegistryValue
                                {
                                    Name = registryValue,
                                    ParentKeyName = key.Name,
                                    Type = (RegistryValueKindType)Enum.Parse(typeof(RegistryValueKindType), key.GetValueKind(registryValue).to_string(), ignoreCase: true),
                                    Value = key.get_value_as_string(registryValue),
                                });
                            }

                            return(null);
                        },
                            "Could not get registry value '{0}' from key '{1}'".format_with(registryValue, key.Name),
                            logWarningInsteadOfError: true);

                        if (value != null)
                        {
                            break;
                        }
                    }
                }
            }

            return(value);
        }
Exemple #3
0
        public static GenericRegistryValue get_value(RegistryHiveType hive, string subKeyPath, string registryValue)
        {
            var hiveActual = (RegistryHive)Enum.Parse(typeof(RegistryHive), hive.to_string(), ignoreCase: true);
            IList<RegistryKey> keyLocations = new List<RegistryKey>();
            if (Environment.Is64BitOperatingSystem)
            {
                keyLocations.Add(RegistryKey.OpenBaseKey(hiveActual, RegistryView.Registry64));
            }

            keyLocations.Add(RegistryKey.OpenBaseKey(hiveActual, RegistryView.Registry32));

            GenericRegistryValue value = null;

            foreach (var topLevelRegistryKey in keyLocations)
            {
                using (topLevelRegistryKey)
                {
                    var key = topLevelRegistryKey.OpenSubKey(subKeyPath, RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey);
                    if (key != null)
                    {
                        value = FaultTolerance.try_catch_with_logging_exception(
                            () =>
                            {
                                if (key.GetValueNames().Contains(registryValue, StringComparer.InvariantCultureIgnoreCase))
                                {
                                    return new GenericRegistryValue
                                    {
                                        Name = registryValue,
                                        ParentKeyName = key.Name,
                                        Type = (RegistryValueKindType)Enum.Parse(typeof(RegistryValueKindType), key.GetValueKind(registryValue).to_string(), ignoreCase: true),
                                        Value = key.get_value_as_string(registryValue),
                                    };
                                }

                                return null;
                            },
                            "Could not get registry value '{0}' from key '{1}'".format_with(registryValue, key.Name),
                            logWarningInsteadOfError: true);

                        if (value != null) break;
                    }
                }
            }

            return value;
        }
Exemple #4
0
        // For 3.5 compat. Taken from https://stackoverflow.com/questions/26217199/what-are-some-alternatives-to-registrykey-openbasekey-in-net-3-5
        public static RegistryKey?OpenBaseKey(RegistryHive registryHive, RegistryHiveType registryType)
        {
            var _hiveKeys = new Dictionary <RegistryHive, UIntPtr>
            {
                { RegistryHive.ClassesRoot, new UIntPtr(0x80000000u) },
                { RegistryHive.CurrentConfig, new UIntPtr(0x80000005u) },
                { RegistryHive.CurrentUser, new UIntPtr(0x80000001u) },
                { RegistryHive.DynData, new UIntPtr(0x80000006u) },
                { RegistryHive.LocalMachine, new UIntPtr(0x80000002u) },
                { RegistryHive.PerformanceData, new UIntPtr(0x80000004u) },
                { RegistryHive.Users, new UIntPtr(0x80000003u) }
            };

            var _accessMasks = new Dictionary <RegistryHiveType, RegistryAccessMask>
            {
                { RegistryHiveType.X64, RegistryAccessMask.Wow6464 },
                { RegistryHiveType.X86, RegistryAccessMask.WoW6432 }
            };

            if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major <= 5)
            {
                throw new PlatformNotSupportedException(
                          "The platform or operating system must be Windows XP or later.");
            }

            var hiveKey = _hiveKeys[registryHive];
            var flags   = RegistryAccessMask.QueryValue | RegistryAccessMask.EnumerateSubKeys | _accessMasks[registryType];

            var result = Advapi32.RegOpenKeyEx(hiveKey, string.Empty, 0, (uint)flags, out var keyHandlePointer);

            if (result == 0)
            {
                var safeRegistryHandleType        = typeof(SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle");
                var safeRegistryHandleConstructor = safeRegistryHandleType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(IntPtr), typeof(bool) }, null); // .NET < 4
                if (safeRegistryHandleConstructor == null)
                {
                    safeRegistryHandleConstructor = safeRegistryHandleType.GetConstructor(
                        BindingFlags.Instance | BindingFlags.Public, null, new[] { typeof(IntPtr), typeof(bool) },
                        null); // .NET >= 4
                }

                var    keyHandle       = safeRegistryHandleConstructor.Invoke(new object[] { keyHandlePointer, true });
                var    net3Constructor = typeof(RegistryKey).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { safeRegistryHandleType, typeof(bool) }, null);
                var    net4Constructor = typeof(RegistryKey).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(IntPtr), typeof(bool), typeof(bool), typeof(bool), typeof(bool) }, null);
                object key;

                if (net4Constructor != null)
                {
                    key = net4Constructor.Invoke(new object[] { keyHandlePointer, true, false, false, hiveKey == _hiveKeys[RegistryHive.PerformanceData] });
                }
                else if (net3Constructor != null)
                {
                    key = net3Constructor.Invoke(new object[] { keyHandle, true });
                }
                else
                {
                    var keyFromHandleMethod = typeof(RegistryKey).GetMethod("FromHandle", BindingFlags.Static | BindingFlags.Public, null, new[] { safeRegistryHandleType }, null);
                    key = keyFromHandleMethod.Invoke(null, new object[] { keyHandle });
                }

                var field = typeof(RegistryKey).GetField("keyName", BindingFlags.Instance | BindingFlags.NonPublic);
                if (field != null)
                {
                    field.SetValue(key, string.Empty);
                }

                return((RegistryKey)key);
            }

            if (result == 2)  // NOT_FOUND
            {
                return(null);
            }

            throw new Win32Exception(result);
        }
Exemple #5
0
        public static byte[]? GetBinaryValue(RegistryHive hive, string path, string value, RegistryHiveType view = RegistryHiveType.X64)
        {
            var regValue = GetValue(hive, path, value, view);

            return((byte[]?)regValue?.Value);
        }
Exemple #6
0
        public static uint?GetDwordValue(RegistryHive hive, string path, string value, RegistryHiveType view = RegistryHiveType.X64)
        {
            var regValue = GetValue(hive, path, value, view);

            if (regValue == null)
            {
                return(null);
            }

            if (uint.TryParse($"{regValue.Value}", out var output))
            {
                return(output);
            }

            try
            {
                // for big values
                return(unchecked ((uint)((int)regValue.Value)));
            }
            catch
            {
                return(null);
            }
        }
Exemple #7
0
        public static string?GetStringValue(RegistryHive hive, string path, string value, RegistryHiveType view = RegistryHiveType.X64)
        {
            var regValue = GetValue(hive, path, value, view);

            return(regValue?.Value.ToString());
        }
Exemple #8
0
        private static RegistryKeyValue?GetValue(RegistryHive hive, string path, string value, RegistryHiveType view = RegistryHiveType.X64)
        {
            var regKey      = OpenBaseKey(hive, view)?.OpenSubKey(path, RegistryKeyPermissionCheck.Default, RegistryRights.QueryValues);
            var regKeyValue = regKey?.GetValue(value);

            if (regKey == null || regKeyValue == null)
            {
                return(null);
            }

            var kind = regKey.GetValueKind(value);

            return(new RegistryKeyValue(
                       path,
                       kind,
                       regKeyValue
                       ));
        }