/* * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ #pragma once //#pragma message("including coff.h") // // COFF -- Common Object File Format // Used commonly by Un*x and is embedded in Windows PE // file format. // // These structures must be packed #pragma pack(1) /* * Some general purpose MACROs */ #define VERSION_MAJOR(x) ((unsigned int)((x)& 0xff)) #define VERSION_MINOR(x) ((unsigned int)(((x)>8) &0xff)) #define BIGVERSION_MAJOR(x) ((unsigned int)((x)& 0xffff)) #define BIGVERSION_MINOR(x) ((unsigned int)(((x)>16) &0xffff)) /* * COFF File Header (Object & Image) * Spec section 3.3 */ typedef struct { unsigned short MachineType; /* magic type */ unsigned short NumberOfSections; /* number of sections */ unsigned long TimeDateStamp; /* time & date stamp */ unsigned long PointerToSymbolTable; /* file pointer to symtab */ unsigned long NumberOfSymbols; /* number of symtab entries */ unsigned short SizeOfOptionHeader; /* sizeof(optional hdr) */ unsigned short Characteristics; /* flags */ } COFF_FileHeader_t; /* * Machine Types * Spec section 3.3.1 * (only i386 relevant for us) */ #if 1 #ifndef IMAGE_FILE_MACHINE_I386 #define IMAGE_FILE_MACHINE_I386 0x14c #endif #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 #define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 #define IMAGE_FILE_16BIT_MACHINE 0x0040 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 #define IMAGE_FILE_32BIT_MACHINE 0x0100 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 #define IMAGE_FILE_SYSTEM 0x1000 #define IMAGE_FILE_DLL 0x2000 #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 #endif #define OPTMAGIC_PE32 0x010b #define OPTMAGIC_PE32P 0x020b #define OPTHDR_SIZE 28 #define OPTHDR_SIZEP 24 #define WINHDR_SIZE 68 #define WINHDR_SIZEP 88 /* * Optional Header Standard Fields (Image Only) * Spec section 3.4.1 */ typedef struct { unsigned short Magic; unsigned short LinkVersion; unsigned long CodeSize; unsigned long DataSize; unsigned long BssSize; unsigned long Entry; unsigned long CodeBase; unsigned long DataBase; } OptionHeader_t; typedef struct { unsigned short Magic; unsigned short LinkVersion; unsigned long CodeSize; unsigned long DataSize; unsigned long BssSize; unsigned long Entry; unsigned long CodeBase; } OptionHeaderPlus_t; /* * Optional Header Windows NT-Specific Fields (Image Only) * Spec section 3.4.2 */ typedef struct { unsigned long ImageBase; unsigned long SectionAlignment; unsigned long FileAlignment; unsigned long OSVer; unsigned long ImgVer; unsigned long SubSysVer; unsigned long Reserved; unsigned long SizeOfImage; unsigned long SizeOfHeaders; unsigned long CheckSum; unsigned short Subsystem; unsigned short DLLFlags; unsigned long SizeOfStackReserve; unsigned long SizeOfStackCommit; unsigned long SizeOfHeapReserve; unsigned long SizeOfHeapCommit; unsigned long LoaderFlags; unsigned long NumDirectories; } WindowsHeader_t; typedef struct { unsigned long long ImageBase; unsigned long SectionAlignment; unsigned long FileAlignment; unsigned long OSVer; unsigned long ImgVer; unsigned long SubSysVer; unsigned long Reserved; unsigned long SizeOfImage; unsigned long SizeOfHeaders; unsigned long CheckSum; unsigned short Subsystem; unsigned short DLLFlags; unsigned long long SizeOfStackReserve; unsigned long long SizeOfStackCommit; unsigned long long SizeOfHeapReserve; unsigned long long SizeOfHeapCommit; unsigned long LoaderFlags; unsigned long NumDirectories; } WindowsHeaderPlus_t; /* #define IMAGE_SUBSYSTEM_UNKNOWN 0 #define IMAGE_SUBSYSTEM_NATIVE 1 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 #define IMAGE_SUBSYSTEM_POSIX_CUI 7 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0X8000 */ /* * Optional Header Data Directories (Image Only) * Spec section 3.4.3 */ typedef struct { unsigned long RVA; unsigned long Size; } Image_Data_Directory_t; enum Directory_Items { EXPORT_TABLE = 0, IMPORT_TABLE, RESOURCE_TABLE, EXCEPTION_TABLE, CERTIFICATE_TABLE, BASE_RELOCATION_TABLE, DEBUG_, ARCHITECTURE, GLOBAL_PTR, TLS_TABLE, LOAD_CONFIG_TABLE, BOUND_IMPORT, IAT, DELAY_IMPORT_DESCRIPTOR, COM_RUNTIME_HEADER, RESERVED }; /* * Section Table (Section Headers) * Spec section 4. */ typedef struct { unsigned char Name[8]; unsigned long VirtualSize; unsigned long VirtualAddress; unsigned long SizeOfRawData; unsigned long PtrToRawData; unsigned long PtrToRelocations; unsigned long PtrToLineNums; unsigned short NumRelocations; unsigned short NumLineNumbers; unsigned long Characteristics; } SectionHeader_t; /* * Section Flags (Characteristics) * Spec section 4.1 */ #define IMAGE_SCN_CNT_CODE 0x00000020 #define IMAGE_SCN_CNT_DATA 0x00000040 #define IMAGE_SCN_CNT_BSS 0x00000080 #define IMAGE_SCN_LNK_INFO 0x00000200 #define IMAGE_SCN_LNK_REMOVE 0x00000800 #define IMAGE_SCN_LNK_COMDAT 0x00001000 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 #define IMAGE_SCN_ALIGN_MASK 0x00F00000 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 #define IMAGE_SCN_MEM_SHARED 0x10000000 #define IMAGE_SCN_MEM_EXECUTE 0x20000000 #define IMAGE_SCN_MEM_READ 0x40000000 #define IMAGE_SCN_MEM_WRITE 0x80000000 /* * COFF Relocations (Object Only) * Spec section 5.2 */ typedef struct { unsigned long VirtualAddress; unsigned long SymTableIndex; unsigned short Type; } ObjReloc_t; /* * COFF Relocation Type Indicators * Spec section 5.2.1 */ #define IMAGE_REL_I386_ABSOLUTE 0x0000 #define IMAGE_REL_I386_DIR16 0x0001 #define IMAGE_REL_I386_REL16 0x0002 #define IMAGE_REL_I386_DIR32 0x0006 #define IMAGE_REL_I386_DIR32NB 0x0007 #define IMAGE_REL_I386_SEG12 0x0009 #define IMAGE_REL_I386_SECTION 0x000A #define IMAGE_REL_I386_SECREL 0x000B #define IMAGE_REL_I386_REL32 0x0014 /* * COFF Line Numbers * Spec section 5.3 */ typedef struct { union { unsigned long SymbolTableIndex; unsigned long VirtualAddress; } Type; unsigned short LineNum; } LineNumbers_t; /* * COFF Symbol Table * Spec section 5.4 */ typedef struct { union { unsigned char ShortName[8]; unsigned long long Offset; } Name; unsigned long Value; unsigned short SectionNumber; unsigned short Type; unsigned char StorageClass; unsigned char NumberOfAuxSymbols; } SymbolTable_t; #if !defined(TARGET_WINDOWS) #define IMAGE_SYM_UNDEFINED 0 #define IMAGE_SYM_ABSOLUTE 0xFFFF #define IMAGE_SYM_DEBUG 0xFFFE #define IMAGE_SYM_TYPE_NULL 0 #define IMAGE_SYM_TYPE_VOID 1 #define IMAGE_SYM_TYPE_CHAR 2 #define IMAGE_SYM_TYPE_SHORT 3 #define IMAGE_SYM_TYPE_INT 4 #define IMAGE_SYM_TYPE_LONG 5 #define IMAGE_SYM_TYPE_FLOAT 6 #define IMAGE_SYM_TYPE_DOUBLE 7 #define IMAGE_SYM_TYPE_STRUCT 8 #define IMAGE_SYM_TYPE_UNION 9 #define IMAGE_SYM_TYPE_ENUM 10 #define IMAGE_SYM_TYPE_MOE 11 #define IMAGE_SYM_TYPE_BYTE 12 #define IMAGE_SYM_TYPE_WORD 13 #define IMAGE_SYM_TYPE_UINT 14 #define IMAGE_SYM_TYPE_DWORD 15 #define IMAGE_SYM_DWORD_NULL 0 #define IMAGE_SYM_DWORD_POINTER 1 #define IMAGE_SYM_DWORD_FUNCTION 2 #define IMAGE_SYM_DWORD_ARRAY 3 #define IMAGE_SYM_CLASS_END_OF_FUNCTION 0xFF #define IMAGE_SYM_CLASS_NULL 0 #define IMAGE_SYM_CLASS_AUTOMATIC 1 #define IMAGE_SYM_CLASS_EXTERNAL 2 #define IMAGE_SYM_CLASS_STATIC 3 #define IMAGE_SYM_CLASS_REGISTER 4 #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 #define IMAGE_SYM_CLASS_LABEL 6 #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 #define IMAGE_SYM_CLASS_ARGUMENT 9 #define IMAGE_SYM_CLASS_STRUCT_TAG 10 #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 #define IMAGE_SYM_CLASS_UNION_TAG 12 #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 #define IMAGE_SYM_CLASS_ENUM_TAG 15 #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 #define IMAGE_SYM_CLASS_REGISTER_PARAM 17 #define IMAGE_SYM_CLASS_BIT_FIELD 18 #define IMAGE_SYM_CLASS_BLOCK 100 #define IMAGE_SYM_CLASS_FUNCTION 101 #define IMAGE_SYM_CLASS_END_OF_STRUCT 102 #define IMAGE_SYM_CLASS_FILE 103 #define IMAGE_SYM_CLASS_SECTION 104 #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 #endif typedef struct { unsigned long TagIndex; unsigned long TotalSize; unsigned long PtrToLineNumber; unsigned long PtrToNextFunc; unsigned short unused; } AuxFuncDef_t; /* * Symbol Auxiliary Record: .bf and .ef * Spec section 5.5.2 */ typedef struct { unsigned long unused; unsigned short LineNumber; unsigned long unused1; unsigned short unused2; unsigned long PtrToNextFunc; unsigned char unused3; } AuxBfEf_t; /* * Export Section (Directory) * Spec section 6.3 */ /* * Export Directory Table * Spec section 6.3.1 */ typedef struct { unsigned long ExportFlags; unsigned long TimeStamp; unsigned short MajorVersion; unsigned short MinorVersion; unsigned long Name_RVA; unsigned long OrdinalBase; unsigned long NumAddrTable; unsigned long NumNamePtrs; unsigned long ExportAddressTable_RVA; unsigned long NamePointerTable_RVA; unsigned long OrdinalTable_RVA; } ExportDirTable_t; /* * Import Section (Directory) * Spec section 6.4 */ /* * Import Directory Table * Spec Section 6.4.1 */ typedef struct { unsigned long ImportLookupTable_RVA; unsigned long TimeStamp; unsigned long ForwarderChain; unsigned long Name_RVA; unsigned long ImportAddressTable_RVA; } ImportDirTable_t; /* * .reloc Relocation types * spec section 6.6 */ #if 1 #define IMAGE_REL_BASED_ABSOLUTE 0 #define IMAGE_REL_BASED_HIGH 1 #define IMAGE_REL_BASED_LOW 2 #define IMAGE_REL_BASED_HIGHLOW 3 #define IMAGE_REL_BASED_HIGHADJ 4 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 #define IMAGE_REL_BASED_SECTION 6 #define IMAGE_REL_BASED_REL32 7 #define IMAGE_REL_BASED_MIPS_JMPADDR16 9 #define IMAGE_REL_BASED_DIR64 10 #define IMAGE_REL_BASED_HIGH3ADJ 11 #endif #pragma pack()