2 pexports - a program to extract exported symbols from a Portable
5 Copyright (C) 1998 Anders Norlander
7 pexports is distributed under the GNU General Public License and
8 has absolutely NO WARRANTY.
10 pexports will work only on intel machines.
22 * FIXME: However, I'd really much prefer to see ISO-C99 standard
23 * types used throughout, in preference to these Micrsoft-inspired
24 * obfuscated typedefs.
27 typedef uint16_t WORD;
28 typedef uint32_t DWORD;
31 typedef uint64_t ULONGLONG;
33 typedef void* HMODULE;
39 typedef struct _IMAGE_DATA_DIRECTORY {
42 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
44 typedef struct _IMAGE_FILE_HEADER {
46 WORD NumberOfSections;
48 DWORD PointerToSymbolTable;
49 DWORD NumberOfSymbols;
50 WORD SizeOfOptionalHeader;
52 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
54 #define IMAGE_FILE_MACHINE_I386 0x014c
55 #define IMAGE_FILE_MACHINE_IA64 0x0200
56 #define IMAGE_FILE_MACHINE_AMD64 0x8664
58 typedef struct _IMAGE_OPTIONAL_HEADER32 {
60 BYTE MajorLinkerVersion;
61 BYTE MinorLinkerVersion;
63 DWORD SizeOfInitializedData;
64 DWORD SizeOfUninitializedData;
65 DWORD AddressOfEntryPoint;
69 DWORD SectionAlignment;
71 WORD MajorOperatingSystemVersion;
72 WORD MinorOperatingSystemVersion;
73 WORD MajorImageVersion;
74 WORD MinorImageVersion;
75 WORD MajorSubsystemVersion;
76 WORD MinorSubsystemVersion;
82 WORD DllCharacteristics;
83 DWORD SizeOfStackReserve;
84 DWORD SizeOfStackCommit;
85 DWORD SizeOfHeapReserve;
86 DWORD SizeOfHeapCommit;
88 DWORD NumberOfRvaAndSizes;
89 IMAGE_DATA_DIRECTORY DataDirectory[16];
90 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
92 typedef struct _IMAGE_OPTIONAL_HEADER64 {
94 BYTE MajorLinkerVersion;
95 BYTE MinorLinkerVersion;
97 DWORD SizeOfInitializedData;
98 DWORD SizeOfUninitializedData;
99 DWORD AddressOfEntryPoint;
102 DWORD SectionAlignment;
104 WORD MajorOperatingSystemVersion;
105 WORD MinorOperatingSystemVersion;
106 WORD MajorImageVersion;
107 WORD MinorImageVersion;
108 WORD MajorSubsystemVersion;
109 WORD MinorSubsystemVersion;
110 DWORD Win32VersionValue;
115 WORD DllCharacteristics;
116 ULONGLONG SizeOfStackReserve;
117 ULONGLONG SizeOfStackCommit;
118 ULONGLONG SizeOfHeapReserve;
119 ULONGLONG SizeOfHeapCommit;
121 DWORD NumberOfRvaAndSizes;
122 IMAGE_DATA_DIRECTORY DataDirectory[16];
123 } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
125 typedef struct IMAGE_NT_HEADERS32 {
127 IMAGE_FILE_HEADER FileHeader;
128 IMAGE_OPTIONAL_HEADER32 OptionalHeader;
129 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
131 typedef struct _IMAGE_NT_HEADERS64 {
133 IMAGE_FILE_HEADER FileHeader;
134 IMAGE_OPTIONAL_HEADER64 OptionalHeader;
135 } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
137 typedef struct _IMAGE_SECTION_HEADER {
140 DWORD PhysicalAddress;
143 DWORD VirtualAddress;
145 DWORD PointerToRawData;
146 DWORD PointerToRelocations;
147 DWORD PointerToLinenumbers;
148 WORD NumberOfRelocations;
149 WORD NumberOfLinenumbers;
150 DWORD Characteristics;
151 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
153 #define IMAGE_SCN_CNT_CODE 0x00000020
155 typedef struct _IMAGE_EXPORT_DIRECTORY {
156 DWORD Characteristics;
162 DWORD NumberOfFunctions;
164 DWORD AddressOfFunctions;
165 DWORD AddressOfNames;
166 DWORD AddressOfNameOrdinals;
167 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
169 typedef struct _IMAGE_DOS_HEADER {
189 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
191 PIMAGE_SECTION_HEADER
192 find_section(DWORD rva);
195 load_pe_image(const char *filename);
198 rva_to_ptr(DWORD rva);
201 dump_exports(DWORD exports_rva, DWORD exports_size);
203 #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(intptr_t)(n))
204 extern str_tree *symbols;
206 #endif /* _pexports_h */