// 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 } } }