public void PackRegMultiBinary_1() { string[] src = new string[] { "C:\\", "Hello", "World", }; string dest = StringEscaper.PackRegMultiBinary(src); string comp = "43,00,3A,00,5C,00,00,00,48,00,65,00,6C,00,6C,00,6F,00,00,00,57,00,6F,00,72,00,6C,00,64,00"; Assert.IsTrue(dest.Equals(comp, StringComparison.Ordinal)); }
public static List <LogInfo> RegWrite(EngineState s, CodeCommand cmd) { // RegWrite,<HKey>,<ValueType>,<KeyPath>,<ValueName>,<ValueData>,[OptionalData] List <LogInfo> logs = new List <LogInfo>(); CodeInfo_RegWrite info = cmd.Info.Cast <CodeInfo_RegWrite>(); string keyPath = StringEscaper.Preprocess(s, info.KeyPath); string valueName = null; if (info.ValueName != null) { valueName = StringEscaper.Preprocess(s, info.ValueName); } if (info.HKey == null) { throw new InternalException("Internal Logic Error"); } string hKeyStr = RegistryHelper.RegKeyToString(info.HKey); string fullKeyPath = $"{hKeyStr}\\{keyPath}"; string fullValuePath = $"{hKeyStr}\\{keyPath}\\{valueName}"; using (RegistryKey subKey = info.HKey.CreateSubKey(keyPath, true)) { if (valueName == null) { logs.Add(new LogInfo(LogState.Success, $"Registry subkey [{fullKeyPath}] created")); return(logs); } object checkData = subKey.GetValue(valueName); if (checkData != null) { logs.Add(new LogInfo(info.NoWarn ? LogState.Ignore : LogState.Overwrite, $"Registry value [{fullValuePath}] already exists")); } switch (info.ValueType) { case RegistryValueKind.None: { subKey.SetValue(valueName, new byte[0], RegistryValueKind.None); logs.Add(new LogInfo(LogState.Success, $"Registry value [{fullValuePath}] set to REG_NONE")); } break; case RegistryValueKind.String: { string valueData = StringEscaper.Preprocess(s, info.ValueData); subKey.SetValue(valueName, valueData, RegistryValueKind.String); logs.Add(new LogInfo(LogState.Success, $"Registry value [{fullValuePath}] set to REG_SZ [{valueData}]")); } break; case RegistryValueKind.ExpandString: { string valueData = StringEscaper.Preprocess(s, info.ValueData); subKey.SetValue(valueName, valueData, RegistryValueKind.ExpandString); logs.Add(new LogInfo(LogState.Success, $"Registry value [{fullValuePath}] set to REG_EXPAND_SZ [{valueData}]")); } break; case RegistryValueKind.MultiString: { string[] multiStrs = StringEscaper.Preprocess(s, info.ValueDatas).ToArray(); subKey.SetValue(valueName, multiStrs, RegistryValueKind.MultiString); string valueData = StringEscaper.PackRegMultiBinary(multiStrs); logs.Add(new LogInfo(LogState.Success, $"Registry value [{fullValuePath}] set to REG_MULTI_SZ [{valueData}]")); } break; case RegistryValueKind.Binary: { if (info.ValueData == null) { // Use info.ValueDatas string[] binStrs = StringEscaper.Preprocess(s, info.ValueDatas).ToArray(); string valueData = StringEscaper.PackRegBinary(binStrs); if (!StringEscaper.UnpackRegBinary(binStrs, out byte[] binData))