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.
25 * FIXME: However, I'd really much prefer to see ISO-C99 standard
26 * types used throughout, in preference to these Micrsoft-inspired
27 * obfuscated typedefs.
30 typedef uint16_t WORD;
31 typedef uint32_t DWORD;
34 typedef uint64_t ULONGLONG;
36 typedef void* HMODULE;
42 typedef struct _IMAGE_DATA_DIRECTORY {
45 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
47 typedef struct _IMAGE_FILE_HEADER {
49 WORD NumberOfSections;
51 DWORD PointerToSymbolTable;
52 DWORD NumberOfSymbols;
53 WORD SizeOfOptionalHeader;
55 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
57 #define IMAGE_FILE_MACHINE_I386 0x014c
58 #define IMAGE_FILE_MACHINE_IA64 0x0200
59 #define IMAGE_FILE_MACHINE_AMD64 0x8664
61 typedef struct _IMAGE_OPTIONAL_HEADER32 {
63 BYTE MajorLinkerVersion;
64 BYTE MinorLinkerVersion;
66 DWORD SizeOfInitializedData;
67 DWORD SizeOfUninitializedData;
68 DWORD AddressOfEntryPoint;
72 DWORD SectionAlignment;
74 WORD MajorOperatingSystemVersion;
75 WORD MinorOperatingSystemVersion;
76 WORD MajorImageVersion;
77 WORD MinorImageVersion;
78 WORD MajorSubsystemVersion;
79 WORD MinorSubsystemVersion;
85 WORD DllCharacteristics;
86 DWORD SizeOfStackReserve;
87 DWORD SizeOfStackCommit;
88 DWORD SizeOfHeapReserve;
89 DWORD SizeOfHeapCommit;
91 DWORD NumberOfRvaAndSizes;
92 IMAGE_DATA_DIRECTORY DataDirectory[16];
93 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
95 typedef struct _IMAGE_OPTIONAL_HEADER64 {
97 BYTE MajorLinkerVersion;
98 BYTE MinorLinkerVersion;
100 DWORD SizeOfInitializedData;
101 DWORD SizeOfUninitializedData;
102 DWORD AddressOfEntryPoint;
105 DWORD SectionAlignment;
107 WORD MajorOperatingSystemVersion;
108 WORD MinorOperatingSystemVersion;
109 WORD MajorImageVersion;
110 WORD MinorImageVersion;
111 WORD MajorSubsystemVersion;
112 WORD MinorSubsystemVersion;
113 DWORD Win32VersionValue;
118 WORD DllCharacteristics;
119 ULONGLONG SizeOfStackReserve;
120 ULONGLONG SizeOfStackCommit;
121 ULONGLONG SizeOfHeapReserve;
122 ULONGLONG SizeOfHeapCommit;
124 DWORD NumberOfRvaAndSizes;
125 IMAGE_DATA_DIRECTORY DataDirectory[16];
126 } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
128 typedef struct IMAGE_NT_HEADERS32 {
130 IMAGE_FILE_HEADER FileHeader;
131 IMAGE_OPTIONAL_HEADER32 OptionalHeader;
132 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
134 typedef struct _IMAGE_NT_HEADERS64 {
136 IMAGE_FILE_HEADER FileHeader;
137 IMAGE_OPTIONAL_HEADER64 OptionalHeader;
138 } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
140 typedef struct _IMAGE_SECTION_HEADER {
143 DWORD PhysicalAddress;
146 DWORD VirtualAddress;
148 DWORD PointerToRawData;
149 DWORD PointerToRelocations;
150 DWORD PointerToLinenumbers;
151 WORD NumberOfRelocations;
152 WORD NumberOfLinenumbers;
153 DWORD Characteristics;
154 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
156 #define IMAGE_SCN_CNT_CODE 0x00000020
158 typedef struct _IMAGE_EXPORT_DIRECTORY {
159 DWORD Characteristics;
165 DWORD NumberOfFunctions;
167 DWORD AddressOfFunctions;
168 DWORD AddressOfNames;
169 DWORD AddressOfNameOrdinals;
170 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
172 typedef struct _IMAGE_DOS_HEADER {
192 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
194 PIMAGE_SECTION_HEADER
195 find_section(DWORD rva);
198 load_pe_image(const char *filename);
201 rva_to_ptr(DWORD rva);
204 dump_exports(DWORD exports_rva, DWORD exports_size);
206 #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(intptr_t)(n))
207 extern str_tree *symbols;
209 #endif /* _pexports_h */