using System.Runtime.InteropServices; namespace NitroxModel.Platforms.OS.Windows.Internal { /// /// Structs from (copy paste url in browser to visit): /// /// _IMAGE_OPTIONAL_HEADER64 /// /// Also see: /// MSDN: PE Header /// [StructLayout(LayoutKind.Sequential)] public struct OptionalHeader64 { /// /// Expected to be "PE" string for NT systems. /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public char[] Magic; public byte MajorLinkerVersion; public byte MinorLinkerVersion; public uint SizeOfCode; public uint SizeOfInitializedData; public uint SizeOfUninitializedData; public uint AddressOfEntryPoint; public uint BaseOfCode; public ulong ImageBase; public uint SectionAlignment; public uint FileAlignment; public ushort MajorOperatingSystemVersion; public ushort MinorOperatingSystemVersion; public ushort MajorImageVersion; public ushort MinorImageVersion; public ushort MajorSubsystemVersion; public ushort MinorSubsystemVersion; public uint Win32VersionValue; public uint SizeOfImage; public uint SizeOfHeaders; public uint CheckSum; public ushort Subsystem; public ushort DllCharacteristics; public ulong SizeOfStackReserve; public ulong SizeOfStackCommit; public ulong SizeOfHeapReserve; public ulong SizeOfHeapCommit; public uint LoaderFlags; public uint NumberOfRvaAndSizes; public ImageDataDirectory ExportTable; public ImageDataDirectory ImportTable; public ImageDataDirectory ResourceTable; public ImageDataDirectory ExceptionTable; public ImageDataDirectory CertificateTable; public ImageDataDirectory BaseRelocationTable; public ImageDataDirectory Debug; public ImageDataDirectory Architecture; public ImageDataDirectory GlobalPtr; public ImageDataDirectory TLSTable; public ImageDataDirectory LoadConfigTable; public ImageDataDirectory BoundImport; public ImageDataDirectory IAT; public ImageDataDirectory DelayImportDescriptor; public ImageDataDirectory CLRRuntimeHeader; public ImageDataDirectory Reserved; public override string ToString() { return $"{nameof(Magic)}: {new string(Magic)}, {nameof(MajorLinkerVersion)}: {MajorLinkerVersion}, {nameof(MinorLinkerVersion)}: {MinorLinkerVersion}, {nameof(SizeOfCode)}: {SizeOfCode}, {nameof(SizeOfInitializedData)}: {SizeOfInitializedData}, {nameof(SizeOfUninitializedData)}: {SizeOfUninitializedData}, {nameof(AddressOfEntryPoint)}: {AddressOfEntryPoint}, {nameof(BaseOfCode)}: {BaseOfCode}, {nameof(ImageBase)}: {ImageBase}, {nameof(SectionAlignment)}: {SectionAlignment}, {nameof(FileAlignment)}: {FileAlignment}, {nameof(MajorOperatingSystemVersion)}: {MajorOperatingSystemVersion}, {nameof(MinorOperatingSystemVersion)}: {MinorOperatingSystemVersion}, {nameof(MajorImageVersion)}: {MajorImageVersion}, {nameof(MinorImageVersion)}: {MinorImageVersion}, {nameof(MajorSubsystemVersion)}: {MajorSubsystemVersion}, {nameof(MinorSubsystemVersion)}: {MinorSubsystemVersion}, {nameof(Win32VersionValue)}: {Win32VersionValue}, {nameof(SizeOfImage)}: {SizeOfImage}, {nameof(SizeOfHeaders)}: {SizeOfHeaders}, {nameof(CheckSum)}: {CheckSum}, {nameof(Subsystem)}: {Subsystem}, {nameof(DllCharacteristics)}: {DllCharacteristics}, {nameof(SizeOfStackReserve)}: {SizeOfStackReserve}, {nameof(SizeOfStackCommit)}: {SizeOfStackCommit}, {nameof(SizeOfHeapReserve)}: {SizeOfHeapReserve}, {nameof(SizeOfHeapCommit)}: {SizeOfHeapCommit}, {nameof(LoaderFlags)}: {LoaderFlags}, {nameof(NumberOfRvaAndSizes)}: {NumberOfRvaAndSizes}"; } } [StructLayout(LayoutKind.Sequential)] public struct ImageDataDirectory { /// /// Location of the data in this directory. Add this value to the base address of the image to get the real address. /// public uint VirtualAddress; public uint Size; } }