private RegistryCaptureKey GetKey(RegistryKey key) { string path; int pos = key.Name.IndexOf(m_rootKey); if (pos != -1) { path = key.Name.Substring(pos + m_rootKey.Length); } else { path = key.Name; } if (path.StartsWith("\\")) { path = path.Substring(1); } RegistryCaptureKey captureKey = new RegistryCaptureKey(path); // Iterate over all values. foreach (string name in key.GetValueNames()) { switch (key.GetValueKind(name)) { case RegistryValueKind.String: captureKey.Add(new RegistryCaptureStringValue(name, key.GetValue(name) as string)); break; case RegistryValueKind.DWord: captureKey.Add(new RegistryCaptureDWordValue(name, (int)key.GetValue(name))); break; case RegistryValueKind.ExpandString: captureKey.Add(new RegistryCaptureExpandStringValue(name, key.GetValue(name) as string)); break; case RegistryValueKind.MultiString: captureKey.Add(new RegistryCaptureMultiStringValue(name, key.GetValue(name) as string[])); break; case RegistryValueKind.Unknown: case RegistryValueKind.Binary: case RegistryValueKind.QWord: captureKey.Add(new RegistryCaptureValue(name, key.GetValue(name))); break; } } // Iterate over sub keys. foreach (string subKeyName in key.GetSubKeyNames()) { using (RegistryKey subKey = key.OpenSubKey(subKeyName)) { captureKey.Add(GetKey(subKey)); } } return(captureKey); }