OSDN Git Service

Update program identification, via configuration process.
[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 #include <stdint.h>
18
19 #include "str_tree.h"
20
21 /* These are needed:
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.
25  */
26 typedef uint8_t  BYTE;
27 typedef uint16_t WORD;
28 typedef uint32_t DWORD;
29 typedef void* PVOID;
30 typedef int32_t LONG;
31 typedef uint64_t ULONGLONG;
32 typedef int BOOL;
33 typedef void* HMODULE;
34
35 #define FALSE 0
36 #define TRUE 1
37
38 /* PE structures */
39 typedef struct _IMAGE_DATA_DIRECTORY {
40   DWORD   VirtualAddress;
41   DWORD   Size;
42 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
43
44 typedef struct _IMAGE_FILE_HEADER {
45   WORD    Machine;
46   WORD    NumberOfSections;
47   DWORD   TimeDateStamp;
48   DWORD   PointerToSymbolTable;
49   DWORD   NumberOfSymbols;
50   WORD    SizeOfOptionalHeader;
51   WORD    Characteristics;
52 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
53
54 #define IMAGE_FILE_MACHINE_I386  0x014c
55 #define IMAGE_FILE_MACHINE_IA64  0x0200
56 #define IMAGE_FILE_MACHINE_AMD64 0x8664
57
58 typedef struct _IMAGE_OPTIONAL_HEADER32 {
59   WORD    Magic;
60   BYTE    MajorLinkerVersion;
61   BYTE    MinorLinkerVersion;
62   DWORD   SizeOfCode;
63   DWORD   SizeOfInitializedData;
64   DWORD   SizeOfUninitializedData;
65   DWORD   AddressOfEntryPoint;
66   DWORD   BaseOfCode;
67   DWORD   BaseOfData;
68   DWORD   ImageBase;
69   DWORD   SectionAlignment;
70   DWORD   FileAlignment;
71   WORD    MajorOperatingSystemVersion;
72   WORD    MinorOperatingSystemVersion;
73   WORD    MajorImageVersion;
74   WORD    MinorImageVersion;
75   WORD    MajorSubsystemVersion;
76   WORD    MinorSubsystemVersion;
77   DWORD   Reserved1;
78   DWORD   SizeOfImage;
79   DWORD   SizeOfHeaders;
80   DWORD   CheckSum;
81   WORD    Subsystem;
82   WORD    DllCharacteristics;
83   DWORD   SizeOfStackReserve;
84   DWORD   SizeOfStackCommit;
85   DWORD   SizeOfHeapReserve;
86   DWORD   SizeOfHeapCommit;
87   DWORD   LoaderFlags;
88   DWORD   NumberOfRvaAndSizes;
89   IMAGE_DATA_DIRECTORY DataDirectory[16];
90 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
91
92 typedef struct _IMAGE_OPTIONAL_HEADER64 {
93   WORD    Magic;
94   BYTE    MajorLinkerVersion;
95   BYTE    MinorLinkerVersion;
96   DWORD   SizeOfCode;
97   DWORD   SizeOfInitializedData;
98   DWORD   SizeOfUninitializedData;
99   DWORD   AddressOfEntryPoint;
100   DWORD   BaseOfCode;
101   ULONGLONG ImageBase;
102   DWORD   SectionAlignment;
103   DWORD   FileAlignment;
104   WORD    MajorOperatingSystemVersion;
105   WORD    MinorOperatingSystemVersion;
106   WORD    MajorImageVersion;
107   WORD    MinorImageVersion;
108   WORD    MajorSubsystemVersion;
109   WORD    MinorSubsystemVersion;
110   DWORD   Win32VersionValue;
111   DWORD   SizeOfImage;
112   DWORD   SizeOfHeaders;
113   DWORD   CheckSum;
114   WORD    Subsystem;
115   WORD    DllCharacteristics;
116   ULONGLONG SizeOfStackReserve;
117   ULONGLONG SizeOfStackCommit;
118   ULONGLONG SizeOfHeapReserve;
119   ULONGLONG SizeOfHeapCommit;
120   DWORD   LoaderFlags;
121   DWORD   NumberOfRvaAndSizes;
122   IMAGE_DATA_DIRECTORY DataDirectory[16];
123 } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
124
125 typedef struct IMAGE_NT_HEADERS32 {
126   char Signature[4];
127   IMAGE_FILE_HEADER FileHeader;
128   IMAGE_OPTIONAL_HEADER32 OptionalHeader;
129 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
130
131 typedef struct _IMAGE_NT_HEADERS64 {
132   char Signature[4];
133   IMAGE_FILE_HEADER FileHeader;
134   IMAGE_OPTIONAL_HEADER64 OptionalHeader;
135 } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
136
137 typedef struct _IMAGE_SECTION_HEADER {
138   BYTE    Name[8];
139   union {
140     DWORD   PhysicalAddress;
141     DWORD   VirtualSize;
142   } Misc;
143   DWORD   VirtualAddress;
144   DWORD   SizeOfRawData;
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;
152
153 #define IMAGE_SCN_CNT_CODE 0x00000020
154
155 typedef struct _IMAGE_EXPORT_DIRECTORY {
156   DWORD   Characteristics;
157   DWORD   TimeDateStamp;
158   WORD    MajorVersion;
159   WORD    MinorVersion;
160   DWORD   Name;
161   DWORD   Base;
162   DWORD   NumberOfFunctions;
163   DWORD   NumberOfNames;
164   DWORD   AddressOfFunctions;
165   DWORD   AddressOfNames;
166   DWORD   AddressOfNameOrdinals;
167 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
168
169 typedef struct _IMAGE_DOS_HEADER {
170   WORD   e_magic;
171   WORD   e_cblp;
172   WORD   e_cp;   
173   WORD   e_crlc; 
174   WORD   e_cparhdr;
175   WORD   e_minalloc;
176   WORD   e_maxalloc;
177   WORD   e_ss;      
178   WORD   e_sp;      
179   WORD   e_csum;
180   WORD   e_ip;      
181   WORD   e_cs;      
182   WORD   e_lfarlc;  
183   WORD   e_ovno;    
184   WORD   e_res[4];  
185   WORD   e_oemid;   
186   WORD   e_oeminfo; 
187   WORD   e_res2[10];
188   LONG   e_lfanew;  
189 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
190
191 PIMAGE_SECTION_HEADER
192 find_section(DWORD rva);
193
194 PIMAGE_DOS_HEADER
195 load_pe_image(const char *filename);
196
197 void *
198 rva_to_ptr(DWORD rva);
199
200 void
201 dump_exports(DWORD exports_rva, DWORD exports_size);
202
203 #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(intptr_t)(n))
204 extern str_tree *symbols;
205
206 #endif /* _pexports_h */