Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 5
0
        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);
        }