/* 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; } } }