private static void TestFieldRva(WindowsAssembly assembly, TypeSignature fieldType, byte[] fieldRvaData, bool saveToDisk) { const string fieldName = "MyField"; // set up temp assembly. var tableStream = assembly.NetDirectory.MetadataHeader.GetStream <TableStream>(); var fieldTable = tableStream.GetTable <FieldDefinition>(); var fieldRvaTable = tableStream.GetTable <FieldRva>(); // create temp field. var field = new FieldDefinition(fieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(fieldType)); fieldTable.Add(field); // create field rva. var fieldRva = new FieldRva(field, fieldRvaData); field.FieldRva = fieldRva; fieldRvaTable.Add(fieldRva); assembly = Utilities.RebuildNetAssembly(assembly, saveToDisk); tableStream = assembly.NetDirectory.MetadataHeader.GetStream <TableStream>(); fieldTable = tableStream.GetTable <FieldDefinition>(); field = fieldTable.FirstOrDefault(x => x.Name == fieldName); Assert.IsNotNull(field); Assert.IsNotNull(field.FieldRva); Utilities.ValidateByteArrays(fieldRvaData, field.FieldRva.Data); }
public void TestInterpretAsArray() { var elementType = ElementType.I4; int[] expected = new int[] { 1, 2, 3 }; byte[] data = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }; var assembly = Utilities.CreateTempNetAssembly(); var importer = new ReferenceImporter(assembly.NetDirectory.MetadataHeader.GetStream <TableStream>()); var fieldType = new TypeDefinition(string.Empty, "__StaticArrayInitTypeSize=" + data.Length, importer.ImportType(typeof(ValueType))); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(new TypeDefOrRefSignature(fieldType) { IsValueType = true })); var fieldRva = new FieldRva(field, data); int[] actual = fieldRva.InterpretAsArray(elementType).Cast <int>().ToArray(); Assert.AreEqual(expected.Length, actual.Length, "Length of arrays differ."); for (int i = 0; i < actual.Length; i++) { Assert.AreEqual(expected[i], actual[i], "Element " + i + " differs from expected."); } }
public DataSegment GetFieldRvaSegment(FieldRva fieldRva) { DataSegment segment; if (!_dataSegments.TryGetValue(fieldRva, out segment)) { segment = new DataSegment(fieldRva.Data); Segments.Add(segment); _dataSegments.Add(fieldRva, segment); } return segment; }
public DataSegment GetFieldRvaSegment(FieldRva fieldRva) { DataSegment segment; if (!_dataSegments.TryGetValue(fieldRva, out segment)) { segment = new DataSegment(fieldRva.Data); Segments.Add(segment); _dataSegments.Add(fieldRva, segment); } return(segment); }
public void TestInterpretData() { var assembly = Utilities.CreateTempNetAssembly(); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(assembly.NetDirectory.MetadataHeader.TypeSystem.Int32)); var fieldRva = new FieldRva(field, BitConverter.GetBytes(1337)); Assert.AreEqual(1337, fieldRva.InterpretData(field.Signature.FieldType)); }
private void AddFieldRva(FieldRva fieldRva) { var table = (FieldRvaTable)_tableStream.GetTable(MetadataTokenType.FieldRva); // Create and add row. var rvaRow = new MetadataRow <DataSegment, uint> { Column1 = new DataSegment(fieldRva.Data), Column2 = GetNewToken(fieldRva.Field).Rid }; table.Add(rvaRow); _members.Add(fieldRva, rvaRow.MetadataToken); }
public void TestInterpretAsArray() { var elementType = ElementType.I4; int[] expected = new int[] { 1, 2, 3 }; byte[] data = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }; var assembly = Utilities.CreateTempNetAssembly(); var importer = new ReferenceImporter(assembly.NetDirectory.MetadataHeader.GetStream<TableStream>()); var fieldType = new TypeDefinition(string.Empty, "__StaticArrayInitTypeSize=" + data.Length, importer.ImportType(typeof(ValueType))); var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(new TypeDefOrRefSignature(fieldType) { IsValueType = true })); var fieldRva = new FieldRva(field, data); int[] actual = fieldRva.InterpretAsArray(elementType).Cast<int>().ToArray(); Assert.AreEqual(expected.Length, actual.Length, "Length of arrays differ."); for (int i = 0; i < actual.Length; i++) Assert.AreEqual(expected[i], actual[i], "Element " + i + " differs from expected."); }
public void PersistentRva() { byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; var assembly = NetAssemblyFactory.CreateAssembly(DummyAssemblyName, true); var header = assembly.NetDirectory.MetadataHeader; var image = header.LockMetadata(); var field = CreateAndAddDummyField(image); var newRva = new FieldRva(data); field.FieldRva = newRva; field.HasFieldRva = true; var mapping = header.UnlockMetadata(); var rvaRow = header.GetStream <TableStream>().GetTable <FieldRvaTable>()[(int)(mapping[newRva].Rid - 1)]; Assert.Equal(data, rvaRow.Column1.Data); image = header.LockMetadata(); field = (FieldDefinition)image.ResolveMember(mapping[field]); Assert.NotNull(field.FieldRva); Assert.Equal(data, field.FieldRva.Data); }
private static void TestFieldRva(WindowsAssembly assembly, TypeSignature fieldType, byte[] fieldRvaData, bool saveToDisk) { // set up temp assembly. var tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>(); var fieldTable = tableStream.GetTable<FieldDefinition>(); var fieldRvaTable = tableStream.GetTable<FieldRva>(); // create temp field. var field = new FieldDefinition(FieldName, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.HasFieldRva, new FieldSignature(fieldType)); fieldTable.Add(field); // create field rva. var fieldRva = new FieldRva(field, fieldRvaData); field.FieldRva = fieldRva; fieldRvaTable.Add(fieldRva); assembly = Utilities.RebuildNetAssembly(assembly, saveToDisk); tableStream = assembly.NetDirectory.MetadataHeader.GetStream<TableStream>(); fieldTable = tableStream.GetTable<FieldDefinition>(); field = fieldTable.FirstOrDefault(x => x.Name == FieldName); Assert.IsNotNull(field); Assert.IsNotNull(field.FieldRva); Utilities.ValidateByteArrays(fieldRvaData, field.FieldRva.Data); }