OSDN Git Service

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