191 lines
7.3 KiB
C#
191 lines
7.3 KiB
C#
// ==++==
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ==--==
|
|
#if FEATURE_WIN32_REGISTRY
|
|
|
|
namespace Microsoft.Win32 {
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.Versioning;
|
|
|
|
#if !FEATURE_PAL
|
|
|
|
/**
|
|
* Registry encapsulation. Contains members representing all top level system
|
|
* keys.
|
|
*
|
|
* @security(checkClassLinking=on)
|
|
*/
|
|
//This class contains only static members and does not need to be serializable.
|
|
[ComVisible(true)]
|
|
public static class Registry {
|
|
[System.Security.SecuritySafeCritical] // auto-generated
|
|
static Registry()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Current User Key.
|
|
*
|
|
* This key should be used as the root for all user specific settings.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey CurrentUser = RegistryKey.GetBaseKey(RegistryKey.HKEY_CURRENT_USER);
|
|
|
|
/**
|
|
* Local Machine Key.
|
|
*
|
|
* This key should be used as the root for all machine specific settings.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey LocalMachine = RegistryKey.GetBaseKey(RegistryKey.HKEY_LOCAL_MACHINE);
|
|
|
|
/**
|
|
* Classes Root Key.
|
|
*
|
|
* This is the root key of class information.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey ClassesRoot = RegistryKey.GetBaseKey(RegistryKey.HKEY_CLASSES_ROOT);
|
|
|
|
/**
|
|
* Users Root Key.
|
|
*
|
|
* This is the root of users.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey Users = RegistryKey.GetBaseKey(RegistryKey.HKEY_USERS);
|
|
|
|
/**
|
|
* Performance Root Key.
|
|
*
|
|
* This is where dynamic performance data is stored on NT.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey PerformanceData = RegistryKey.GetBaseKey(RegistryKey.HKEY_PERFORMANCE_DATA);
|
|
|
|
/**
|
|
* Current Config Root Key.
|
|
*
|
|
* This is where current configuration information is stored.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
public static readonly RegistryKey CurrentConfig = RegistryKey.GetBaseKey(RegistryKey.HKEY_CURRENT_CONFIG);
|
|
|
|
/**
|
|
* Dynamic Data Root Key.
|
|
*
|
|
* LEGACY: This is where dynamic performance data is stored on Win9X.
|
|
* This does not exist on NT.
|
|
*/
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
[Obsolete("The DynData registry key only works on Win9x, which is no longer supported by the CLR. On NT-based operating systems, use the PerformanceData registry key instead.")]
|
|
public static readonly RegistryKey DynData = RegistryKey.GetBaseKey(RegistryKey.HKEY_DYN_DATA);
|
|
|
|
//
|
|
// Following function will parse a keyName and returns the basekey for it.
|
|
// It will also store the subkey name in the out parameter.
|
|
// If the keyName is not valid, we will throw ArgumentException.
|
|
// The return value shouldn't be null.
|
|
//
|
|
[System.Security.SecurityCritical] // auto-generated
|
|
private static RegistryKey GetBaseKeyFromKeyName(string keyName, out string subKeyName) {
|
|
if( keyName == null) {
|
|
throw new ArgumentNullException("keyName");
|
|
}
|
|
|
|
string basekeyName;
|
|
int i = keyName.IndexOf('\\');
|
|
if( i != -1) {
|
|
basekeyName = keyName.Substring(0, i).ToUpper(System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
else {
|
|
basekeyName = keyName.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
RegistryKey basekey = null;
|
|
|
|
switch(basekeyName) {
|
|
case "HKEY_CURRENT_USER":
|
|
basekey = Registry.CurrentUser;
|
|
break;
|
|
case "HKEY_LOCAL_MACHINE":
|
|
basekey = Registry.LocalMachine;
|
|
break;
|
|
case "HKEY_CLASSES_ROOT":
|
|
basekey = Registry.ClassesRoot;
|
|
break;
|
|
case "HKEY_USERS":
|
|
basekey = Registry.Users;
|
|
break;
|
|
case "HKEY_PERFORMANCE_DATA":
|
|
basekey = Registry.PerformanceData;
|
|
break;
|
|
case "HKEY_CURRENT_CONFIG":
|
|
basekey = Registry.CurrentConfig;
|
|
break;
|
|
case "HKEY_DYN_DATA":
|
|
basekey = RegistryKey.GetBaseKey(RegistryKey.HKEY_DYN_DATA);
|
|
break;
|
|
default:
|
|
throw new ArgumentException(Environment.GetResourceString("Arg_RegInvalidKeyName", "keyName"));
|
|
}
|
|
if( i == -1 || i == keyName.Length) {
|
|
subKeyName = string.Empty;
|
|
}
|
|
else {
|
|
subKeyName = keyName.Substring(i + 1, keyName.Length - i - 1);
|
|
}
|
|
return basekey;
|
|
}
|
|
|
|
[System.Security.SecuritySafeCritical] // auto-generated
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
[ResourceConsumption(ResourceScope.Machine)]
|
|
public static object GetValue(string keyName, string valueName, object defaultValue ) {
|
|
string subKeyName;
|
|
RegistryKey basekey = GetBaseKeyFromKeyName(keyName, out subKeyName);
|
|
BCLDebug.Assert(basekey != null, "basekey can't be null.");
|
|
RegistryKey key = basekey.OpenSubKey(subKeyName);
|
|
if(key == null) { // if the key doesn't exist, do nothing
|
|
return null;
|
|
}
|
|
try {
|
|
return key.GetValue(valueName, defaultValue);
|
|
}
|
|
finally {
|
|
key.Close();
|
|
}
|
|
}
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
[ResourceConsumption(ResourceScope.Machine)]
|
|
public static void SetValue(string keyName, string valueName, object value ) {
|
|
SetValue(keyName, valueName, value, RegistryValueKind.Unknown);
|
|
}
|
|
|
|
[System.Security.SecuritySafeCritical] // auto-generated
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
[ResourceConsumption(ResourceScope.Machine)]
|
|
public static void SetValue(string keyName, string valueName, object value, RegistryValueKind valueKind ) {
|
|
string subKeyName;
|
|
RegistryKey basekey = GetBaseKeyFromKeyName(keyName, out subKeyName);
|
|
BCLDebug.Assert(basekey != null, "basekey can't be null!");
|
|
RegistryKey key = basekey.CreateSubKey(subKeyName);
|
|
BCLDebug.Assert(key != null, "An exception should be thrown if failed!");
|
|
try {
|
|
key.SetValue(valueName, value, valueKind);
|
|
}
|
|
finally {
|
|
key.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // !FEATURE_PAL
|
|
}
|
|
#endif // FEATURE_WIN32_REGISTRY
|
|
|
|
|