// dnlib: See LICENSE.txt for more info using System; using dnlib.IO; namespace dnlib.PE { /// /// Represents the IMAGE_FILE_HEADER PE section /// public sealed class ImageFileHeader : FileSection { readonly Machine machine; readonly ushort numberOfSections; readonly uint timeDateStamp; readonly uint pointerToSymbolTable; readonly uint numberOfSymbols; readonly ushort sizeOfOptionalHeader; readonly Characteristics characteristics; /// /// Returns the IMAGE_FILE_HEADER.Machine field /// public Machine Machine => machine; /// /// Returns the IMAGE_FILE_HEADER.NumberOfSections field /// public int NumberOfSections => numberOfSections; /// /// Returns the IMAGE_FILE_HEADER.TimeDateStamp field /// public uint TimeDateStamp => timeDateStamp; /// /// Returns the IMAGE_FILE_HEADER.PointerToSymbolTable field /// public uint PointerToSymbolTable => pointerToSymbolTable; /// /// Returns the IMAGE_FILE_HEADER.NumberOfSymbols field /// public uint NumberOfSymbols => numberOfSymbols; /// /// Returns the IMAGE_FILE_HEADER.SizeOfOptionalHeader field /// public uint SizeOfOptionalHeader => sizeOfOptionalHeader; /// /// Returns the IMAGE_FILE_HEADER.Characteristics field /// public Characteristics Characteristics => characteristics; /// /// Constructor /// /// PE file reader pointing to the start of this section /// Verify section /// Thrown if verification fails public ImageFileHeader(ref DataReader reader, bool verify) { SetStartOffset(ref reader); machine = (Machine)reader.ReadUInt16(); numberOfSections = reader.ReadUInt16(); timeDateStamp = reader.ReadUInt32(); pointerToSymbolTable = reader.ReadUInt32(); numberOfSymbols = reader.ReadUInt32(); sizeOfOptionalHeader = reader.ReadUInt16(); characteristics = (Characteristics)reader.ReadUInt16(); SetEndoffset(ref reader); if (verify && sizeOfOptionalHeader == 0) throw new BadImageFormatException("Invalid SizeOfOptionalHeader"); } } }