OSDN Git Service

Avoid segmentation faults in forwarder function checks.
[mingw/pexports.git] / pexports.h
1 /*
2  pexports - a program to extract exported symbols from a Portable
3  Executable (PE) file.
4
5  Copyright (C) 1998 Anders Norlander
6
7  pexports is distributed under the GNU General Public License and
8  has absolutely NO WARRANTY.
9
10  pexports will work only on intel machines.
11 */
12
13 #ifndef _pexports_h
14 #define _pexports_h
15
16 #include <stdio.h>
17
18 #include "str_tree.h"
19
20 #define VER_MAJOR 0
21 #define VER_MINOR 44
22
23 /* These are needed */
24 typedef unsigned short WORD;
25 typedef unsigned int DWORD;
26 typedef unsigned char BYTE;
27 typedef void* PVOID;
28 typedef long LONG;
29 #if defined(__MINGW32__) || defined(_MSC_VER)
30 typedef unsigned __int64 ULONGLONG;
31 #else
32 typedef unsigned long long ULONGLONG;
33 #endif
34 typedef int BOOL;
35 typedef void* HMODULE;
36 #ifdef _WIN64
37 typedef __int64 INT_PTR;
38 #define INT_PTR_FORMAT "I64d"
39 #else
40 typedef int INT_PTR;
41 #define INT_PTR_FORMAT "d"
42 #endif
43
44 #define FALSE 0
45 #define TRUE 1
46
47 /* PE structures */
48 typedef struct _IMAGE_DATA_DIRECTORY {
49   DWORD   VirtualAddress;
50   DWORD   Size;
51 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
52
53 typedef struct _IMAGE_FILE_HEADER {
54   WORD    Machine;
55   WORD    NumberOfSections;
56   DWORD   TimeDateStamp;
57   DWORD   PointerToSymbolTable;
58   DWORD   NumberOfSymbols;
59   WORD    SizeOfOptionalHeader;
60   WORD    Characteristics;
61 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
62
63 #define IMAGE_FILE_MACHINE_I386  0x014c
64 #define IMAGE_FILE_MACHINE_IA64  0x0200
65 #define IMAGE_FILE_MACHINE_AMD64 0x8664
66
67 typedef struct _IMAGE_OPTIONAL_HEADER32 {
68   WORD    Magic;
69   BYTE    MajorLinkerVersion;
70   BYTE    MinorLinkerVersion;
71   DWORD   SizeOfCode;
72   DWORD   SizeOfInitializedData;
73   DWORD   SizeOfUninitializedData;
74   DWORD   AddressOfEntryPoint;
75   DWORD   BaseOfCode;
76   DWORD   BaseOfData;
77   DWORD   ImageBase;
78   DWORD   SectionAlignment;
79   DWORD   FileAlignment;
80   WORD    MajorOperatingSystemVersion;
81   WORD    MinorOperatingSystemVersion;
82   WORD    MajorImageVersion;
83   WORD    MinorImageVersion;
84   WORD    MajorSubsystemVersion;
85   WORD    MinorSubsystemVersion;
86   DWORD   Reserved1;
87   DWORD   SizeOfImage;
88   DWORD   SizeOfHeaders;
89   DWORD   CheckSum;
90   WORD    Subsystem;
91   WORD    DllCharacteristics;
92   DWORD   SizeOfStackReserve;
93   DWORD   SizeOfStackCommit;
94   DWORD   SizeOfHeapReserve;
95   DWORD   SizeOfHeapCommit;
96   DWORD   LoaderFlags;
97   DWORD   NumberOfRvaAndSizes;
98   IMAGE_DATA_DIRECTORY DataDirectory[16];
99 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
100
101 typedef struct _IMAGE_OPTIONAL_HEADER64 {
102   WORD    Magic;
103   BYTE    MajorLinkerVersion;
104   BYTE    MinorLinkerVersion;
105   DWORD   SizeOfCode;
106   DWORD   SizeOfInitializedData;
107   DWORD   SizeOfUninitializedData;
108   DWORD   AddressOfEntryPoint;
109   DWORD   BaseOfCode;
110   ULONGLONG ImageBase;
111   DWORD   SectionAlignment;
112   DWORD   FileAlignment;
113   WORD    MajorOperatingSystemVersion;
114   WORD    MinorOperatingSystemVersion;
115   WORD    MajorImageVersion;
116   WORD    MinorImageVersion;
117   WORD    MajorSubsystemVersion;
118   WORD    MinorSubsystemVersion;
119   DWORD   Win32VersionValue;
120   DWORD   SizeOfImage;
121   DWORD   SizeOfHeaders;
122   DWORD   CheckSum;
123   WORD    Subsystem;
124   WORD    DllCharacteristics;
125   ULONGLONG SizeOfStackReserve;
126   ULONGLONG SizeOfStackCommit;
127   ULONGLONG SizeOfHeapReserve;
128   ULONGLONG SizeOfHeapCommit;
129   DWORD   LoaderFlags;
130   DWORD   NumberOfRvaAndSizes;
131   IMAGE_DATA_DIRECTORY DataDirectory[16];
132 } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
133
134 typedef struct IMAGE_NT_HEADERS32 {
135   char Signature[4];
136   IMAGE_FILE_HEADER FileHeader;
137   IMAGE_OPTIONAL_HEADER32 OptionalHeader;
138 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
139
140 typedef struct _IMAGE_NT_HEADERS64 {
141   char Signature[4];
142   IMAGE_FILE_HEADER FileHeader;
143   IMAGE_OPTIONAL_HEADER64 OptionalHeader;
144 } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
145
146 typedef struct _IMAGE_SECTION_HEADER {
147   BYTE    Name[8];
148   union {
149     DWORD   PhysicalAddress;
150     DWORD   VirtualSize;
151   } Misc;
152   DWORD   VirtualAddress;
153   DWORD   SizeOfRawData;
154   DWORD   PointerToRawData;
155   DWORD   PointerToRelocations;
156   DWORD   PointerToLinenumbers;
157   WORD    NumberOfRelocations;
158   WORD    NumberOfLinenumbers;
159   DWORD   Characteristics;
160 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
161
162 #define IMAGE_SCN_CNT_CODE 0x00000020
163
164 typedef struct _IMAGE_EXPORT_DIRECTORY {
165   DWORD   Characteristics;
166   DWORD   TimeDateStamp;
167   WORD    MajorVersion;
168   WORD    MinorVersion;
169   DWORD   Name;
170   DWORD   Base;
171   DWORD   NumberOfFunctions;
172   DWORD   NumberOfNames;
173   DWORD   AddressOfFunctions;
174   DWORD   AddressOfNames;
175   DWORD   AddressOfNameOrdinals;
176 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
177
178 typedef struct _IMAGE_DOS_HEADER {
179   WORD   e_magic;
180   WORD   e_cblp;
181   WORD   e_cp;   
182   WORD   e_crlc; 
183   WORD   e_cparhdr;
184   WORD   e_minalloc;
185   WORD   e_maxalloc;
186   WORD   e_ss;      
187   WORD   e_sp;      
188   WORD   e_csum;
189   WORD   e_ip;      
190   WORD   e_cs;      
191   WORD   e_lfarlc;  
192   WORD   e_ovno;    
193   WORD   e_res[4];  
194   WORD   e_oemid;   
195   WORD   e_oeminfo; 
196   WORD   e_res2[10];
197   LONG   e_lfanew;  
198 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
199
200 PIMAGE_SECTION_HEADER
201 find_section(DWORD rva);
202
203 PIMAGE_DOS_HEADER
204 load_pe_image(const char *filename);
205
206 void *
207 rva_to_ptr(DWORD rva);
208
209 void
210 dump_exports(DWORD exports_rva, DWORD exports_size);
211
212 #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(INT_PTR)n)
213 extern str_tree *symbols;
214
215 #endif /* _pexports_h */