| /* | |
| Copyright (c) 2009, 2010 mingw-w64 project | |
| Contributing authors: Kai Tietz, Jonathan Yong | |
| Permission is hereby granted, free of charge, to any person obtaining a | |
| copy of this software and associated documentation files (the "Software"), | |
| to deal in the Software without restriction, including without limitation | |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| and/or sell copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
| DEALINGS IN THE SOFTWARE. | |
| */ | |
| #ifndef _GENDEF_HXX | |
| #define _GENDEF_HXX | |
| #include <inttypes.h> | |
| #include <stdint.h> | |
| #define IMAGE_DOS_SIGNATURE 0x5A4D | |
| #define IMAGE_OS2_SIGNATURE 0x454E | |
| #define IMAGE_OS2_SIGNATURE_LE 0x454C | |
| #define IMAGE_VXD_SIGNATURE 0x454C | |
| #define IMAGE_NT_SIGNATURE 0x00004550 | |
| #define FIELD_OFFSET(type,field) ((int32_t)(intptr_t)&(((type *)0)->field)) | |
| #define IMAGE_FIRST_SECTION(ntheader) \ | |
| ((PIMAGE_SECTION_HEADER) ((uintptr_t)ntheader + FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader) + ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader)) | |
| #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 | |
| #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 | |
| #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 | |
| #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 | |
| #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 | |
| #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 | |
| #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 | |
| #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 | |
| #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 | |
| #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 | |
| #define IMAGE_DIRECTORY_ENTRY_TLS 9 | |
| #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 | |
| #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 | |
| #define IMAGE_DIRECTORY_ENTRY_IAT 12 | |
| #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 | |
| #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 | |
| #define IMAGE_SIZEOF_SHORT_NAME 8 | |
| #define IMAGE_SIZEOF_SECTION_HEADER 40 | |
| #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 | |
| #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_LNK_REMOVE 0x00000800 | |
| #define IMAGE_SCN_LNK_COMDAT 0x00001000 | |
| #define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 | |
| #define IMAGE_SCN_GPREL 0x00008000 | |
| #define IMAGE_SCN_MEM_FARDATA 0x00008000 | |
| #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_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 | |
| #define IMAGE_SCN_SCALE_INDEX 0x00000001 | |
| #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 | |
| #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 | |
| #define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER 224 | |
| #define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 240 | |
| #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b | |
| #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b | |
| #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 | |
| #pragma pack(1) | |
| typedef struct _IMAGE_DOS_HEADER { | |
| uint16_t e_magic; | |
| uint16_t e_cblp; | |
| uint16_t e_cp; | |
| uint16_t e_crlc; | |
| uint16_t e_cparhdr; | |
| uint16_t e_minalloc; | |
| uint16_t e_maxalloc; | |
| uint16_t e_ss; | |
| uint16_t e_sp; | |
| uint16_t e_csum; | |
| uint16_t e_ip; | |
| uint16_t e_cs; | |
| uint16_t e_lfarlc; | |
| uint16_t e_ovno; | |
| uint16_t e_res[4]; | |
| uint16_t e_oemid; | |
| uint16_t e_oeminfo; | |
| uint16_t e_res2[10]; | |
| int32_t e_lfanew; | |
| } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; | |
| typedef struct _IMAGE_FILE_HEADER { | |
| uint16_t Machine; | |
| uint16_t NumberOfSections; | |
| uint32_t TimeDateStamp; | |
| uint32_t PointerToSymbolTable; | |
| uint32_t NumberOfSymbols; | |
| uint16_t SizeOfOptionalHeader; | |
| uint16_t Characteristics; | |
| } IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER; | |
| typedef struct _IMAGE_DATA_DIRECTORY { | |
| uint32_t VirtualAddress; | |
| uint32_t Size; | |
| } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; | |
| typedef struct _IMAGE_OPTIONAL_HEADER { | |
| uint16_t Magic; | |
| uint8_t MajorLinkerVersion; | |
| uint8_t MinorLinkerVersion; | |
| uint32_t SizeOfCode; | |
| uint32_t SizeOfInitializedData; | |
| uint32_t SizeOfUninitializedData; | |
| uint32_t AddressOfEntryPoint; | |
| uint32_t BaseOfCode; | |
| uint32_t BaseOfData; | |
| uint32_t ImageBase; | |
| uint32_t SectionAlignment; | |
| uint32_t FileAlignment; | |
| uint16_t MajorOperatingSystemVersion; | |
| uint16_t MinorOperatingSystemVersion; | |
| uint16_t MajorImageVersion; | |
| uint16_t MinorImageVersion; | |
| uint16_t MajorSubsystemVersion; | |
| uint16_t MinorSubsystemVersion; | |
| uint32_t Win32VersionValue; | |
| uint32_t SizeOfImage; | |
| uint32_t SizeOfHeaders; | |
| uint32_t CheckSum; | |
| uint16_t Subsystem; | |
| uint16_t DllCharacteristics; | |
| uint32_t SizeOfStackReserve; | |
| uint32_t SizeOfStackCommit; | |
| uint32_t SizeOfHeapReserve; | |
| uint32_t SizeOfHeapCommit; | |
| uint32_t LoaderFlags; | |
| uint32_t NumberOfRvaAndSizes; | |
| IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; | |
| } IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; | |
| typedef struct _IMAGE_OPTIONAL_HEADER64 { | |
| uint16_t Magic; | |
| uint8_t MajorLinkerVersion; | |
| uint8_t MinorLinkerVersion; | |
| uint32_t SizeOfCode; | |
| uint32_t SizeOfInitializedData; | |
| uint32_t SizeOfUninitializedData; | |
| uint32_t AddressOfEntryPoint; | |
| uint32_t BaseOfCode; | |
| uint64_t ImageBase; | |
| uint32_t SectionAlignment; | |
| uint32_t FileAlignment; | |
| uint16_t MajorOperatingSystemVersion; | |
| uint16_t MinorOperatingSystemVersion; | |
| uint16_t MajorImageVersion; | |
| uint16_t MinorImageVersion; | |
| uint16_t MajorSubsystemVersion; | |
| uint16_t MinorSubsystemVersion; | |
| uint32_t Win32VersionValue; | |
| uint32_t SizeOfImage; | |
| uint32_t SizeOfHeaders; | |
| uint32_t CheckSum; | |
| uint16_t Subsystem; | |
| uint16_t DllCharacteristics; | |
| uint64_t SizeOfStackReserve; | |
| uint64_t SizeOfStackCommit; | |
| uint64_t SizeOfHeapReserve; | |
| uint64_t SizeOfHeapCommit; | |
| uint32_t LoaderFlags; | |
| uint32_t NumberOfRvaAndSizes; | |
| IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; | |
| } IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64; | |
| typedef struct _IMAGE_NT_HEADERS64 { | |
| uint32_t Signature; | |
| IMAGE_FILE_HEADER FileHeader; | |
| IMAGE_OPTIONAL_HEADER64 OptionalHeader; | |
| } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64; | |
| typedef struct _IMAGE_NT_HEADERS32 { | |
| uint32_t Signature; | |
| IMAGE_FILE_HEADER FileHeader; | |
| IMAGE_OPTIONAL_HEADER32 OptionalHeader; | |
| } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32; | |
| #ifdef _WIN64 | |
| typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; | |
| typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; | |
| #else | |
| typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; | |
| typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; | |
| #endif | |
| typedef struct _IMAGE_SECTION_HEADER { | |
| uint8_t Name[IMAGE_SIZEOF_SHORT_NAME]; | |
| union { | |
| uint32_t PhysicalAddress; | |
| uint32_t VirtualSize; | |
| } Misc; | |
| uint32_t VirtualAddress; | |
| uint32_t SizeOfRawData; | |
| uint32_t PointerToRawData; | |
| uint32_t PointerToRelocations; | |
| uint32_t PointerToLinenumbers; | |
| uint16_t NumberOfRelocations; | |
| uint16_t NumberOfLinenumbers; | |
| uint32_t Characteristics; | |
| } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; | |
| typedef struct _IMAGE_BASE_RELOCATION { | |
| uint32_t VirtualAddress; | |
| uint32_t SizeOfBlock; | |
| } IMAGE_BASE_RELOCATION; | |
| typedef IMAGE_BASE_RELOCATION *PIMAGE_BASE_RELOCATION; | |
| #define IMAGE_SIZEOF_BASE_RELOCATION 8 | |
| #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_MIPS_JMPADDR16 9 | |
| #define IMAGE_REL_BASED_IA64_IMM64 9 | |
| #define IMAGE_REL_BASED_DIR64 10 | |
| typedef struct _IMAGE_EXPORT_DIRECTORY { | |
| uint32_t Characteristics; | |
| uint32_t TimeDateStamp; | |
| uint16_t MajorVersion; | |
| uint16_t MinorVersion; | |
| uint32_t Name; | |
| uint32_t Base; | |
| uint32_t NumberOfFunctions; | |
| uint32_t NumberOfNames; | |
| uint32_t AddressOfFunctions; | |
| uint32_t AddressOfNames; | |
| uint32_t AddressOfNameOrdinals; | |
| } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; | |
| typedef struct _IMAGE_IMPORT_BY_NAME { | |
| uint16_t Hint; | |
| unsigned char Name[1]; | |
| } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; | |
| typedef struct _IMAGE_THUNK_DATA64 { | |
| union { | |
| uint64_t ForwarderString; | |
| uint64_t Function; | |
| uint64_t Ordinal; | |
| uint64_t AddressOfData; | |
| } u1; | |
| } IMAGE_THUNK_DATA64; | |
| typedef IMAGE_THUNK_DATA64 *PIMAGE_THUNK_DATA64; | |
| typedef struct _IMAGE_THUNK_DATA32 { | |
| union { | |
| uint32_t ForwarderString; | |
| uint32_t Function; | |
| uint32_t Ordinal; | |
| uint32_t AddressOfData; | |
| } u1; | |
| } IMAGE_THUNK_DATA32; | |
| typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32; | |
| #define IMAGE_ORDINAL_FLAG64 0x8000000000000000ull | |
| #define IMAGE_ORDINAL_FLAG32 0x80000000 | |
| #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffffull) | |
| #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff) | |
| #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64)!=0) | |
| #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32)!=0) | |
| typedef struct _IMAGE_IMPORT_DESCRIPTOR { | |
| #ifdef __GNUC__ | |
| __extension__ | |
| #endif | |
| union { | |
| uint32_t Characteristics; | |
| uint32_t OriginalFirstThunk; | |
| }; | |
| uint32_t TimeDateStamp; | |
| uint32_t ForwarderChain; | |
| uint32_t Name; | |
| uint32_t FirstThunk; | |
| } IMAGE_IMPORT_DESCRIPTOR; | |
| typedef struct gendefopts | |
| { | |
| char *fninput; | |
| char *fnoutput; | |
| struct gendefopts *next; | |
| } Gendefopts; | |
| typedef struct sExportname | |
| { | |
| struct sExportname *next; | |
| char *name; | |
| char *forward; | |
| uint32_t ord; | |
| uint32_t func; | |
| uint32_t retpop; | |
| int be64; | |
| int beData; | |
| } sExportName; | |
| typedef struct sImportname { | |
| struct sImportname *next; | |
| uint32_t addr_iat; | |
| char *dll; | |
| char *name; | |
| uint16_t ord; | |
| } sImportname; | |
| typedef enum eOpCodeKind { | |
| c_ill=-1,c_EG,c_lb,c_lv,c_1,c_2,c_3,c_4, | |
| c_0f,c_ad,c_op,c_EGlv,c_EGlb,c_jxx,c_jxxv, | |
| c_O, | |
| c_g4, c_EGg3b, c_EGg3v, | |
| c_jmpnjb,c_jmpfap, | |
| c_jmpnjv,c_calljv,c_callfar, | |
| c_iret,c_int3, | |
| c_retf,c_retflw, | |
| c_retn,c_retnlw | |
| } eOpCodeKind; | |
| typedef struct sAddresses { | |
| uint32_t max; | |
| uint32_t cnt; | |
| uint32_t *ptrs; | |
| uint32_t idx; | |
| } sAddresses; | |
| int gendef_getsymbol_info (const char *dllname, const char *symbolname, int *isData, uint32_t *at); | |
| int gendef_addpath_def (const char *path); | |
| #endif |