protected string GetRegistryValueData(string hive, string keyName, string valueName) { string lineStart = String.Format("{0},\"{1}\",\"{2}\"", hive, keyName, valueName); string line; int lineIndex = GetLineStartIndex("AddReg", lineStart, out line); if (lineIndex >= 0) { int valueDataStartIndex = line.Substring(lineStart.Length + 1).IndexOf(",") + lineStart.Length + 2; string hexStringValueTypeFlags = line.Substring(lineStart.Length + 1, valueDataStartIndex - lineStart.Length - 2); string valueData = line.Substring(valueDataStartIndex); RegistryValueKind valueKind = PNPDriverINFFile.GetRegistryValueKind(hexStringValueTypeFlags); if (valueKind == RegistryValueKind.MultiString) { return(valueData); } else { return(Unquote(valueData)); } } else { return(String.Empty); } }
/// <param name="relativeRoot"> /// The location where HKR entried will be stored, relative to 'SYSTEM\CurrentControlSet\' (or ControlSet001 for that matter) /// </param> private void ProcessAddRegSection(PNPDriverINFFile pnpDriverInf, string sectionName, string relativeRoot) { List <string> section = pnpDriverInf.GetSection(sectionName); foreach (string line in section) { List <string> values = INIFile.GetCommaSeparatedValues(line); string hiveName = values[0]; string subKeyName = INIFile.Unquote(values[1]); string valueName = INIFile.TryGetValue(values, 2); string valueType = INIFile.TryGetValue(values, 3);; string valueDataUnparsed = String.Empty; if (values.Count > 3) { valueDataUnparsed = StringUtils.Join(values.GetRange(4, values.Count - 4), ","); // byte-list is separated using commmas } valueName = INIFile.Unquote(valueName); valueType = pnpDriverInf.ExpandToken(valueType); int valueTypeFlags = PNPDriverINFFile.ConvertFromIntStringOrHexString(valueType); string valueTypeHexString; if (!valueType.StartsWith("0x")) { valueTypeHexString = "0x" + valueTypeFlags.ToString("X8"); // we want value type in 8 digit hex string. } else { valueTypeHexString = valueType; } RegistryValueKind valueKind = PNPDriverINFFile.GetRegistryValueKind(valueTypeFlags); if (valueKind == RegistryValueKind.String) { valueDataUnparsed = pnpDriverInf.ExpandToken(valueDataUnparsed); } object valueData = HiveINIFile.ParseValueDataString(valueDataUnparsed, valueKind); if (hiveName == "HKR") { string cssKeyName = relativeRoot; if (subKeyName != String.Empty) { cssKeyName = cssKeyName + @"\" + subKeyName; } // Note that software key will stick from text-mode: SetCurrentControlSetRegistryKey(cssKeyName, valueName, valueKind, valueData); } else if (hiveName == "HKLM" && subKeyName.StartsWith(@"SYSTEM\CurrentControlSet\", StringComparison.InvariantCultureIgnoreCase)) { string cssKeyName = subKeyName.Substring(@"SYSTEM\CurrentControlSet\".Length); SetCurrentControlSetRegistryKey(cssKeyName, valueName, valueKind, valueData); } else { //Console.WriteLine("Warning: unsupported registry path: " + hiveName + @"\" + subKeyName); } } }