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); }
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); }
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); }
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); }
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))); }