// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Xml.Serialization;
namespace R2RDump
{
public struct R2RImportSection
{
public enum CorCompileImportType
{
CORCOMPILE_IMPORT_TYPE_UNKNOWN = 0,
CORCOMPILE_IMPORT_TYPE_EXTERNAL_METHOD = 1,
CORCOMPILE_IMPORT_TYPE_STUB_DISPATCH = 2,
CORCOMPILE_IMPORT_TYPE_STRING_HANDLE = 3,
CORCOMPILE_IMPORT_TYPE_TYPE_HANDLE = 4,
CORCOMPILE_IMPORT_TYPE_METHOD_HANDLE = 5,
CORCOMPILE_IMPORT_TYPE_VIRTUAL_METHOD = 6,
};
public enum CorCompileImportFlags
{
CORCOMPILE_IMPORT_FLAGS_UNKNOWN = 0x0000,
CORCOMPILE_IMPORT_FLAGS_EAGER = 0x0001, // Section at module load time.
CORCOMPILE_IMPORT_FLAGS_CODE = 0x0002, // Section contains code.
CORCOMPILE_IMPORT_FLAGS_PCODE = 0x0004, // Section contains pointers to code.
};
public struct ImportSectionEntry
{
public int StartOffset { get; set; }
public long Section { get; set; }
[XmlAttribute("Index")]
public uint SignatureRVA { get; set; }
public byte[] SignatureSample { get; set; }
public ImportSectionEntry(int startOffset, long section, uint signatureRVA, byte[] signatureSample)
{
StartOffset = startOffset;
Section = section;
SignatureRVA = signatureRVA;
SignatureSample = signatureSample;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append($@"+{StartOffset:X4} Section: 0x{Section:X8} SignatureRVA: 0x{SignatureRVA:X8} ");
foreach (byte b in SignatureSample)
{
sb.AppendFormat("{0:X2} ", b);
}
sb.Append("...");
return sb.ToString();
}
}
///
/// Section containing values to be fixed up
///
[XmlAttribute("Index")]
public int SectionRVA { get; set; }
public int SectionSize { get; set; }
///
/// One or more of ImportSectionFlags
///
public CorCompileImportFlags Flags { get; set; }
///
/// One of ImportSectionType
///
public CorCompileImportType Type { get; set; }
///
///
///
public byte EntrySize { get; set; }
///
/// RVA of optional signature descriptors
///
public int SignatureRVA { get; set; }
public List Entries { get; set; }
///
/// RVA of optional auxiliary data (typically GC info)
///
public int AuxiliaryDataRVA { get; set; }
public GcInfo AuxiliaryData { get; set; }
public R2RImportSection(byte[] image, int rva, int size, CorCompileImportFlags flags, byte type, byte entrySize, int signatureRVA, List entries, int auxDataRVA, int auxDataOffset, Machine machine, ushort majorVersion)
{
SectionRVA = rva;
SectionSize = size;
Flags = flags;
Type = (CorCompileImportType)type;
EntrySize = entrySize;
SignatureRVA = signatureRVA;
Entries = entries;
AuxiliaryDataRVA = auxDataRVA;
AuxiliaryData = null;
if (AuxiliaryDataRVA != 0)
{
AuxiliaryData = new GcInfo(image, auxDataOffset, machine, majorVersion);
}
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine($"SectionRVA: 0x{SectionRVA:X8} ({SectionRVA})");
sb.AppendLine($"SectionSize: {SectionSize} bytes");
sb.AppendLine($"Flags: {Flags}");
sb.AppendLine($"Type: {Type}");
sb.AppendLine($"EntrySize: {EntrySize}");
sb.AppendLine($"SignatureRVA: 0x{SignatureRVA:X8} ({SignatureRVA})");
sb.AppendLine($"AuxiliaryDataRVA: 0x{AuxiliaryDataRVA:X8} ({AuxiliaryDataRVA})");
if (AuxiliaryDataRVA != 0)
{
sb.AppendLine("AuxiliaryData:");
sb.AppendLine(AuxiliaryData.ToString());
}
return sb.ToString();
}
}
}