/*
Copyright (C) 2014-2019 de4dot@gmail.com
This file is part of dnSpy
dnSpy is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
dnSpy is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with dnSpy. If not, see .
*/
namespace dnSpy.Contracts.Hex.Files.PE {
///
/// Optional header
///
public abstract class PeOptionalHeaderData : StructureData {
///
/// Constructor
///
/// Structure name
/// Span
protected PeOptionalHeaderData(string name, HexBufferSpan span)
: base(name, span) {
}
///
/// true if it's a , false if it's a
///
public abstract bool Is32Bit { get; }
/// IMAGE_OPTIONAL_HEADER.Magic
public abstract StructField Magic { get; }
/// IMAGE_OPTIONAL_HEADER.MajorLinkerVersion
public abstract StructField MajorLinkerVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MinorLinkerVersion
public abstract StructField MinorLinkerVersion { get; }
/// IMAGE_OPTIONAL_HEADER.SizeOfCode
public abstract StructField SizeOfCode { get; }
/// IMAGE_OPTIONAL_HEADER.SizeOfInitializedData
public abstract StructField SizeOfInitializedData { get; }
/// IMAGE_OPTIONAL_HEADER.SizeOfUninitializedData
public abstract StructField SizeOfUninitializedData { get; }
/// IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint
public abstract StructField AddressOfEntryPoint { get; }
/// IMAGE_OPTIONAL_HEADER.BaseOfCode
public abstract StructField BaseOfCode { get; }
/// IMAGE_OPTIONAL_HEADER.SectionAlignment
public abstract StructField SectionAlignment { get; }
/// IMAGE_OPTIONAL_HEADER.FileAlignment
public abstract StructField FileAlignment { get; }
/// IMAGE_OPTIONAL_HEADER.MajorOperatingSystemVersion
public abstract StructField MajorOperatingSystemVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MinorOperatingSystemVersion
public abstract StructField MinorOperatingSystemVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MajorImageVersion
public abstract StructField MajorImageVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MinorImageVersion
public abstract StructField MinorImageVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MajorSubsystemVersion
public abstract StructField MajorSubsystemVersion { get; }
/// IMAGE_OPTIONAL_HEADER.MinorSubsystemVersion
public abstract StructField MinorSubsystemVersion { get; }
/// IMAGE_OPTIONAL_HEADER.Win32VersionValue
public abstract StructField Win32VersionValue { get; }
/// IMAGE_OPTIONAL_HEADER.SizeOfImage
public abstract StructField SizeOfImage { get; }
/// IMAGE_OPTIONAL_HEADER.SizeOfHeaders
public abstract StructField SizeOfHeaders { get; }
/// IMAGE_OPTIONAL_HEADER.CheckSum
public abstract StructField CheckSum { get; }
/// IMAGE_OPTIONAL_HEADER.Subsystem
public abstract StructField Subsystem { get; }
/// IMAGE_OPTIONAL_HEADER.DllCharacteristics
public abstract StructField DllCharacteristics { get; }
/// IMAGE_OPTIONAL_HEADER.LoaderFlags
public abstract StructField LoaderFlags { get; }
/// IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes
public abstract StructField NumberOfRvaAndSizes { get; }
/// IMAGE_OPTIONAL_HEADER.DataDirectory
public abstract StructField> DataDirectory { get; }
}
///
/// 32-bit optional header
///
public abstract class PeOptionalHeader32Data : PeOptionalHeaderData {
const string NAME = "IMAGE_OPTIONAL_HEADER32";
///
/// Constructor
///
/// Span
protected PeOptionalHeader32Data(HexBufferSpan span)
: base(NAME, span) {
}
///
/// This is true, since it's a 32-bit optional header
///
public sealed override bool Is32Bit => true;
/// IMAGE_OPTIONAL_HEADER32.BaseOfData
public abstract StructField BaseOfData { get; }
/// IMAGE_OPTIONAL_HEADER32.ImageBase
public abstract StructField ImageBase { get; }
/// IMAGE_OPTIONAL_HEADER32.SizeOfStackReserve
public abstract StructField SizeOfStackReserve { get; }
/// IMAGE_OPTIONAL_HEADER32.SizeOfStackCommit
public abstract StructField SizeOfStackCommit { get; }
/// IMAGE_OPTIONAL_HEADER32.SizeOfHeapReserve
public abstract StructField SizeOfHeapReserve { get; }
/// IMAGE_OPTIONAL_HEADER32.SizeOfHeapCommit
public abstract StructField SizeOfHeapCommit { get; }
}
///
/// 64-bit optional header
///
public abstract class PeOptionalHeader64Data : PeOptionalHeaderData {
const string NAME = "IMAGE_OPTIONAL_HEADER64";
///
/// Constructor
///
/// Span
protected PeOptionalHeader64Data(HexBufferSpan span)
: base(NAME, span) {
}
///
/// This is false, since it's a 64-bit optional header
///
public sealed override bool Is32Bit => false;
/// IMAGE_OPTIONAL_HEADER64.ImageBase
public abstract StructField ImageBase { get; }
/// IMAGE_OPTIONAL_HEADER64.SizeOfStackReserve
public abstract StructField SizeOfStackReserve { get; }
/// IMAGE_OPTIONAL_HEADER64.SizeOfStackCommit
public abstract StructField SizeOfStackCommit { get; }
/// IMAGE_OPTIONAL_HEADER64.SizeOfHeapReserve
public abstract StructField SizeOfHeapReserve { get; }
/// IMAGE_OPTIONAL_HEADER64.SizeOfHeapCommit
public abstract StructField SizeOfHeapCommit { get; }
}
}