1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-07 19:18:19 +02:00
Beef/IDEHelper/COFFData.h
2022-07-26 13:27:03 -04:00

295 lines
6.3 KiB
C

#pragma once
#include "BeefySysLib/Common.h"
struct CV_LVAR_ADDR_RANGE;
struct CV_LVAR_ADDR_GAP;
NS_BF_BEGIN
#define PE_SIZEOF_SHORT_NAME 8
#define PE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define PE_NUMBEROF_DIRECTORY_ENTRIES 16
#define PE_NT_SIGNATURE 0x00004550 // PE00
#define PE_DOS_SIGNATURE 0x5A4D // MZ
#define PE_MACHINE_X86 0x14c
#define PE_MACHINE_X64 0x8664
// DOS .EXE header
struct PEHeader
{
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
};
struct PEFileHeader
{
WORD mMachine;
WORD mNumberOfSections;
DWORD mTimeDateStamp;
DWORD mPointerToSymbolTable;
DWORD mNumberOfSymbols;
WORD mSizeOfOptionalHeader;
WORD mCharacteristics;
};
struct PEImportObjectHeader
{
WORD mSig1;
WORD mSig2;
WORD mVersion;
WORD mMachine;
DWORD mTimeDateStamp;
DWORD mDataSize;
WORD mHint;
WORD mType;
};
struct PEDataDirectory
{
DWORD mVirtualAddress;
DWORD mSize;
};
struct PEOptionalHeader32
{
//
// Standard fields.
//
WORD mMagic;
BYTE mMajorLinkerVersion;
BYTE mMinorLinkerVersion;
DWORD mSizeOfCode;
DWORD mSizeOfInitializedData;
DWORD mSizeOfUninitializedData;
DWORD mAddressOfEntryPoint;
DWORD mBaseOfCode;
DWORD mBaseOfData;
//
// NT additional fields.
//
DWORD mImageBase;
DWORD mSectionAlignment;
DWORD mFileAlignment;
WORD mMajorOperatingSystemVersion;
WORD mMinorOperatingSystemVersion;
WORD mMajorImageVersion;
WORD mMinorImageVersion;
WORD mMajorSubsystemVersion;
WORD mMinorSubsystemVersion;
DWORD mReserved1;
DWORD mSizeOfImage;
DWORD mSizeOfHeaders;
DWORD mCheckSum;
WORD mSubsystem;
WORD mDllCharacteristics;
DWORD mSizeOfStackReserve;
DWORD mSizeOfStackCommit;
DWORD mSizeOfHeapReserve;
DWORD mSizeOfHeapCommit;
DWORD mLoaderFlags;
DWORD mNumberOfRvaAndSizes;
PEDataDirectory mDataDirectory[16];
};
struct PEOptionalHeader64
{
//
// Standard fields.
//
WORD mMagic;
BYTE mMajorLinkerVersion;
BYTE mMinorLinkerVersion;
DWORD mSizeOfCode;
DWORD mSizeOfInitializedData;
DWORD mSizeOfUninitializedData;
DWORD mAddressOfEntryPoint;
DWORD mBaseOfCode;
//
// NT additional fields.
//
uint64 mImageBase;
DWORD mSectionAlignment;
DWORD mFileAlignment;
WORD mMajorOperatingSystemVersion;
WORD mMinorOperatingSystemVersion;
WORD mMajorImageVersion;
WORD mMinorImageVersion;
WORD mMajorSubsystemVersion;
WORD mMinorSubsystemVersion;
DWORD mReserved1;
DWORD mSizeOfImage;
DWORD mSizeOfHeaders;
DWORD mCheckSum;
WORD mSubsystem;
WORD mDllCharacteristics;
uint64 mSizeOfStackReserve;
uint64 mSizeOfStackCommit;
uint64 mSizeOfHeapReserve;
uint64 mSizeOfHeapCommit;
DWORD mLoaderFlags;
DWORD mNumberOfRvaAndSizes;
PEDataDirectory mDataDirectory[16];
};
struct PE_NTHeaders32
{
DWORD mSignature;
PEFileHeader mFileHeader;
PEOptionalHeader32 mOptionalHeader;
};
struct PE_NTHeaders64
{
DWORD mSignature;
PEFileHeader mFileHeader;
PEOptionalHeader64 mOptionalHeader;
};
struct PESectionHeader
{
char mName[IMAGE_SIZEOF_SHORT_NAME];
DWORD mVirtualSize;
DWORD mVirtualAddress;
DWORD mSizeOfRawData;
DWORD mPointerToRawData;
DWORD mPointerToRelocations;
DWORD mPointerToLineNumbers;
WORD mNumberOfRelocations;
WORD mNumberOfLineNumbers;
DWORD mCharacteristics;
};
#pragma pack(push, 1)
struct COFFRelocation
{
uint32 mVirtualAddress;
uint32 mSymbolTableIndex;
uint16 mType;
};
struct PE_SymInfo
{
union
{
char mName[8];
int32 mNameOfs[2];
};
int mValue;
uint16 mSectionNum;
uint16 mType;
int8 mStorageClass;
int8 mNumOfAuxSymbols;
};
struct PE_SymInfoAux
{
uint32 mLength;
uint16 mNumberOfRelocations;
uint16 mNumberOfLinenumbers;
uint32 mCheckSum;
uint16 mNumber;
uint8 mSelection;
char mUnused;
char mUnused2;
char mUnused3;
};
//struct COFFFrameDescriptor
//{
// int32 mOffset; // Offset 1st byte of function code
// int32 mSize; // bytes in function
// int32 mNumLocals; // # bytes in locals/4
// int16 mNumParams; // # bytes in params/4
// int16 mAttributes;
//
// // # bytes in prolog
// int GetPrologSize() const { return mAttributes & 0xF; }
//
// // # regs saved
// int GetNumSavedRegs() const { return (mAttributes >> 8) & 0x7; }
// bool HasSEH() const { return (mAttributes >> 9) & 1; }
// bool UseBP() const { return (mAttributes >> 10) & 1; }
//
// // cbFrame: frame pointer
// int GetFP() const { return mAttributes >> 14; }
//};
struct COFFFrameDescriptor
{
uint32 mRvaStart;
uint32 mCodeSize;
uint32 mLocalSize;
uint32 mParamsSize;
uint32 mMaxStackSize;
uint32 mFrameFunc;
uint16 mPrologSize;
uint16 mSavedRegsSize;
uint32 mFlags;
};
struct COFFFrameProgram
{
enum Command : uint8
{
Command_None,
Command_EIP,
Command_ESP,
Command_EBP,
Command_EAX,
Command_EBX,
Command_ECX,
Command_EDX,
Command_ESI,
Command_EDI,
Command_T0,
Command_T1,
Command_T2,
Command_T3,
Command_RASearch,
Command_Add,
Command_Subtract,
Command_Align,
Command_Set,
Command_Deref,
Command_Value,
Command_Value8
};
Command* mCommands;
};
struct COFFFrameDescriptorEntry
{
COFFFrameDescriptor* mFrameDescriptor;
COFFFrameProgram mProgram;
};
#pragma pack(pop)
NS_BF_END