| /* |
| gendef - Generate list of exported symbols from a Portable Executable. |
| Copyright (C) 2009, 2010, 2011, 2012, 2013 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); |
| |
| #pragma pack() |
| |
| #endif |