// dnlib: See LICENSE.txt for more info
using dnlib.IO;
using dnlib.PE;
using dnlib.DotNet.MD;
namespace dnlib.DotNet.Writer {
///
/// Options to
///
public sealed class Cor20HeaderOptions {
///
/// Default major runtime version
///
public const ushort DEFAULT_MAJOR_RT_VER = 2;
///
/// Default minor runtime version
///
public const ushort DEFAULT_MINOR_RT_VER = 5;
///
/// Major runtime version
///
public ushort? MajorRuntimeVersion;
///
/// Minor runtime version
///
public ushort? MinorRuntimeVersion;
///
/// Flags
///
public ComImageFlags? Flags;
///
/// Entry point or null. Either a Method/File token or an RVA.
///
public uint? EntryPoint;
///
/// Default constructor
///
public Cor20HeaderOptions() {
}
///
/// Constructor
///
/// Flags
public Cor20HeaderOptions(ComImageFlags flags) => Flags = flags;
///
/// Constructor
///
/// Major runtime version (default is )
/// Minor runtime version (default is )
/// Flags
public Cor20HeaderOptions(ushort major, ushort minor, ComImageFlags flags) {
MajorRuntimeVersion = major;
MinorRuntimeVersion = minor;
Flags = flags;
}
}
///
/// .NET header
///
public sealed class ImageCor20Header : IChunk {
FileOffset offset;
RVA rva;
Cor20HeaderOptions options;
///
/// Gets/sets the
///
public Metadata Metadata { get; set; }
///
/// Gets/sets the .NET resources
///
public NetResources NetResources { get; set; }
///
/// Gets/sets the strong name signature
///
public StrongNameSignature StrongNameSignature { get; set; }
internal IChunk VtableFixups { get; set; }
///
public FileOffset FileOffset => offset;
///
public RVA RVA => rva;
///
/// Constructor
///
/// Options
public ImageCor20Header(Cor20HeaderOptions options) => this.options = options;
///
public void SetOffset(FileOffset offset, RVA rva) {
this.offset = offset;
this.rva = rva;
}
///
public uint GetFileLength() => 0x48;
///
public uint GetVirtualSize() => GetFileLength();
///
public uint CalculateAlignment() => 0;
///
public void WriteTo(DataWriter writer) {
writer.WriteInt32(0x48); // cb
writer.WriteUInt16(options.MajorRuntimeVersion ?? Cor20HeaderOptions.DEFAULT_MAJOR_RT_VER);
writer.WriteUInt16(options.MinorRuntimeVersion ?? Cor20HeaderOptions.DEFAULT_MINOR_RT_VER);
writer.WriteDataDirectory(Metadata);
writer.WriteUInt32((uint)(options.Flags ?? ComImageFlags.ILOnly));
writer.WriteUInt32(options.EntryPoint ?? 0);
writer.WriteDataDirectory(NetResources);
writer.WriteDataDirectory(StrongNameSignature);
writer.WriteDataDirectory(null); // Code manager table
writer.WriteDataDirectory(VtableFixups);
writer.WriteDataDirectory(null); // Export address table jumps
writer.WriteDataDirectory(null); // Managed native header
}
}
}