OSDN Git Service

Eliminate Microsoft inspired obfuscated typedef insanity.
[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 #ifndef _pexports_h
13 #define _pexports_h
14
15 #include <stdio.h>
16 #include <stdint.h>
17
18 #include "str_tree.h"
19
20 #define FALSE (int32_t)(0)
21 #define TRUE  (int32_t)(1)
22
23 /* PE structures */
24 typedef struct IMAGE_DATA_DIRECTORY {
25   uint32_t   VirtualAddress;
26   uint32_t   Size;
27 } IMAGE_DATA_DIRECTORY;
28
29 typedef struct IMAGE_FILE_HEADER {
30   uint16_t   Machine;
31   uint16_t   NumberOfSections;
32   uint32_t   TimeDateStamp;
33   uint32_t   PointerToSymbolTable;
34   uint32_t   NumberOfSymbols;
35   uint16_t   SizeOfOptionalHeader;
36   uint16_t   Characteristics;
37 } IMAGE_FILE_HEADER;
38
39 #define IMAGE_FILE_MACHINE_I386  0x014c
40 #define IMAGE_FILE_MACHINE_IA64  0x0200
41 #define IMAGE_FILE_MACHINE_AMD64 0x8664
42
43 typedef struct IMAGE_OPTIONAL_HEADER32 {
44   uint16_t   Magic;
45   uint8_t    MajorLinkerVersion;
46   uint8_t    MinorLinkerVersion;
47   uint32_t   SizeOfCode;
48   uint32_t   SizeOfInitializedData;
49   uint32_t   SizeOfUninitializedData;
50   uint32_t   AddressOfEntryPoint;
51   uint32_t   BaseOfCode;
52   uint32_t   BaseOfData;
53   uint32_t   ImageBase;
54   uint32_t   SectionAlignment;
55   uint32_t   FileAlignment;
56   uint16_t   MajorOperatingSystemVersion;
57   uint16_t   MinorOperatingSystemVersion;
58   uint16_t   MajorImageVersion;
59   uint16_t   MinorImageVersion;
60   uint16_t   MajorSubsystemVersion;
61   uint16_t   MinorSubsystemVersion;
62   uint32_t   Reserved1;
63   uint32_t   SizeOfImage;
64   uint32_t   SizeOfHeaders;
65   uint32_t   CheckSum;
66   uint16_t   Subsystem;
67   uint16_t   DllCharacteristics;
68   uint32_t   SizeOfStackReserve;
69   uint32_t   SizeOfStackCommit;
70   uint32_t   SizeOfHeapReserve;
71   uint32_t   SizeOfHeapCommit;
72   uint32_t   LoaderFlags;
73   uint32_t   NumberOfRvaAndSizes;
74   IMAGE_DATA_DIRECTORY DataDirectory[16];
75 } IMAGE_OPTIONAL_HEADER32;
76
77 typedef struct IMAGE_OPTIONAL_HEADER64 {
78   uint16_t   Magic;
79   uint8_t    MajorLinkerVersion;
80   uint8_t    MinorLinkerVersion;
81   uint32_t   SizeOfCode;
82   uint32_t   SizeOfInitializedData;
83   uint32_t   SizeOfUninitializedData;
84   uint32_t   AddressOfEntryPoint;
85   uint32_t   BaseOfCode;
86   uint64_t   ImageBase;
87   uint32_t   SectionAlignment;
88   uint32_t   FileAlignment;
89   uint16_t   MajorOperatingSystemVersion;
90   uint16_t   MinorOperatingSystemVersion;
91   uint16_t   MajorImageVersion;
92   uint16_t   MinorImageVersion;
93   uint16_t   MajorSubsystemVersion;
94   uint16_t   MinorSubsystemVersion;
95   uint32_t   Win32VersionValue;
96   uint32_t   SizeOfImage;
97   uint32_t   SizeOfHeaders;
98   uint32_t   CheckSum;
99   uint16_t   Subsystem;
100   uint16_t   DllCharacteristics;
101   uint64_t   SizeOfStackReserve;
102   uint64_t   SizeOfStackCommit;
103   uint64_t   SizeOfHeapReserve;
104   uint64_t   SizeOfHeapCommit;
105   uint32_t   LoaderFlags;
106   uint32_t   NumberOfRvaAndSizes;
107   IMAGE_DATA_DIRECTORY DataDirectory[16];
108 } IMAGE_OPTIONAL_HEADER64;
109
110 typedef struct IMAGE_NT_HEADERS32 {
111   char Signature[4];
112   IMAGE_FILE_HEADER FileHeader;
113   IMAGE_OPTIONAL_HEADER32 OptionalHeader;
114 } IMAGE_NT_HEADERS32;
115
116 typedef struct IMAGE_NT_HEADERS64 {
117   char Signature[4];
118   IMAGE_FILE_HEADER FileHeader;
119   IMAGE_OPTIONAL_HEADER64 OptionalHeader;
120 } IMAGE_NT_HEADERS64;
121
122 typedef struct IMAGE_SECTION_HEADER {
123   uint8_t    Name[8];
124   union {
125     uint32_t PhysicalAddress;
126     uint32_t VirtualSize;
127   } Misc;
128   uint32_t   VirtualAddress;
129   uint32_t   SizeOfRawData;
130   uint32_t   PointerToRawData;
131   uint32_t   PointerToRelocations;
132   uint32_t   PointerToLinenumbers;
133   uint16_t   NumberOfRelocations;
134   uint16_t   NumberOfLinenumbers;
135   uint32_t   Characteristics;
136 } IMAGE_SECTION_HEADER;
137
138 #define IMAGE_SCN_CNT_CODE 0x00000020
139
140 typedef struct IMAGE_EXPORT_DIRECTORY {
141   uint32_t   Characteristics;
142   uint32_t   TimeDateStamp;
143   uint16_t   MajorVersion;
144   uint16_t   MinorVersion;
145   uint32_t   Name;
146   uint32_t   Base;
147   uint32_t   NumberOfFunctions;
148   uint32_t   NumberOfNames;
149   uint32_t   AddressOfFunctions;
150   uint32_t   AddressOfNames;
151   uint32_t   AddressOfNameOrdinals;
152 } IMAGE_EXPORT_DIRECTORY;
153
154 typedef struct IMAGE_DOS_HEADER {
155   uint16_t   e_magic;
156   uint16_t   e_cblp;
157   uint16_t   e_cp;
158   uint16_t   e_crlc;
159   uint16_t   e_cparhdr;
160   uint16_t   e_minalloc;
161   uint16_t   e_maxalloc;
162   uint16_t   e_ss;
163   uint16_t   e_sp;
164   uint16_t   e_csum;
165   uint16_t   e_ip;
166   uint16_t   e_cs;
167   uint16_t   e_lfarlc;
168   uint16_t   e_ovno;
169   uint16_t   e_res[4];
170   uint16_t   e_oemid;
171   uint16_t   e_oeminfo;
172   uint16_t   e_res2[10];
173   int32_t    e_lfanew;
174 } IMAGE_DOS_HEADER;
175
176 IMAGE_SECTION_HEADER *find_section( uint32_t );
177 IMAGE_DOS_HEADER *load_pe_image( const char * );
178
179 void *rva_to_ptr( uint32_t );
180 void dump_exports( uint32_t, uint32_t );
181
182 #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(intptr_t)(n))
183 extern str_tree *symbols;
184
185 #endif /* _pexports_h */