namespace SabreTools.Models.PortableExecutable { /// /// Every image file has an optional header that provides information to the loader. /// This header is optional in the sense that some files (specifically, object files) /// do not have it. For image files, this header is required. An object file can have /// an optional header, but generally this header has no function in an object file /// except to increase its size. /// /// Note that the size of the optional header is not fixed. The SizeOfOptionalHeader /// field in the COFF header must be used to validate that a probe into the file for /// a particular data directory does not go beyond SizeOfOptionalHeader. /// /// The NumberOfRvaAndSizes field of the optional header should also be used to ensure /// that no probe for a particular data directory entry goes beyond the optional header. /// In addition, it is important to validate the optional header magic number for format /// compatibility. /// /// The optional header magic number determines whether an image is a PE32 or /// PE32+ executable. /// /// PE32+ images allow for a 64-bit address space while limiting the image size to /// 2 gigabytes. Other PE32+ modifications are addressed in their respective sections. /// /// The first eight fields of the optional header are standard fields that are defined /// for every implementation of COFF. These fields contain general information that is /// useful for loading and running an executable file. They are unchanged for the /// PE32+ format. /// /// public sealed class OptionalHeader { #region Standard Fields (Image Only) /// /// The unsigned integer that identifies the state of the image file. The most /// common number is 0x10B, which identifies it as a normal executable file. /// 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. /// public OptionalHeaderMagicNumber Magic { get; set; } /// /// The linker major version number. /// public byte MajorLinkerVersion { get; set; } /// /// The linker minor version number. /// public byte MinorLinkerVersion { get; set; } /// /// The size of the code (text) section, or the sum of all code sections if there /// are multiple sections. /// public uint SizeOfCode { get; set; } /// /// The size of the initialized data section, or the sum of all such sections if /// there are multiple data sections. /// public uint SizeOfInitializedData { get; set; } /// /// The size of the uninitialized data section (BSS), or the sum of all such sections /// if there are multiple BSS sections. /// public uint SizeOfUninitializedData { get; set; } /// /// The address of the entry point relative to the image base when the executable file /// is loaded into memory. For program images, this is the starting address. For /// device drivers, this is the address of the initialization function. An entry point /// is optional for DLLs. When no entry point is present, this field must be zero. /// public uint AddressOfEntryPoint { get; set; } /// /// The address that is relative to the image base of the beginning-of-code section when /// it is loaded into memory. /// public uint BaseOfCode { get; set; } #region PE32-Only /// /// The address that is relative to the image base of the beginning-of-data section when /// it is loaded into memory. /// public uint BaseOfData { get; set; } #endregion #endregion #region Windows-Specific Fields (Image Only) #region ImageBase /// /// The preferred address of the first byte of image when loaded into memory { get; set; } /// must be a multiple of 64 K. The default for DLLs is 0x10000000. The default /// for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 2000, /// Windows XP, Windows 95, Windows 98, and Windows Me is 0x00400000. /// public uint ImageBase_PE32 { get; set; } /// /// The preferred address of the first byte of image when loaded into memory { get; set; } /// must be a multiple of 64 K. The default for DLLs is 0x10000000. The default /// for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 2000, /// Windows XP, Windows 95, Windows 98, and Windows Me is 0x00400000. /// public ulong ImageBase_PE32Plus { get; set; } #endregion /// /// The alignment (in bytes) of sections when they are loaded into memory. It must /// be greater than or equal to FileAlignment. The default is the page size for /// the architecture. /// public uint SectionAlignment { get; set; } /// /// The alignment factor (in bytes) that is used to align the raw data of sections /// in the image file. The value should be a power of 2 between 512 and 64 K, /// inclusive. The default is 512. If the SectionAlignment is less than the /// architecture's page size, then FileAlignment must match SectionAlignment. /// public uint FileAlignment { get; set; } /// /// The major version number of the required operating system. /// public ushort MajorOperatingSystemVersion { get; set; } /// /// The minor version number of the required operating system. /// public ushort MinorOperatingSystemVersion { get; set; } /// /// The major version number of the image. /// public ushort MajorImageVersion { get; set; } /// /// The minor version number of the image. /// public ushort MinorImageVersion { get; set; } /// /// The major version number of the subsystem. /// public ushort MajorSubsystemVersion { get; set; } /// /// The minor version number of the subsystem. /// public ushort MinorSubsystemVersion { get; set; } /// /// Reserved, must be zero. /// public uint Win32VersionValue { get; set; } /// /// The size (in bytes) of the image, including all headers, as the image /// is loaded in memory. It must be a multiple of SectionAlignment. /// public uint SizeOfImage { get; set; } /// /// The combined size of an MS-DOS stub, PE header, and section headers rounded /// up to a multiple of FileAlignment. /// public uint SizeOfHeaders { get; set; } /// /// The image file checksum. The algorithm for computing the checksum is /// incorporated into IMAGHELP.DLL. The following are checked for validation at /// load time: all drivers, any DLL loaded at boot time, and any DLL that is /// loaded into a critical Windows process. /// public uint CheckSum { get; set; } /// /// The subsystem that is required to run this image. /// public WindowsSubsystem Subsystem { get; set; } /// /// DLL characteristics /// public DllCharacteristics DllCharacteristics { get; set; } #region SizeOfStackReserve /// /// The size of the stack to reserve. Only SizeOfStackCommit is committed; the rest /// is made available one page at a time until the reserve size is reached. /// public uint SizeOfStackReserve_PE32 { get; set; } /// /// The size of the stack to reserve. Only SizeOfStackCommit is committed; the rest /// is made available one page at a time until the reserve size is reached. /// public ulong SizeOfStackReserve_PE32Plus { get; set; } #endregion #region SizeOfStackCommit /// /// The size of the stack to commit. /// public uint SizeOfStackCommit_PE32 { get; set; } /// /// The size of the stack to commit. /// public ulong SizeOfStackCommit_PE32Plus { get; set; } #endregion #region SizeOfHeapReserve /// /// The size of the local heap space to reserve. Only SizeOfHeapCommit is /// committed; the rest is made available one page at a time until the reserve /// size is reached. /// public uint SizeOfHeapReserve_PE32 { get; set; } /// /// The size of the local heap space to reserve. Only SizeOfHeapCommit is /// committed; the rest is made available one page at a time until the reserve /// size is reached. /// public ulong SizeOfHeapReserve_PE32Plus { get; set; } #endregion #region SizeOfHeapCommit /// /// The size of the local heap space to commit. /// public uint SizeOfHeapCommit_PE32 { get; set; } /// /// The size of the local heap space to commit. /// public ulong SizeOfHeapCommit_PE32Plus { get; set; } #endregion /// /// Reserved, must be zero. /// public uint LoaderFlags { get; set; } /// /// The number of data-directory entries in the remainder of the optional header. /// Each describes a location and size. /// public uint NumberOfRvaAndSizes { get; set; } #endregion #region Data Directories (Image Only) /// /// The export table address and size. /// #if NET48 public DataDirectory ExportTable { get; set; } #else public DataDirectory? ExportTable { get; set; } #endif /// /// The import table address and size. /// #if NET48 public DataDirectory ImportTable { get; set; } #else public DataDirectory? ImportTable { get; set; } #endif /// /// The resource table address and size. /// #if NET48 public DataDirectory ResourceTable { get; set; } #else public DataDirectory? ResourceTable { get; set; } #endif /// /// The exception table address and size. /// #if NET48 public DataDirectory ExceptionTable { get; set; } #else public DataDirectory? ExceptionTable { get; set; } #endif /// /// The attribute certificate table address and size. /// #if NET48 public DataDirectory CertificateTable { get; set; } #else public DataDirectory? CertificateTable { get; set; } #endif /// /// The base relocation table address and size. /// #if NET48 public DataDirectory BaseRelocationTable { get; set; } #else public DataDirectory? BaseRelocationTable { get; set; } #endif /// /// The debug data starting address and size. /// #if NET48 public DataDirectory Debug { get; set; } #else public DataDirectory? Debug { get; set; } #endif /// /// Reserved, must be 0 /// public ulong Architecture { get; set; } /// /// The RVA of the value to be stored in the global pointer register. /// The size member of this structure must be set to zero. /// #if NET48 public DataDirectory GlobalPtr { get; set; } #else public DataDirectory? GlobalPtr { get; set; } #endif /// /// The thread local storage (TLS) table address and size. /// #if NET48 public DataDirectory ThreadLocalStorageTable { get; set; } #else public DataDirectory? ThreadLocalStorageTable { get; set; } #endif /// /// The load configuration table address and size. /// #if NET48 public DataDirectory LoadConfigTable { get; set; } #else public DataDirectory? LoadConfigTable { get; set; } #endif /// /// The bound import table address and size. /// #if NET48 public DataDirectory BoundImport { get; set; } #else public DataDirectory? BoundImport { get; set; } #endif /// /// The import address table address and size /// #if NET48 public DataDirectory ImportAddressTable { get; set; } #else public DataDirectory? ImportAddressTable { get; set; } #endif /// /// The delay import descriptor address and size. /// #if NET48 public DataDirectory DelayImportDescriptor { get; set; } #else public DataDirectory? DelayImportDescriptor { get; set; } #endif /// /// The CLR runtime header address and size. /// #if NET48 public DataDirectory CLRRuntimeHeader { get; set; } #else public DataDirectory? CLRRuntimeHeader { get; set; } #endif /// /// Reserved, must be zero /// public ulong Reserved { get; set; } #endregion } }