Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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.");
            }
        }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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.");
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 10
0
        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);
        }