using System; using System.Collections; using System.IO; using System.Runtime.InteropServices; using System.Security; using System.Text; namespace Microsoft.Win32 { // Token: 0x0200007C RID: 124 internal class Win32RegistryApi : IRegistryApi { // Token: 0x06000765 RID: 1893 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegCreateKey(IntPtr keyBase, string keyName, out IntPtr keyHandle); // Token: 0x06000766 RID: 1894 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegCloseKey(IntPtr keyHandle); // Token: 0x06000767 RID: 1895 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegConnectRegistry(string machineName, IntPtr hKey, out IntPtr keyHandle); // Token: 0x06000768 RID: 1896 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegFlushKey(IntPtr keyHandle); // Token: 0x06000769 RID: 1897 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegOpenKeyEx(IntPtr keyBase, string keyName, IntPtr reserved, int access, out IntPtr keyHandle); // Token: 0x0600076A RID: 1898 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegDeleteKey(IntPtr keyHandle, string valueName); // Token: 0x0600076B RID: 1899 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegDeleteValue(IntPtr keyHandle, string valueName); // Token: 0x0600076C RID: 1900 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegEnumKey(IntPtr keyBase, int index, StringBuilder nameBuffer, int bufferLength); // Token: 0x0600076D RID: 1901 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegEnumValue(IntPtr keyBase, int index, StringBuilder nameBuffer, ref int nameLength, IntPtr reserved, ref RegistryValueKind type, IntPtr data, IntPtr dataLength); // Token: 0x0600076E RID: 1902 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegSetValueEx(IntPtr keyBase, string valueName, IntPtr reserved, RegistryValueKind type, string data, int rawDataLength); // Token: 0x0600076F RID: 1903 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegSetValueEx(IntPtr keyBase, string valueName, IntPtr reserved, RegistryValueKind type, byte[] rawData, int rawDataLength); // Token: 0x06000770 RID: 1904 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegSetValueEx(IntPtr keyBase, string valueName, IntPtr reserved, RegistryValueKind type, ref int data, int rawDataLength); // Token: 0x06000771 RID: 1905 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegQueryValueEx(IntPtr keyBase, string valueName, IntPtr reserved, ref RegistryValueKind type, IntPtr zero, ref int dataSize); // Token: 0x06000772 RID: 1906 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegQueryValueEx(IntPtr keyBase, string valueName, IntPtr reserved, ref RegistryValueKind type, [Out] byte[] data, ref int dataSize); // Token: 0x06000773 RID: 1907 [DllImport("advapi32.dll", CharSet = CharSet.Unicode)] private static extern int RegQueryValueEx(IntPtr keyBase, string valueName, IntPtr reserved, ref RegistryValueKind type, ref int data, ref int dataSize); // Token: 0x06000774 RID: 1908 RVA: 0x00017410 File Offset: 0x00015610 private static IntPtr GetHandle(RegistryKey key) { return (IntPtr)key.Handle; } // Token: 0x06000775 RID: 1909 RVA: 0x00017420 File Offset: 0x00015620 private static bool IsHandleValid(RegistryKey key) { return key.Handle != null; } // Token: 0x06000776 RID: 1910 RVA: 0x00017430 File Offset: 0x00015630 public object GetValue(RegistryKey rkey, string name, object defaultValue, RegistryValueOptions options) { RegistryValueKind registryValueKind = RegistryValueKind.Unknown; int num = 0; IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num2 = Win32RegistryApi.RegQueryValueEx(handle, name, IntPtr.Zero, ref registryValueKind, IntPtr.Zero, ref num); if (num2 == 2 || num2 == 1018) { return defaultValue; } if (num2 != 234 && num2 != 0) { this.GenerateException(num2); } object obj; if (registryValueKind == RegistryValueKind.String) { byte[] array; num2 = this.GetBinaryValue(rkey, name, registryValueKind, out array, num); obj = RegistryKey.DecodeString(array); } else if (registryValueKind == RegistryValueKind.ExpandString) { byte[] array2; num2 = this.GetBinaryValue(rkey, name, registryValueKind, out array2, num); obj = RegistryKey.DecodeString(array2); if ((options & RegistryValueOptions.DoNotExpandEnvironmentNames) == RegistryValueOptions.None) { obj = Environment.ExpandEnvironmentVariables((string)obj); } } else if (registryValueKind == RegistryValueKind.DWord) { int num3 = 0; num2 = Win32RegistryApi.RegQueryValueEx(handle, name, IntPtr.Zero, ref registryValueKind, ref num3, ref num); obj = num3; } else if (registryValueKind == RegistryValueKind.Binary) { byte[] array3; num2 = this.GetBinaryValue(rkey, name, registryValueKind, out array3, num); obj = array3; } else { if (registryValueKind != RegistryValueKind.MultiString) { throw new SystemException(); } obj = null; byte[] array4; num2 = this.GetBinaryValue(rkey, name, registryValueKind, out array4, num); if (num2 == 0) { obj = RegistryKey.DecodeString(array4).Split(new char[1]); } } if (num2 != 0) { this.GenerateException(num2); } return obj; } // Token: 0x06000777 RID: 1911 RVA: 0x00017580 File Offset: 0x00015780 public void SetValue(RegistryKey rkey, string name, object value, RegistryValueKind valueKind) { Type type = value.GetType(); IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num2; if (valueKind == RegistryValueKind.DWord && type == typeof(int)) { int num = (int)value; num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.DWord, ref num, 4); } else if (valueKind == RegistryValueKind.Binary && type == typeof(byte[])) { byte[] array = (byte[])value; num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.Binary, array, array.Length); } else if (valueKind == RegistryValueKind.MultiString && type == typeof(string[])) { string[] array2 = (string[])value; StringBuilder stringBuilder = new StringBuilder(); foreach (string text in array2) { stringBuilder.Append(text); stringBuilder.Append('\0'); } stringBuilder.Append('\0'); byte[] bytes = Encoding.Unicode.GetBytes(stringBuilder.ToString()); num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.MultiString, bytes, bytes.Length); } else if ((valueKind == RegistryValueKind.String || valueKind == RegistryValueKind.ExpandString) && type == typeof(string)) { string text2 = string.Format("{0}{1}", value, '\0'); num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, valueKind, text2, text2.Length * this.NativeBytesPerCharacter); } else { if (type.IsArray) { throw new ArgumentException("Only string and byte arrays can written as registry values"); } throw new ArgumentException("Type does not match the valueKind"); } if (num2 != 0) { this.GenerateException(num2); } } // Token: 0x06000778 RID: 1912 RVA: 0x00017724 File Offset: 0x00015924 public void SetValue(RegistryKey rkey, string name, object value) { Type type = value.GetType(); IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num2; if (type == typeof(int)) { int num = (int)value; num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.DWord, ref num, 4); } else if (type == typeof(byte[])) { byte[] array = (byte[])value; num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.Binary, array, array.Length); } else if (type == typeof(string[])) { string[] array2 = (string[])value; StringBuilder stringBuilder = new StringBuilder(); foreach (string text in array2) { stringBuilder.Append(text); stringBuilder.Append('\0'); } stringBuilder.Append('\0'); byte[] bytes = Encoding.Unicode.GetBytes(stringBuilder.ToString()); num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.MultiString, bytes, bytes.Length); } else { if (type.IsArray) { throw new ArgumentException("Only string and byte arrays can written as registry values"); } string text2 = string.Format("{0}{1}", value, '\0'); num2 = Win32RegistryApi.RegSetValueEx(handle, name, IntPtr.Zero, RegistryValueKind.String, text2, text2.Length * this.NativeBytesPerCharacter); } if (num2 == 1018) { throw RegistryKey.CreateMarkedForDeletionException(); } if (num2 != 0) { this.GenerateException(num2); } } // Token: 0x06000779 RID: 1913 RVA: 0x00017890 File Offset: 0x00015A90 private int GetBinaryValue(RegistryKey rkey, string name, RegistryValueKind type, out byte[] data, int size) { byte[] array = new byte[size]; IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num = Win32RegistryApi.RegQueryValueEx(handle, name, IntPtr.Zero, ref type, array, ref size); data = array; return num; } // Token: 0x0600077A RID: 1914 RVA: 0x000178C4 File Offset: 0x00015AC4 public int SubKeyCount(RegistryKey rkey) { StringBuilder stringBuilder = new StringBuilder(1024); IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num = 0; for (;;) { int num2 = Win32RegistryApi.RegEnumKey(handle, num, stringBuilder, stringBuilder.Capacity); if (num2 == 1018) { break; } if (num2 != 0) { if (num2 == 259) { return num; } this.GenerateException(num2); } num++; } throw RegistryKey.CreateMarkedForDeletionException(); } // Token: 0x0600077B RID: 1915 RVA: 0x00017938 File Offset: 0x00015B38 public int ValueCount(RegistryKey rkey) { StringBuilder stringBuilder = new StringBuilder(1024); IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num = 0; for (;;) { RegistryValueKind registryValueKind = RegistryValueKind.Unknown; int capacity = stringBuilder.Capacity; int num2 = Win32RegistryApi.RegEnumValue(handle, num, stringBuilder, ref capacity, IntPtr.Zero, ref registryValueKind, IntPtr.Zero, IntPtr.Zero); if (num2 == 1018) { break; } if (num2 != 0 && num2 != 234) { if (num2 == 259) { return num; } this.GenerateException(num2); } num++; } throw RegistryKey.CreateMarkedForDeletionException(); } // Token: 0x0600077C RID: 1916 RVA: 0x000179D0 File Offset: 0x00015BD0 public RegistryKey OpenRemoteBaseKey(RegistryHive hKey, string machineName) { IntPtr intPtr = new IntPtr((int)hKey); IntPtr intPtr2; int num = Win32RegistryApi.RegConnectRegistry(machineName, intPtr, out intPtr2); if (num != 0) { this.GenerateException(num); } return new RegistryKey(hKey, intPtr2, true); } // Token: 0x0600077D RID: 1917 RVA: 0x00017A04 File Offset: 0x00015C04 public RegistryKey OpenSubKey(RegistryKey rkey, string keyName, bool writable) { int num = 131097; if (writable) { num |= 131078; } IntPtr handle = Win32RegistryApi.GetHandle(rkey); IntPtr intPtr; int num2 = Win32RegistryApi.RegOpenKeyEx(handle, keyName, IntPtr.Zero, num, out intPtr); if (num2 == 2 || num2 == 1018) { return null; } if (num2 != 0) { this.GenerateException(num2); } return new RegistryKey(intPtr, Win32RegistryApi.CombineName(rkey, keyName), writable); } // Token: 0x0600077E RID: 1918 RVA: 0x00017A70 File Offset: 0x00015C70 public void Flush(RegistryKey rkey) { if (!Win32RegistryApi.IsHandleValid(rkey)) { return; } IntPtr handle = Win32RegistryApi.GetHandle(rkey); Win32RegistryApi.RegFlushKey(handle); } // Token: 0x0600077F RID: 1919 RVA: 0x00017A98 File Offset: 0x00015C98 public void Close(RegistryKey rkey) { if (!Win32RegistryApi.IsHandleValid(rkey)) { return; } IntPtr handle = Win32RegistryApi.GetHandle(rkey); Win32RegistryApi.RegCloseKey(handle); } // Token: 0x06000780 RID: 1920 RVA: 0x00017AC0 File Offset: 0x00015CC0 public RegistryKey CreateSubKey(RegistryKey rkey, string keyName) { IntPtr handle = Win32RegistryApi.GetHandle(rkey); IntPtr intPtr; int num = Win32RegistryApi.RegCreateKey(handle, keyName, out intPtr); if (num == 1018) { throw RegistryKey.CreateMarkedForDeletionException(); } if (num != 0) { this.GenerateException(num); } return new RegistryKey(intPtr, Win32RegistryApi.CombineName(rkey, keyName), true); } // Token: 0x06000781 RID: 1921 RVA: 0x00017B10 File Offset: 0x00015D10 public void DeleteKey(RegistryKey rkey, string keyName, bool shouldThrowWhenKeyMissing) { IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num = Win32RegistryApi.RegDeleteKey(handle, keyName); if (num != 2) { if (num != 0) { this.GenerateException(num); } return; } if (shouldThrowWhenKeyMissing) { throw new ArgumentException("key " + keyName); } } // Token: 0x06000782 RID: 1922 RVA: 0x00017B58 File Offset: 0x00015D58 public void DeleteValue(RegistryKey rkey, string value, bool shouldThrowWhenKeyMissing) { IntPtr handle = Win32RegistryApi.GetHandle(rkey); int num = Win32RegistryApi.RegDeleteValue(handle, value); if (num == 1018) { return; } if (num != 2) { if (num != 0) { this.GenerateException(num); } return; } if (shouldThrowWhenKeyMissing) { throw new ArgumentException("value " + value); } } // Token: 0x06000783 RID: 1923 RVA: 0x00017BAC File Offset: 0x00015DAC public string[] GetSubKeyNames(RegistryKey rkey) { IntPtr handle = Win32RegistryApi.GetHandle(rkey); StringBuilder stringBuilder = new StringBuilder(1024); ArrayList arrayList = new ArrayList(); int num = 0; for (;;) { int num2 = Win32RegistryApi.RegEnumKey(handle, num, stringBuilder, stringBuilder.Capacity); if (num2 == 0) { arrayList.Add(stringBuilder.ToString()); stringBuilder.Length = 0; } else { if (num2 == 259) { break; } this.GenerateException(num2); } num++; } return (string[])arrayList.ToArray(typeof(string)); } // Token: 0x06000784 RID: 1924 RVA: 0x00017C40 File Offset: 0x00015E40 public string[] GetValueNames(RegistryKey rkey) { IntPtr handle = Win32RegistryApi.GetHandle(rkey); ArrayList arrayList = new ArrayList(); int num = 0; for (;;) { StringBuilder stringBuilder = new StringBuilder(1024); int capacity = stringBuilder.Capacity; RegistryValueKind registryValueKind = RegistryValueKind.Unknown; int num2 = Win32RegistryApi.RegEnumValue(handle, num, stringBuilder, ref capacity, IntPtr.Zero, ref registryValueKind, IntPtr.Zero, IntPtr.Zero); if (num2 == 0 || num2 == 234) { arrayList.Add(stringBuilder.ToString()); } else { if (num2 == 259) { break; } if (num2 == 1018) { goto Block_3; } this.GenerateException(num2); } num++; } return (string[])arrayList.ToArray(typeof(string)); Block_3: throw RegistryKey.CreateMarkedForDeletionException(); } // Token: 0x06000785 RID: 1925 RVA: 0x00017D04 File Offset: 0x00015F04 private void GenerateException(int errorCode) { switch (errorCode) { case 2: break; default: if (errorCode == 53) { throw new IOException("The network path was not found."); } if (errorCode != 87) { throw new SystemException(); } break; case 5: throw new SecurityException(); } throw new ArgumentException(); } // Token: 0x06000786 RID: 1926 RVA: 0x00017D5C File Offset: 0x00015F5C public string ToString(RegistryKey rkey) { return rkey.Name; } // Token: 0x06000787 RID: 1927 RVA: 0x00017D64 File Offset: 0x00015F64 internal static string CombineName(RegistryKey rkey, string localName) { return rkey.Name + "\\" + localName; } // Token: 0x04000109 RID: 265 private const int OpenRegKeyRead = 131097; // Token: 0x0400010A RID: 266 private const int OpenRegKeyWrite = 131078; // Token: 0x0400010B RID: 267 private const int Int32ByteSize = 4; // Token: 0x0400010C RID: 268 private const int BufferMaxLength = 1024; // Token: 0x0400010D RID: 269 private readonly int NativeBytesPerCharacter = Marshal.SystemDefaultCharSize; } }