internal static StringTable ReadStringTable(this PeReader reader) { var orgPos = reader.GetPosition(); var table = new StringTable(); reader.ReadFileInfo(table, 8); table.LanguageCode = ulong.Parse(table.Key, NumberStyles.HexNumber); // Read children (Strings, as sz key/value pairs) var children = new Dictionary <string, string>(); while (reader.GetPosition() < orgPos + table.Length) { var child = reader.ReadStringTableString(); children.Add(child.key, child.value); } table.Values = children.ToImmutableDictionary(); // Undocumented reader.ReadPadding(); return(table); }
internal static VarFileInfo ReadVarFileInfo(this PeReader reader) { var orgPos = reader.GetPosition(); var info = new VarFileInfo(); if (!reader.ReadFileInfo(info, "VarFileInfo")) { return(null); } var var = new Var(); if (!reader.ReadFileInfo(var, "Translation")) { return(null); } info.Value = var; var codes = new List <ulong>(); while (reader.GetPosition() < var.Position + var.Length) { ulong code = reader.ReadUInt16(); code = reader.ReadUInt16() | (code << 16); codes.Add(code); } info.Value.LanguageCodes = codes.ToImmutableArray(); return(info); }
internal static void ReadFileInfo(this PeReader reader, FileInfo info, int keyLen) { info.Position = reader.GetPosition(); info.Length = reader.ReadUInt16(); info.ValueLength = reader.ReadUInt16(); info.Type = reader.ReadUInt16(); info.Key = reader.ReadStringZ(keyLen); info.Padding1 = reader.ReadPadding(); }
internal static StringFileInfo ReadStringFileInfo(this PeReader reader) { var orgPos = reader.GetPosition(); var info = new StringFileInfo(); if (!reader.ReadFileInfo(info, "StringFileInfo")) { return(null); } // Read all children (StringTables) var children = new List <StringTable>(); while (reader.GetPosition() < orgPos + info.Length) { children.Add(reader.ReadStringTable()); } info.Children = children.ToImmutableList(); return(info); }
internal static bool ReadFileInfo(this PeReader reader, FileInfo info, string expectedKey) { var orgPos = reader.GetPosition(); reader.ReadFileInfo(info, expectedKey.Length); var result = info.Key.Equals(expectedKey, StringComparison.Ordinal); if (!result) { info.Position = 0; reader.SetPosition(orgPos); } return(result); }