/// <summary>
 /// Creates a new managed PE file builder context.
 /// </summary>
 /// <param name="image">The image to build.</param>
 public ManagedPEBuilderContext(IPEImage image)
 {
     ImportDirectory      = new ImportDirectoryBuffer(image.PEKind == OptionalHeaderMagic.Pe32);
     ExportDirectory      = new ExportDirectoryBuffer();
     DotNetSegment        = new DotNetSegmentBuffer(image.DotNetDirectory);
     ResourceDirectory    = new ResourceDirectoryBuffer();
     RelocationsDirectory = new RelocationsDirectoryBuffer();
     FieldRvaDataReader   = new FieldRvaDataReader();
     Bootstrapper         = CreateBootstrapper(image);
 }
예제 #2
0
        public void ReadByteArray()
        {
            // Open image.
            var image    = PEImage.FromFile(typeof(InitialValues).Assembly.Location);
            var metadata = image.DotNetDirectory.Metadata;

            // Get token of field.
            var cctorToken = (MetadataToken)typeof(InitialValues)
                             .TypeInitializer
                             .MetadataToken;
            var fieldToken = (MetadataToken)typeof(InitialValues)
                             .GetField(nameof(InitialValues.ByteArray))
                             .MetadataToken;

            // Find associated field rva row.
            var fieldRvaRow = FindFieldRvaRow(metadata.GetStream <TablesStream>(), cctorToken, fieldToken);

            // Read the data.
            var dataReader = new FieldRvaDataReader();
            var segment    = dataReader.ResolveFieldData(ThrowErrorListener.Instance, metadata, fieldRvaRow) as IReadableSegment;

            Assert.NotNull(segment);
            Assert.Equal(InitialValues.ByteArray, segment.ToArray());
        }