mirror of
https://github.com/NishiOwO/JWasm.git
synced 2025-04-22 01:04:39 +00:00
289 lines
10 KiB
C
289 lines
10 KiB
C
|
|
/* the MS COFF declarations, as far as it's relevant for JWasm.
|
|
* The full declarations can be found in MS PSDK, WinNT.h.
|
|
*/
|
|
|
|
/* Machine values */
|
|
#define IMAGE_FILE_MACHINE_I386 0x014c /* Intel 386 or later processors */
|
|
#define IMAGE_FILE_MACHINE_AMD64 0x8664 /* AMD64 (K8) */
|
|
|
|
/* Characteristics flags */
|
|
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // no relocations
|
|
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // is executable
|
|
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // no line number info
|
|
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // no local symbols
|
|
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
|
|
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
|
|
|
|
struct IMAGE_FILE_HEADER {
|
|
uint_16 Machine;
|
|
uint_16 NumberOfSections;
|
|
uint_32 TimeDateStamp;
|
|
uint_32 PointerToSymbolTable;
|
|
uint_32 NumberOfSymbols;
|
|
uint_16 SizeOfOptionalHeader;
|
|
uint_16 Characteristics;
|
|
};
|
|
|
|
#define IMAGE_SIZEOF_SHORT_NAME 8
|
|
|
|
struct IMAGE_SECTION_HEADER {
|
|
char Name[IMAGE_SIZEOF_SHORT_NAME];
|
|
union {
|
|
uint_32 PhysicalAddress;
|
|
uint_32 VirtualSize;
|
|
} Misc;
|
|
uint_32 VirtualAddress;
|
|
uint_32 SizeOfRawData;
|
|
uint_32 PointerToRawData;
|
|
uint_32 PointerToRelocations;
|
|
uint_32 PointerToLinenumbers;
|
|
uint_16 NumberOfRelocations;
|
|
uint_16 NumberOfLinenumbers;
|
|
uint_32 Characteristics;
|
|
};
|
|
|
|
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
|
|
|
|
#define IMAGE_SCN_TYPE_REG 0
|
|
#define IMAGE_SCN_TYPE_DSECT 1
|
|
#define IMAGE_SCN_TYPE_NOLOAD 2
|
|
#define IMAGE_SCN_TYPE_GROUP 4
|
|
#define IMAGE_SCN_TYPE_NO_PAD 8
|
|
#define IMAGE_SCN_TYPE_COPY 16
|
|
#define IMAGE_SCN_CNT_CODE 0x00000020
|
|
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
|
|
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
|
|
#define IMAGE_SCN_LNK_OTHER 0x00000100
|
|
#define IMAGE_SCN_LNK_INFO 0x00000200
|
|
#define IMAGE_SCN_TYPE_OVER 0x00000400
|
|
#define IMAGE_SCN_LNK_REMOVE 0x00000800
|
|
#define IMAGE_SCN_LNK_COMDAT 0x00001000
|
|
#define IMAGE_SCN_GPREL 0x00008000 /* Valid only for IA64 */
|
|
#define IMAGE_SCN_MEM_FARDATA 0x00008000 /* Not in PECOFF v8 spec */
|
|
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
|
|
#define IMAGE_SCN_MEM_16BIT 0x00020000
|
|
#define IMAGE_SCN_MEM_LOCKED 0x00040000
|
|
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
|
|
#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_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
|
|
|
|
#pragma pack(push,2)
|
|
typedef struct _IMAGE_RELOCATION {
|
|
union {
|
|
uint_32 VirtualAddress;
|
|
uint_32 RelocCount;
|
|
};
|
|
uint_32 SymbolTableIndex;
|
|
uint_16 Type;
|
|
} IMAGE_RELOCATION;
|
|
#pragma pack(pop)
|
|
|
|
#define IMAGE_REL_I386_ABSOLUTE 0x0000 /* relocation is ignored */
|
|
#define IMAGE_REL_I386_DIR16 0x0001 /* 16bit VA */
|
|
#define IMAGE_REL_I386_REL16 0x0002 /* 16bit PC-relative offset */
|
|
#define IMAGE_REL_I386_DIR32 0x0006 /* 32bit VA */
|
|
#define IMAGE_REL_I386_DIR32NB 0x0007 /* 32bit RVA (IMAGEREL) */
|
|
#define IMAGE_REL_I386_SEG12 0x0009 /* ??? */
|
|
#define IMAGE_REL_I386_SECTION 0x000A /* 16bit section index */
|
|
#define IMAGE_REL_I386_SECREL 0x000B /* 32bit offset (SECTIONREL) */
|
|
#define IMAGE_REL_I386_TOKEN 0x000C /* CLR token */
|
|
#define IMAGE_REL_I386_SECREL7 0x000D /* 7bit offset */
|
|
#define IMAGE_REL_I386_REL32 0x0014 /* 32bit PC-relative offset */
|
|
|
|
// X86-64 relocations
|
|
|
|
#define IMAGE_REL_AMD64_ABSOLUTE 0x0000 /* Reference is absolute, no relocation is necessary */
|
|
#define IMAGE_REL_AMD64_ADDR64 0x0001 /* 64-bit address (VA).*/
|
|
#define IMAGE_REL_AMD64_ADDR32 0x0002 /* 32-bit address (VA).*/
|
|
#define IMAGE_REL_AMD64_ADDR32NB 0x0003 /* 32-bit address w/o image base (RVA).*/
|
|
#define IMAGE_REL_AMD64_REL32 0x0004 /* 32-bit relative address from byte following reloc */
|
|
#define IMAGE_REL_AMD64_REL32_1 0x0005 /* 32-bit relative address from byte distance 1 from reloc */
|
|
#define IMAGE_REL_AMD64_REL32_2 0x0006 /* 32-bit relative address from byte distance 2 from reloc */
|
|
#define IMAGE_REL_AMD64_REL32_3 0x0007 /* 32-bit relative address from byte distance 3 from reloc */
|
|
#define IMAGE_REL_AMD64_REL32_4 0x0008 /* 32-bit relative address from byte distance 4 from reloc */
|
|
#define IMAGE_REL_AMD64_REL32_5 0x0009 /* 32-bit relative address from byte distance 5 from reloc */
|
|
#define IMAGE_REL_AMD64_SECTION 0x000A /* Section index */
|
|
#define IMAGE_REL_AMD64_SECREL 0x000B /* 32 bit offset from base of section containing target */
|
|
#define IMAGE_REL_AMD64_SECREL7 0x000C /* 7 bit unsigned offset from base of section containing target */
|
|
#define IMAGE_REL_AMD64_TOKEN 0x000D /* 32 bit metadata token */
|
|
|
|
#define IMAGE_SIZEOF_SYMBOL 18
|
|
#define IMAGE_SIZEOF_AUX_SYMBOL 18
|
|
|
|
#pragma pack(push,2)
|
|
typedef struct _IMAGE_SYMBOL {
|
|
union {
|
|
/* v2.08 */
|
|
//char ShortName[8];
|
|
uint_8 ShortName[8];
|
|
struct {
|
|
uint_32 Short;
|
|
uint_32 Long;
|
|
} Name;
|
|
/* v2.07: don't use pointers in COFF structures! */
|
|
//unsigned char *LongName[2];
|
|
uint_32 LongName[2];
|
|
} N;
|
|
uint_32 Value;
|
|
uint_16 SectionNumber;
|
|
uint_16 Type;
|
|
uint_8 StorageClass;
|
|
uint_8 NumberOfAuxSymbols;
|
|
} IMAGE_SYMBOL;
|
|
|
|
/* special section numbers */
|
|
|
|
#define IMAGE_SYM_UNDEFINED 0
|
|
#define IMAGE_SYM_ABSOLUTE (-1)
|
|
#define IMAGE_SYM_DEBUG (-2)
|
|
|
|
#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_TYPE_PCODE 32768
|
|
|
|
#define IMAGE_SYM_DTYPE_NULL 0
|
|
#define IMAGE_SYM_DTYPE_POINTER 1
|
|
#define IMAGE_SYM_DTYPE_FUNCTION 2
|
|
#define IMAGE_SYM_DTYPE_ARRAY 3
|
|
|
|
/* StorageClass values */
|
|
|
|
#define IMAGE_SYM_CLASS_END_OF_FUNCTION (-1)
|
|
#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_FAR_EXTERNAL 68 /* Not in PECOFF v8 spec */
|
|
#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
|
|
#define IMAGE_SYM_CLASS_CLR_TOKEN 107
|
|
|
|
/* values for IMAGE_AUX_SYMBOL.Section.Selection */
|
|
#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
|
|
#define IMAGE_COMDAT_SELECT_ANY 2
|
|
#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
|
|
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
|
|
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
|
|
#define IMAGE_COMDAT_SELECT_LARGEST 6
|
|
#define IMAGE_COMDAT_SELECT_NEWEST 7
|
|
|
|
/* values for IMAGE_AUX_SYMBOL.Sym.Characteristics(=TotalSize) */
|
|
#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
|
|
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
|
|
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
|
|
|
|
typedef union _IMAGE_AUX_SYMBOL {
|
|
/* AUX format 2: .bf and .ef entries */
|
|
struct {
|
|
uint_32 TagIndex;
|
|
union {
|
|
struct {
|
|
uint_16 Linenumber;
|
|
uint_16 Size;
|
|
} LnSz;
|
|
uint_32 TotalSize;
|
|
} Misc;
|
|
union {
|
|
struct {
|
|
uint_32 PointerToLinenumber;
|
|
uint_32 PointerToNextFunction;
|
|
} Function;
|
|
struct {
|
|
uint_16 Dimension[4];
|
|
} Array;
|
|
} FcnAry;
|
|
uint_16 TvIndex;
|
|
} Sym;
|
|
/* AUX format 4: file entries */
|
|
struct {
|
|
/* v2.08 */
|
|
//char Name[IMAGE_SIZEOF_SYMBOL];
|
|
uint_8 Name[IMAGE_SIZEOF_SYMBOL];
|
|
} File;
|
|
/* AUX format 5: section entries */
|
|
struct {
|
|
uint_32 Length;
|
|
uint_16 NumberOfRelocations;
|
|
uint_16 NumberOfLinenumbers;
|
|
uint_32 CheckSum;
|
|
uint_16 Number;
|
|
uint_8 Selection;
|
|
} Section;
|
|
} IMAGE_AUX_SYMBOL;
|
|
#pragma pack(pop)
|
|
|
|
typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
|
|
uint_32 NumberOfSymbols;
|
|
uint_32 LvaToFirstSymbol;
|
|
uint_32 NumberOfLinenumbers;
|
|
uint_32 LvaToFirstLinenumber;
|
|
uint_32 RvaToFirstByteOfCode;
|
|
uint_32 RvaToLastByteOfCode;
|
|
uint_32 RvaToFirstByteOfData;
|
|
uint_32 RvaToLastByteOfData;
|
|
} IMAGE_COFF_SYMBOLS_HEADER;
|
|
|
|
#pragma pack(push,2)
|
|
typedef struct _IMAGE_LINENUMBER {
|
|
union {
|
|
uint_32 SymbolTableIndex;
|
|
uint_32 VirtualAddress;
|
|
} Type;
|
|
uint_16 Linenumber;
|
|
} IMAGE_LINENUMBER;
|
|
#pragma pack(pop)
|