return RegQueryValueEx(key.Handle, null, null, IntPtr.Zero, b, ref size) != ERROR_FILE_NOT_FOUND;
}
+ internal static bool IsSystemKeyDefaultValueSet(this RegistryKey key)
+ {
+ const int ERROR_FILE_NOT_FOUND = 2;
+ byte[] b = new byte[4];
+ int size = 4;
+
+ using SafeRegistryHandle handle = key.Handle;
+ return RegQueryValueEx(handle, null, null, IntPtr.Zero, b, ref size) != ERROR_FILE_NOT_FOUND;
+ }
+
[LibraryImport(Interop.Libraries.Kernel32, EntryPoint = "SetEnvironmentVariableW", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool SetEnvironmentVariable(string lpName, string lpValue);
{
// keyName should be case insensitive so we mix casing
string keyName = MixUpperAndLowerCase(key.Name) + (useSeparator ? "\\" : "");
- if (key.IsDefaultValueSet())
+ if (key.IsSystemKeyDefaultValueSet())
{
Registry.GetValue(keyName, valueName, null);
}
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using Xunit;
public void CreateSubkeyWithEmptyName()
{
string expectedName = TestRegistryKey.Name + @"\";
- var rk = TestRegistryKey.CreateSubKey(string.Empty);
+ using RegistryKey rk = TestRegistryKey.CreateSubKey(string.Empty);
Assert.NotNull(rk);
Assert.Equal(expectedName, rk.Name);
}
[Fact]
public void CreateSubKeyAndCheckThatItExists()
{
- TestRegistryKey.CreateSubKey(TestRegistryKeyName);
- Assert.NotNull(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(created);
+
+ using RegistryKey opened = TestRegistryKey.OpenSubKey(TestRegistryKeyName);
+ Assert.NotNull(opened);
+
Assert.Equal(expected: 1, actual:TestRegistryKey.SubKeyCount);
}
public void CreateSubKeyShouldOpenExisting()
{
// CreateSubKey should open subkey if it already exists
- Assert.NotNull(TestRegistryKey.CreateSubKey(TestRegistryKeyName));
- Assert.NotNull(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
- Assert.NotNull(TestRegistryKey.CreateSubKey(TestRegistryKeyName));
+ using RegistryKey subkey1 = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey1);
+
+ using RegistryKey subkey2 = TestRegistryKey.OpenSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey2);
+
+ using RegistryKey subkey3 = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey3);
}
[Theory]
[InlineData(@"a\b\c\/d\//e\f\g\h\//\\")]
public void CreateSubKeyWithName(string subkeyName)
{
- TestRegistryKey.CreateSubKey(subkeyName);
- Assert.NotNull(TestRegistryKey.OpenSubKey(subkeyName));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(subkeyName);
+ Assert.NotNull(created);
+
+ using RegistryKey opened = TestRegistryKey.OpenSubKey(subkeyName);
+ Assert.NotNull(opened);
}
[Fact]
for (int i = 0; i < 25 && subkeyName.Length < 230; i++)
subkeyName = subkeyName + i.ToString() + @"\";
- TestRegistryKey.CreateSubKey(subkeyName);
- Assert.NotNull(TestRegistryKey.OpenSubKey(subkeyName));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(subkeyName);
+ Assert.NotNull(created);
+
+ using RegistryKey opened = TestRegistryKey.OpenSubKey(subkeyName);
+ Assert.NotNull(opened);
//However, we are interested in ensuring that there are no buffer overflow issues with a deeply nested keys
+ var keys = new List<RegistryKey>();
RegistryKey rk = TestRegistryKey;
for (int i = 0; i < 3; i++)
{
rk = rk.OpenSubKey(subkeyName, true);
Assert.NotNull(rk);
- rk.CreateSubKey(subkeyName);
+ keys.Add(rk);
+
+ keys.Add(rk.CreateSubKey(subkeyName));
}
+
+ keys.ForEach(key => key.Dispose());
}
[Theory]
if (alreadyExists)
{
- TestRegistryKey.CreateSubKey(subkey, true, options);
+ TestRegistryKey.CreateSubKey(subkey, true, options).Dispose();
}
- Assert.NotNull(TestRegistryKey.CreateSubKey(subkey, true, options));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(subkey, true, options);
+ Assert.NotNull(created);
}
[Theory]
if (alreadyExists)
{
- TestRegistryKey.CreateSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, options);
+ TestRegistryKey.CreateSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, options).Dispose();
}
- Assert.NotNull(TestRegistryKey.CreateSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, options));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, options);
+ Assert.NotNull(created);
}
[Theory]
//throwOnMissing is true with subkey present
using (var rk = TestRegistryKey.CreateSubKey(subKeyExists))
{
- rk.CreateSubKey("a");
- rk.CreateSubKey("b");
+ using RegistryKey a = rk.CreateSubKey("a");
+ using RegistryKey b = rk.CreateSubKey("b");
TestRegistryKey.DeleteSubKeyTree(subKeyExists, false);
}
//throwOnMissing is false with subkey present
using (var rk = TestRegistryKey.CreateSubKey(subKeyExists2))
{
- rk.CreateSubKey("a");
- rk.CreateSubKey("b");
+ using RegistryKey a = rk.CreateSubKey("a");
+ using RegistryKey b = rk.CreateSubKey("b");
TestRegistryKey.DeleteSubKeyTree(subKeyExists2, true);
}
}
{
using (var rk = TestRegistryKey.CreateSubKey(TestRegistryKeyName))
{
- rk.CreateSubKey(TestRegistryKeyName);
+ using RegistryKey created = rk.CreateSubKey(TestRegistryKeyName);
rk.DeleteSubKeyTree("");
}
public void DeleteSubKeyTreeTest()
{
// Creating new SubKey and deleting it
- TestRegistryKey.CreateSubKey(TestRegistryKeyName);
- Assert.NotNull(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ using RegistryKey opened = TestRegistryKey.OpenSubKey(TestRegistryKeyName);
+ Assert.NotNull(opened);
TestRegistryKey.DeleteSubKeyTree(TestRegistryKeyName);
Assert.Null(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
// [] Add in multiple subkeys and then delete the root key
string[] subKeyNames = Enumerable.Range(1, 9).Select(x => "BLAH_" + x.ToString()).ToArray();
- using (var rk = TestRegistryKey.CreateSubKey(TestRegistryKeyName))
+ using (RegistryKey rk = TestRegistryKey.CreateSubKey(TestRegistryKeyName))
{
foreach (var subKeyName in subKeyNames)
{
- var rk2 = rk.CreateSubKey(subKeyName);
+ using RegistryKey rk2 = rk.CreateSubKey(subKeyName);
Assert.NotNull(rk2);
- Assert.NotNull(rk2.CreateSubKey("Test"));
+
+ using RegistryKey rk3 = rk2.CreateSubKey("Test");
+ Assert.NotNull(rk3);
}
Assert.Equal(subKeyNames, rk.GetSubKeyNames());
// Should throw if subkey has child subkeys
using (var rk = TestRegistryKey.CreateSubKey(name))
{
- rk.CreateSubKey(name);
+ using RegistryKey subkey = rk.CreateSubKey(name);
Assert.Throws<InvalidOperationException>(() => TestRegistryKey.DeleteSubKey(name, false));
}
public void DeleteSubKeyTest()
{
Assert.Equal(expected: 0, actual: TestRegistryKey.SubKeyCount);
- Assert.NotNull(TestRegistryKey.CreateSubKey(TestRegistryKeyName));
+
+ using RegistryKey subkey = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey);
Assert.Equal(expected: 1, actual: TestRegistryKey.SubKeyCount);
TestRegistryKey.DeleteSubKey(TestRegistryKeyName);
string[] subKeyNames = Enumerable.Range(1, 9).Select(x => "BLAH_" + x.ToString()).ToArray();
foreach (var subKeyName in subKeyNames)
{
- TestRegistryKey.CreateSubKey(subKeyName);
+ TestRegistryKey.CreateSubKey(subKeyName).Dispose();
}
Assert.Equal(subKeyNames, TestRegistryKey.GetSubKeyNames());
// Should throw if subkey has child subkeys
using (var rk = TestRegistryKey.CreateSubKey(name))
{
- rk.CreateSubKey(name);
+ using RegistryKey subkey = rk.CreateSubKey(name);
Assert.Throws<InvalidOperationException>(() => TestRegistryKey.DeleteSubKey(name));
}
public void DeleteSubKeyTest()
{
Assert.Equal(expected: 0, actual: TestRegistryKey.SubKeyCount);
- Assert.NotNull(TestRegistryKey.CreateSubKey(TestRegistryKeyName));
+
+ using RegistryKey subkey = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey);
Assert.Equal(expected: 1, actual: TestRegistryKey.SubKeyCount);
TestRegistryKey.DeleteSubKey(TestRegistryKeyName);
// [] Creating new SubKeys and get count
Assert.Equal(expected: 0, actual: TestRegistryKey.SubKeyCount);
- Assert.NotNull(TestRegistryKey.CreateSubKey(TestRegistryKeyName));
+
+ using RegistryKey subkey = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey);
Assert.Equal(expected: 1, actual: TestRegistryKey.SubKeyCount);
TestRegistryKey.DeleteSubKey(TestRegistryKeyName);
string[] testSubKeys = Enumerable.Range(1, 9).Select(x => "BLAH_" + x.ToString()).ToArray();
foreach (var subKey in testSubKeys)
{
- TestRegistryKey.CreateSubKey(subKey);
+ TestRegistryKey.CreateSubKey(subKey).Dispose();
}
Assert.Equal(testSubKeys.Length, TestRegistryKey.SubKeyCount);
string[] expectedSubKeyNames = Enumerable.Range(1, 9).Select(x => "BLAH_" + x.ToString()).ToArray();
foreach (var subKeyName in expectedSubKeyNames)
{
- TestRegistryKey.CreateSubKey(subKeyName);
+ TestRegistryKey.CreateSubKey(subKeyName).Dispose();
}
Assert.Equal(expectedSubKeyNames, TestRegistryKey.GetSubKeyNames());
[Fact]
public void OpenSubKeyTest()
{
- TestRegistryKey.CreateSubKey(TestRegistryKeyName);
- Assert.NotNull(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
+ using RegistryKey created = TestRegistryKey.CreateSubKey(TestRegistryKeyName);
+ using RegistryKey subkey = TestRegistryKey.OpenSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey);
Assert.Equal(expected: 1, actual: TestRegistryKey.SubKeyCount);
TestRegistryKey.DeleteSubKey(TestRegistryKeyName);
- Assert.Null(TestRegistryKey.OpenSubKey(TestRegistryKeyName));
+ using RegistryKey subkey2 = TestRegistryKey.OpenSubKey(TestRegistryKeyName);
+ Assert.Null(subkey2);
Assert.Equal(expected: 0, actual: TestRegistryKey.SubKeyCount);
}
string[] subKeyNames = Enumerable.Range(1, 9).Select(x => "BLAH_" + x.ToString()).ToArray();
foreach (var subKeyName in subKeyNames)
{
- TestRegistryKey.CreateSubKey(subKeyName);
+ TestRegistryKey.CreateSubKey(subKeyName).Dispose();
}
Assert.Equal(subKeyNames.Length, TestRegistryKey.SubKeyCount);
// OpenSubKey should be read only
const string name = "FooBar";
TestRegistryKey.SetValue(name, 42);
- TestRegistryKey.CreateSubKey(name);
+ TestRegistryKey.CreateSubKey(name).Dispose();
using (var rk = Registry.CurrentUser.OpenSubKey(name: TestRegistryKeyName, writable: false))
{
Assert.Throws<UnauthorizedAccessException>(() => rk.CreateSubKey(name));
const int testValue = 32;
using (var rk = TestRegistryKey.OpenSubKey("", true))
{
- rk.CreateSubKey(TestRegistryKeyName);
+ rk.CreateSubKey(TestRegistryKeyName).Dispose();
rk.SetValue(TestRegistryKeyName, testValue);
- Assert.NotNull(rk.OpenSubKey(TestRegistryKeyName));
+ using RegistryKey subkey = rk.OpenSubKey(TestRegistryKeyName);
+ Assert.NotNull(subkey);
Assert.Equal(testValue, (int)rk.GetValue(TestRegistryKeyName));
}
}
// Should throw when opened with default permission check
const string name = "FooBar";
TestRegistryKey.SetValue(name, 42);
- TestRegistryKey.CreateSubKey(name);
+ TestRegistryKey.CreateSubKey(name).Dispose();
using (var rk = Registry.CurrentUser.OpenSubKey(name: TestRegistryKeyName, permissionCheck: RegistryKeyPermissionCheck.Default))
{
Assert.Throws<UnauthorizedAccessException>(() => rk.CreateSubKey(name));
{
rk.SetValue(valueName, expectedValue);
Assert.Equal(expectedValue, rk.GetValue(valueName));
- rk.CreateSubKey(valueName);
- Assert.NotNull(rk.OpenSubKey(valueName));
+ rk.CreateSubKey(valueName).Dispose();
+ using RegistryKey subkey = rk.OpenSubKey(valueName);
+ Assert.NotNull(subkey);
}
}
// Should throw when opened with default permission check and write rights
const string name = "FooBar";
TestRegistryKey.SetValue(name, 42);
- TestRegistryKey.CreateSubKey(name);
+ TestRegistryKey.CreateSubKey(name).Dispose();
using (var rk = Registry.CurrentUser.OpenSubKey(name: TestRegistryKeyName, permissionCheck: RegistryKeyPermissionCheck.Default, rights: RegistryRights.WriteKey))
{
Assert.Throws<UnauthorizedAccessException>(() => rk.CreateSubKey(name));
using (var rk = TestRegistryKey.OpenSubKey("", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.CreateSubKey))
{
- rk.CreateSubKey(valueName);
- Assert.NotNull(rk.OpenSubKey(valueName));
+ rk.CreateSubKey(valueName).Dispose();
+ using RegistryKey subkey = rk.OpenSubKey(valueName);
+ Assert.NotNull(subkey);
}
}
// OpenSubKey should be read only
const string name = "FooBar";
TestRegistryKey.SetValue(name, 42);
- TestRegistryKey.CreateSubKey(name);
+ TestRegistryKey.CreateSubKey(name).Dispose();
using (var rk = Registry.CurrentUser.OpenSubKey(name: TestRegistryKeyName, rights: RegistryRights.ReadKey))
{
Assert.Throws<UnauthorizedAccessException>(() => rk.CreateSubKey(name));
using (var rk = TestRegistryKey.OpenSubKey("", RegistryRights.CreateSubKey))
{
- rk.CreateSubKey(valueName);
- Assert.NotNull(rk.OpenSubKey(valueName));
+ rk.CreateSubKey(valueName).Dispose();
+ using RegistryKey subkey = rk.OpenSubKey(valueName);
+ Assert.NotNull(subkey);
}
}
//Try getting registrykey from handle for key that has been deleted.
Assert.Throws<IOException>(() =>
{
- RegistryKey rk = TestRegistryKey.CreateSubKey(subKeyName);
+ using RegistryKey rk = TestRegistryKey.CreateSubKey(subKeyName);
SafeRegistryHandle handle = rk.Handle;
TestRegistryKey.DeleteSubKey(subKeyName);
- rk = RegistryKey.FromHandle(handle, RegistryView.Default);
- rk.CreateSubKey("TestThrows");
+
+ using RegistryKey rk2 = RegistryKey.FromHandle(handle, RegistryView.Default);
+ rk2.CreateSubKey("TestThrows").Dispose();
});
//Try getting handle on deleted key.
Assert.Throws<IOException>(() =>
{
- RegistryKey rk = TestRegistryKey.CreateSubKey(subKeyName);
+ using RegistryKey rk = TestRegistryKey.CreateSubKey(subKeyName);
TestRegistryKey.DeleteSubKey(subKeyName);
SafeRegistryHandle handle = rk.Handle;
- rk = RegistryKey.FromHandle(handle, RegistryView.Default);
- rk.CreateSubKey("TestThrows");
+
+ using RegistryKey rk2 = RegistryKey.FromHandle(handle, RegistryView.Default);
+ rk2.CreateSubKey("TestThrows");
});
}
}
private static void RemoveKeyIfExists(string keyName)
{
RegistryKey rk = Registry.CurrentUser;
- if (rk.OpenSubKey(keyName) != null)
+
+ using RegistryKey subkey = rk.OpenSubKey(keyName);
+ if (subkey != null)
{
rk.DeleteSubKeyTree(keyName);
Assert.Null(rk.OpenSubKey(keyName));