// dnlib: See LICENSE.txt for more info using System; using dnlib.IO; namespace dnlib.PE { /// /// Represents the IMAGE_OPTIONAL_HEADER64 PE section /// public sealed class ImageOptionalHeader64 : FileSection, IImageOptionalHeader { readonly ushort magic; readonly byte majorLinkerVersion; readonly byte minorLinkerVersion; readonly uint sizeOfCode; readonly uint sizeOfInitializedData; readonly uint sizeOfUninitializedData; readonly RVA addressOfEntryPoint; readonly RVA baseOfCode; readonly ulong imageBase; readonly uint sectionAlignment; readonly uint fileAlignment; readonly ushort majorOperatingSystemVersion; readonly ushort minorOperatingSystemVersion; readonly ushort majorImageVersion; readonly ushort minorImageVersion; readonly ushort majorSubsystemVersion; readonly ushort minorSubsystemVersion; readonly uint win32VersionValue; readonly uint sizeOfImage; readonly uint sizeOfHeaders; readonly uint checkSum; readonly Subsystem subsystem; readonly DllCharacteristics dllCharacteristics; readonly ulong sizeOfStackReserve; readonly ulong sizeOfStackCommit; readonly ulong sizeOfHeapReserve; readonly ulong sizeOfHeapCommit; readonly uint loaderFlags; readonly uint numberOfRvaAndSizes; readonly ImageDataDirectory[] dataDirectories = new ImageDataDirectory[16]; /// /// Returns the IMAGE_OPTIONAL_HEADER64.Magic field /// public ushort Magic => magic; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MajorLinkerVersion field /// public byte MajorLinkerVersion => majorLinkerVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MinorLinkerVersion field /// public byte MinorLinkerVersion => minorLinkerVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfCode field /// public uint SizeOfCode => sizeOfCode; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfInitializedData field /// public uint SizeOfInitializedData => sizeOfInitializedData; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfUninitializedData field /// public uint SizeOfUninitializedData => sizeOfUninitializedData; /// /// Returns the IMAGE_OPTIONAL_HEADER64.AddressOfEntryPoint field /// public RVA AddressOfEntryPoint => addressOfEntryPoint; /// /// Returns the IMAGE_OPTIONAL_HEADER64.BaseOfCode field /// public RVA BaseOfCode => baseOfCode; /// /// Returns 0 since BaseOfData is not present in IMAGE_OPTIONAL_HEADER64 /// public RVA BaseOfData => 0; /// /// Returns the IMAGE_OPTIONAL_HEADER64.ImageBase field /// public ulong ImageBase => imageBase; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SectionAlignment field /// public uint SectionAlignment => sectionAlignment; /// /// Returns the IMAGE_OPTIONAL_HEADER64.FileAlignment field /// public uint FileAlignment => fileAlignment; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MajorOperatingSystemVersion field /// public ushort MajorOperatingSystemVersion => majorOperatingSystemVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MinorOperatingSystemVersion field /// public ushort MinorOperatingSystemVersion => minorOperatingSystemVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MajorImageVersion field /// public ushort MajorImageVersion => majorImageVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MinorImageVersion field /// public ushort MinorImageVersion => minorImageVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MajorSubsystemVersion field /// public ushort MajorSubsystemVersion => majorSubsystemVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.MinorSubsystemVersion field /// public ushort MinorSubsystemVersion => minorSubsystemVersion; /// /// Returns the IMAGE_OPTIONAL_HEADER64.Win32VersionValue field /// public uint Win32VersionValue => win32VersionValue; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfImage field /// public uint SizeOfImage => sizeOfImage; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfHeaders field /// public uint SizeOfHeaders => sizeOfHeaders; /// /// Returns the IMAGE_OPTIONAL_HEADER64.CheckSum field /// public uint CheckSum => checkSum; /// /// Returns the IMAGE_OPTIONAL_HEADER64.Subsystem field /// public Subsystem Subsystem => subsystem; /// /// Returns the IMAGE_OPTIONAL_HEADER64.DllCharacteristics field /// public DllCharacteristics DllCharacteristics => dllCharacteristics; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfStackReserve field /// public ulong SizeOfStackReserve => sizeOfStackReserve; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfStackCommit field /// public ulong SizeOfStackCommit => sizeOfStackCommit; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfHeapReserve field /// public ulong SizeOfHeapReserve => sizeOfHeapReserve; /// /// Returns the IMAGE_OPTIONAL_HEADER64.SizeOfHeapCommit field /// public ulong SizeOfHeapCommit => sizeOfHeapCommit; /// /// Returns the IMAGE_OPTIONAL_HEADER64.LoaderFlags field /// public uint LoaderFlags => loaderFlags; /// /// Returns the IMAGE_OPTIONAL_HEADER64.NumberOfRvaAndSizes field /// public uint NumberOfRvaAndSizes => numberOfRvaAndSizes; /// /// Returns the IMAGE_OPTIONAL_HEADER64.DataDirectories field /// public ImageDataDirectory[] DataDirectories => dataDirectories; /// /// Constructor /// /// PE file reader pointing to the start of this section /// Total size of this optional header (from the file header) /// Verify section /// Thrown if verification fails public ImageOptionalHeader64(ref DataReader reader, uint totalSize, bool verify) { if (totalSize < 0x70) throw new BadImageFormatException("Invalid optional header size"); if (verify && (ulong)reader.Position + totalSize > reader.Length) throw new BadImageFormatException("Invalid optional header size"); SetStartOffset(ref reader); magic = reader.ReadUInt16(); majorLinkerVersion = reader.ReadByte(); minorLinkerVersion = reader.ReadByte(); sizeOfCode = reader.ReadUInt32(); sizeOfInitializedData = reader.ReadUInt32(); sizeOfUninitializedData = reader.ReadUInt32(); addressOfEntryPoint = (RVA)reader.ReadUInt32(); baseOfCode = (RVA)reader.ReadUInt32(); imageBase = reader.ReadUInt64(); sectionAlignment = reader.ReadUInt32(); fileAlignment = reader.ReadUInt32(); majorOperatingSystemVersion = reader.ReadUInt16(); minorOperatingSystemVersion = reader.ReadUInt16(); majorImageVersion = reader.ReadUInt16(); minorImageVersion = reader.ReadUInt16(); majorSubsystemVersion = reader.ReadUInt16(); minorSubsystemVersion = reader.ReadUInt16(); win32VersionValue = reader.ReadUInt32(); sizeOfImage = reader.ReadUInt32(); sizeOfHeaders = reader.ReadUInt32(); checkSum = reader.ReadUInt32(); subsystem = (Subsystem)reader.ReadUInt16(); dllCharacteristics = (DllCharacteristics)reader.ReadUInt16(); sizeOfStackReserve = reader.ReadUInt64(); sizeOfStackCommit = reader.ReadUInt64(); sizeOfHeapReserve = reader.ReadUInt64(); sizeOfHeapCommit = reader.ReadUInt64(); loaderFlags = reader.ReadUInt32(); numberOfRvaAndSizes = reader.ReadUInt32(); for (int i = 0; i < dataDirectories.Length; i++) { uint len = reader.Position - (uint)startOffset; if (len + 8 <= totalSize) dataDirectories[i] = new ImageDataDirectory(ref reader, verify); else dataDirectories[i] = new ImageDataDirectory(); } reader.Position = (uint)startOffset + totalSize; SetEndoffset(ref reader); } } }