// 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");
}
}
}