| /* | 
 |     gendef - Generate list of exported symbols from a Portable Executable. | 
 |     Copyright (C) 2009-2016  mingw-w64 project | 
 |  | 
 |     This program is free software: you can redistribute it and/or modify | 
 |     it under the terms of the GNU General Public License as published by | 
 |     the Free Software Foundation, either version 3 of the License, or | 
 |     (at your option) any later version. | 
 |  | 
 |     This program is distributed in the hope that it will be useful, | 
 |     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |     GNU General Public License for more details. | 
 |  | 
 |     You should have received a copy of the GNU General Public License | 
 |     along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
 | */ | 
 | #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); | 
 | void gendef_no_include_current_dir (void); | 
 |  | 
 | #pragma pack() | 
 |  | 
 | #endif |