Exemple #1
0
        private static FieldRvaRow FindFieldRvaRow(TablesStream tablesStream, MetadataToken cctorToken, MetadataToken fieldToken)
        {
            var reader = tablesStream
                         .GetTable <MethodDefinitionRow>(TableIndex.Method)
                         .GetByRid(cctorToken.Rid)
                         .Body.CreateReader();

            var body         = CilRawMethodBody.FromReader(ThrowErrorListener.Instance, reader);
            var disassembler = new CilDisassembler(new ByteArrayReader(body.Code));

            var initialValueFieldToken = MetadataToken.Zero;

            var instructions = disassembler.ReadAllInstructions();

            for (int i = 0; i < instructions.Count; i++)
            {
                if (instructions[i].OpCode.Code == CilCode.Ldtoken &&
                    instructions[i + 2].OpCode.Code == CilCode.Stsfld &&
                    (MetadataToken)instructions[i + 2].Operand == fieldToken)
                {
                    initialValueFieldToken = (MetadataToken)instructions[i].Operand;
                    break;
                }
            }

            Assert.NotEqual(MetadataToken.Zero, initialValueFieldToken);
            Assert.True(tablesStream
                        .GetTable <FieldRvaRow>(TableIndex.FieldRva)
                        .TryGetRowByKey(1, initialValueFieldToken.Rid, out var fieldRvaRow));
            return(fieldRvaRow);
        }
Exemple #2
0
        public void RedirectedRangeMultipleItems()
        {
            var stream        = new TablesStream();
            var redirectTable = stream.GetTable <MethodPointerRow>();

            redirectTable.Add(new MethodPointerRow(1));
            redirectTable.Add(new MethodPointerRow(2));
            redirectTable.Add(new MethodPointerRow(5));
            redirectTable.Add(new MethodPointerRow(4));
            redirectTable.Add(new MethodPointerRow(3));
            redirectTable.Add(new MethodPointerRow(9));
            redirectTable.Add(new MethodPointerRow(8));
            redirectTable.Add(new MethodPointerRow(10));

            var range = new RedirectedMetadataRange(redirectTable, TableIndex.Method, 3, 8);

            Assert.Equal(5, range.Count);
            Assert.Equal(new[]
            {
                new MetadataToken(TableIndex.Method, 5),
                new MetadataToken(TableIndex.Method, 4),
                new MetadataToken(TableIndex.Method, 3),
                new MetadataToken(TableIndex.Method, 9),
                new MetadataToken(TableIndex.Method, 8)
            }, range);
        }
Exemple #3
0
        public void RedirectedRangeEmpty()
        {
            var stream        = new TablesStream();
            var redirectTable = stream.GetTable <MethodPointerRow>();

            var range = new RedirectedMetadataRange(redirectTable, TableIndex.Method, 3, 3);

            Assert.Equal(0, range.Count);
            Assert.Empty(range);
        }
Exemple #4
0
        public static void AssertWriteThenReadIsSame <TRow>(TRow expected,
                                                            SerializedMetadataTable <TRow> .ReadRowExtendedDelegate readRow)
            where TRow : struct, IMetadataRow
        {
            var tablesStream = new TablesStream();
            var table        = tablesStream.GetTable <TRow>();

            using var tempStream = new MemoryStream();
            expected.Write(new BinaryStreamWriter(tempStream), table.Layout);
            var newRow = readRow(new PEReaderContext(new PEFile()), new ByteArrayReader(tempStream.ToArray()), table.Layout);

            Assert.Equal(expected, newRow);
        }
        public static void AssertWriteThenReadIsSame <TRow>(TRow expected,
                                                            SerializedMetadataTable <TRow> .ReadRowDelegate readRow)
            where TRow : struct, IMetadataRow
        {
            var tablesStream = new TablesStream();
            var table        = tablesStream.GetTable <TRow>();

            using var tempStream = new MemoryStream();
            expected.Write(new BinaryStreamWriter(tempStream), table.Layout);
            var reader = ByteArrayDataSource.CreateReader(tempStream.ToArray());
            var newRow = readRow(ref reader, table.Layout);

            Assert.Equal(expected, newRow);
        }
Exemple #6
0
        public void RedirectedRangeSingleItem()
        {
            var stream        = new TablesStream();
            var redirectTable = stream.GetTable <MethodPointerRow>();

            redirectTable.Add(new MethodPointerRow(1));
            redirectTable.Add(new MethodPointerRow(2));
            redirectTable.Add(new MethodPointerRow(5));
            redirectTable.Add(new MethodPointerRow(4));
            redirectTable.Add(new MethodPointerRow(3));

            var range = new RedirectedMetadataRange(redirectTable, TableIndex.Method, 3, 4);

            Assert.Equal(1, range.Count);
            Assert.Single(range);
            Assert.Equal(new MetadataToken(TableIndex.Method, 5), range.First());
        }
 private IMetadataTableBuffer <TRow> Unsorted <TRow>(TableIndex table)
     where TRow : struct, IMetadataRow
 {
     return(new UnsortedMetadataTableBuffer <TRow>((MetadataTable <TRow>)_tablesStream.GetTable(table)));
 }