pe.h revision 1.1 1 1.1 jakllsch /* $NetBSD: pe.h,v 1.1 2014/04/01 16:16:07 jakllsch Exp $ */
2 1.1 jakllsch
3 1.1 jakllsch /*
4 1.1 jakllsch PE32+ header file
5 1.1 jakllsch */
6 1.1 jakllsch #ifndef _PE_H
7 1.1 jakllsch #define _PE_H
8 1.1 jakllsch
9 1.1 jakllsch #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
10 1.1 jakllsch #define IMAGE_OS2_SIGNATURE 0x454E // NE
11 1.1 jakllsch #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
12 1.1 jakllsch #define IMAGE_NT_SIGNATURE 0x00004550 // PE00
13 1.1 jakllsch #define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED
14 1.1 jakllsch
15 1.1 jakllsch /*****************************************************************************
16 1.1 jakllsch * The following stuff comes from winnt.h from the ia64sdk, plus the Plabel for
17 1.1 jakllsch * loading EM executables.
18 1.1 jakllsch *****************************************************************************/
19 1.1 jakllsch //
20 1.1 jakllsch // Intel IA64 specific
21 1.1 jakllsch //
22 1.1 jakllsch
23 1.1 jakllsch #define IMAGE_REL_BASED_IA64_IMM64 9
24 1.1 jakllsch #define IMAGE_REL_BASED_IA64_DIR64 10
25 1.1 jakllsch
26 1.1 jakllsch struct Plabel {
27 1.1 jakllsch UINT64 EntryPoint;
28 1.1 jakllsch UINT64 NewGP;
29 1.1 jakllsch };
30 1.1 jakllsch
31 1.1 jakllsch typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
32 1.1 jakllsch UINT16 e_magic; // Magic number
33 1.1 jakllsch UINT16 e_cblp; // Bytes on last page of file
34 1.1 jakllsch UINT16 e_cp; // Pages in file
35 1.1 jakllsch UINT16 e_crlc; // Relocations
36 1.1 jakllsch UINT16 e_cparhdr; // Size of header in paragraphs
37 1.1 jakllsch UINT16 e_minalloc; // Minimum extra paragraphs needed
38 1.1 jakllsch UINT16 e_maxalloc; // Maximum extra paragraphs needed
39 1.1 jakllsch UINT16 e_ss; // Initial (relative) SS value
40 1.1 jakllsch UINT16 e_sp; // Initial SP value
41 1.1 jakllsch UINT16 e_csum; // Checksum
42 1.1 jakllsch UINT16 e_ip; // Initial IP value
43 1.1 jakllsch UINT16 e_cs; // Initial (relative) CS value
44 1.1 jakllsch UINT16 e_lfarlc; // File address of relocation table
45 1.1 jakllsch UINT16 e_ovno; // Overlay number
46 1.1 jakllsch UINT16 e_res[4]; // Reserved words
47 1.1 jakllsch UINT16 e_oemid; // OEM identifier (for e_oeminfo)
48 1.1 jakllsch UINT16 e_oeminfo; // OEM information; e_oemid specific
49 1.1 jakllsch UINT16 e_res2[10]; // Reserved words
50 1.1 jakllsch UINT32 e_lfanew; // File address of new exe header
51 1.1 jakllsch } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
52 1.1 jakllsch
53 1.1 jakllsch typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header
54 1.1 jakllsch UINT16 ne_magic; // Magic number
55 1.1 jakllsch UINT8 ne_ver; // Version number
56 1.1 jakllsch UINT8 ne_rev; // Revision number
57 1.1 jakllsch UINT16 ne_enttab; // Offset of Entry Table
58 1.1 jakllsch UINT16 ne_cbenttab; // Number of bytes in Entry Table
59 1.1 jakllsch UINT32 ne_crc; // Checksum of whole file
60 1.1 jakllsch UINT16 ne_flags; // Flag UINT16
61 1.1 jakllsch UINT16 ne_autodata; // Automatic data segment number
62 1.1 jakllsch UINT16 ne_heap; // Initial heap allocation
63 1.1 jakllsch UINT16 ne_stack; // Initial stack allocation
64 1.1 jakllsch UINT32 ne_csip; // Initial CS:IP setting
65 1.1 jakllsch UINT32 ne_sssp; // Initial SS:SP setting
66 1.1 jakllsch UINT16 ne_cseg; // Count of file segments
67 1.1 jakllsch UINT16 ne_cmod; // Entries in Module Reference Table
68 1.1 jakllsch UINT16 ne_cbnrestab; // Size of non-resident name table
69 1.1 jakllsch UINT16 ne_segtab; // Offset of Segment Table
70 1.1 jakllsch UINT16 ne_rsrctab; // Offset of Resource Table
71 1.1 jakllsch UINT16 ne_restab; // Offset of resident name table
72 1.1 jakllsch UINT16 ne_modtab; // Offset of Module Reference Table
73 1.1 jakllsch UINT16 ne_imptab; // Offset of Imported Names Table
74 1.1 jakllsch UINT32 ne_nrestab; // Offset of Non-resident Names Table
75 1.1 jakllsch UINT16 ne_cmovent; // Count of movable entries
76 1.1 jakllsch UINT16 ne_align; // Segment alignment shift count
77 1.1 jakllsch UINT16 ne_cres; // Count of resource segments
78 1.1 jakllsch UINT8 ne_exetyp; // Target Operating system
79 1.1 jakllsch UINT8 ne_flagsothers; // Other .EXE flags
80 1.1 jakllsch UINT16 ne_pretthunks; // offset to return thunks
81 1.1 jakllsch UINT16 ne_psegrefbytes; // offset to segment ref. bytes
82 1.1 jakllsch UINT16 ne_swaparea; // Minimum code swap area size
83 1.1 jakllsch UINT16 ne_expver; // Expected Windows version number
84 1.1 jakllsch } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
85 1.1 jakllsch
86 1.1 jakllsch //
87 1.1 jakllsch // File header format.
88 1.1 jakllsch //
89 1.1 jakllsch
90 1.1 jakllsch typedef struct _IMAGE_FILE_HEADER {
91 1.1 jakllsch UINT16 Machine;
92 1.1 jakllsch UINT16 NumberOfSections;
93 1.1 jakllsch UINT32 TimeDateStamp;
94 1.1 jakllsch UINT32 PointerToSymbolTable;
95 1.1 jakllsch UINT32 NumberOfSymbols;
96 1.1 jakllsch UINT16 SizeOfOptionalHeader;
97 1.1 jakllsch UINT16 Characteristics;
98 1.1 jakllsch } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
99 1.1 jakllsch
100 1.1 jakllsch #define IMAGE_SIZEOF_FILE_HEADER 20
101 1.1 jakllsch
102 1.1 jakllsch #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
103 1.1 jakllsch #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
104 1.1 jakllsch #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
105 1.1 jakllsch #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
106 1.1 jakllsch #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
107 1.1 jakllsch #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
108 1.1 jakllsch #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
109 1.1 jakllsch #define IMAGE_FILE_SYSTEM 0x1000 // System File.
110 1.1 jakllsch #define IMAGE_FILE_DLL 0x2000 // File is a DLL.
111 1.1 jakllsch #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
112 1.1 jakllsch
113 1.1 jakllsch #define IMAGE_FILE_MACHINE_UNKNOWN 0
114 1.1 jakllsch #define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386.
115 1.1 jakllsch #define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian
116 1.1 jakllsch #define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
117 1.1 jakllsch #define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
118 1.1 jakllsch #define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb
119 1.1 jakllsch #define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian
120 1.1 jakllsch #define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64
121 1.1 jakllsch #define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine
122 1.1 jakllsch #define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code
123 1.1 jakllsch #define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64
124 1.1 jakllsch //
125 1.1 jakllsch // Directory format.
126 1.1 jakllsch //
127 1.1 jakllsch
128 1.1 jakllsch typedef struct _IMAGE_DATA_DIRECTORY {
129 1.1 jakllsch UINT32 VirtualAddress;
130 1.1 jakllsch UINT32 Size;
131 1.1 jakllsch } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
132 1.1 jakllsch
133 1.1 jakllsch #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
134 1.1 jakllsch
135 1.1 jakllsch
136 1.1 jakllsch typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
137 1.1 jakllsch UINT16 Magic;
138 1.1 jakllsch UINT8 MajorLinkerVersion;
139 1.1 jakllsch UINT8 MinorLinkerVersion;
140 1.1 jakllsch UINT32 SizeOfCode;
141 1.1 jakllsch UINT32 SizeOfInitializedData;
142 1.1 jakllsch UINT32 SizeOfUninitializedData;
143 1.1 jakllsch UINT32 AddressOfEntryPoint;
144 1.1 jakllsch UINT32 BaseOfCode;
145 1.1 jakllsch UINT32 BaseOfData;
146 1.1 jakllsch UINT32 BaseOfBss;
147 1.1 jakllsch UINT32 GprMask;
148 1.1 jakllsch UINT32 CprMask[4];
149 1.1 jakllsch UINT32 GpValue;
150 1.1 jakllsch } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
151 1.1 jakllsch
152 1.1 jakllsch typedef struct _IMAGE_OPTIONAL_HEADER {
153 1.1 jakllsch UINT16 Magic;
154 1.1 jakllsch UINT8 MajorLinkerVersion;
155 1.1 jakllsch UINT8 MinorLinkerVersion;
156 1.1 jakllsch UINT32 SizeOfCode;
157 1.1 jakllsch UINT32 SizeOfInitializedData;
158 1.1 jakllsch UINT32 SizeOfUninitializedData;
159 1.1 jakllsch UINT32 AddressOfEntryPoint;
160 1.1 jakllsch UINT32 BaseOfCode;
161 1.1 jakllsch // UINT32 BaseOfData;
162 1.1 jakllsch UINT64 ImageBase;
163 1.1 jakllsch UINT32 SectionAlignment;
164 1.1 jakllsch UINT32 FileAlignment;
165 1.1 jakllsch UINT16 MajorOperatingSystemVersion;
166 1.1 jakllsch UINT16 MinorOperatingSystemVersion;
167 1.1 jakllsch UINT16 MajorImageVersion;
168 1.1 jakllsch UINT16 MinorImageVersion;
169 1.1 jakllsch UINT16 MajorSubsystemVersion;
170 1.1 jakllsch UINT16 MinorSubsystemVersion;
171 1.1 jakllsch UINT32 Win32VersionValue;
172 1.1 jakllsch UINT32 SizeOfImage;
173 1.1 jakllsch UINT32 SizeOfHeaders;
174 1.1 jakllsch UINT32 CheckSum;
175 1.1 jakllsch UINT16 Subsystem;
176 1.1 jakllsch UINT16 DllCharacteristics;
177 1.1 jakllsch UINT64 SizeOfStackReserve;
178 1.1 jakllsch UINT64 SizeOfStackCommit;
179 1.1 jakllsch UINT64 SizeOfHeapReserve;
180 1.1 jakllsch UINT64 SizeOfHeapCommit;
181 1.1 jakllsch UINT32 LoaderFlags;
182 1.1 jakllsch UINT32 NumberOfRvaAndSizes;
183 1.1 jakllsch IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
184 1.1 jakllsch } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
185 1.1 jakllsch
186 1.1 jakllsch
187 1.1 jakllsch #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
188 1.1 jakllsch #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
189 1.1 jakllsch #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224
190 1.1 jakllsch #define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 244
191 1.1 jakllsch
192 1.1 jakllsch #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
193 1.1 jakllsch #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
194 1.1 jakllsch #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
195 1.1 jakllsch
196 1.1 jakllsch typedef struct _IMAGE_NT_HEADERS {
197 1.1 jakllsch UINT32 Signature;
198 1.1 jakllsch IMAGE_FILE_HEADER FileHeader;
199 1.1 jakllsch IMAGE_OPTIONAL_HEADER OptionalHeader;
200 1.1 jakllsch } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
201 1.1 jakllsch
202 1.1 jakllsch typedef struct _IMAGE_ROM_HEADERS {
203 1.1 jakllsch IMAGE_FILE_HEADER FileHeader;
204 1.1 jakllsch IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
205 1.1 jakllsch } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
206 1.1 jakllsch
207 1.1 jakllsch #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
208 1.1 jakllsch ((UINT32)ntheader + \
209 1.1 jakllsch FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
210 1.1 jakllsch ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \
211 1.1 jakllsch ))
212 1.1 jakllsch
213 1.1 jakllsch
214 1.1 jakllsch // Subsystem Values
215 1.1 jakllsch
216 1.1 jakllsch #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
217 1.1 jakllsch #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
218 1.1 jakllsch #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
219 1.1 jakllsch #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
220 1.1 jakllsch #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
221 1.1 jakllsch #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem.
222 1.1 jakllsch
223 1.1 jakllsch
224 1.1 jakllsch // Directory Entries
225 1.1 jakllsch
226 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
227 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
228 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
229 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
230 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
231 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
232 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
233 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String
234 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP)
235 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
236 1.1 jakllsch #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
237 1.1 jakllsch
238 1.1 jakllsch //
239 1.1 jakllsch // Section header format.
240 1.1 jakllsch //
241 1.1 jakllsch
242 1.1 jakllsch #define IMAGE_SIZEOF_SHORT_NAME 8
243 1.1 jakllsch
244 1.1 jakllsch typedef struct _IMAGE_SECTION_HEADER {
245 1.1 jakllsch UINT8 Name[IMAGE_SIZEOF_SHORT_NAME];
246 1.1 jakllsch union {
247 1.1 jakllsch UINT32 PhysicalAddress;
248 1.1 jakllsch UINT32 VirtualSize;
249 1.1 jakllsch } Misc;
250 1.1 jakllsch UINT32 VirtualAddress;
251 1.1 jakllsch UINT32 SizeOfRawData;
252 1.1 jakllsch UINT32 PointerToRawData;
253 1.1 jakllsch UINT32 PointerToRelocations;
254 1.1 jakllsch UINT32 PointerToLinenumbers;
255 1.1 jakllsch UINT16 NumberOfRelocations;
256 1.1 jakllsch UINT16 NumberOfLinenumbers;
257 1.1 jakllsch UINT32 Characteristics;
258 1.1 jakllsch } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
259 1.1 jakllsch
260 1.1 jakllsch #define IMAGE_SIZEOF_SECTION_HEADER 40
261 1.1 jakllsch
262 1.1 jakllsch #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
263 1.1 jakllsch
264 1.1 jakllsch #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
265 1.1 jakllsch #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
266 1.1 jakllsch #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
267 1.1 jakllsch
268 1.1 jakllsch #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
269 1.1 jakllsch #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
270 1.1 jakllsch #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
271 1.1 jakllsch #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
272 1.1 jakllsch
273 1.1 jakllsch #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
274 1.1 jakllsch #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
275 1.1 jakllsch #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
276 1.1 jakllsch #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
277 1.1 jakllsch #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
278 1.1 jakllsch #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
279 1.1 jakllsch #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
280 1.1 jakllsch
281 1.1 jakllsch #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
282 1.1 jakllsch #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
283 1.1 jakllsch #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
284 1.1 jakllsch #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
285 1.1 jakllsch #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
286 1.1 jakllsch #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
287 1.1 jakllsch #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
288 1.1 jakllsch
289 1.1 jakllsch //
290 1.1 jakllsch // Symbol format.
291 1.1 jakllsch //
292 1.1 jakllsch
293 1.1 jakllsch
294 1.1 jakllsch #define IMAGE_SIZEOF_SYMBOL 18
295 1.1 jakllsch
296 1.1 jakllsch //
297 1.1 jakllsch // Section values.
298 1.1 jakllsch //
299 1.1 jakllsch // Symbols have a section number of the section in which they are
300 1.1 jakllsch // defined. Otherwise, section numbers have the following meanings:
301 1.1 jakllsch //
302 1.1 jakllsch
303 1.1 jakllsch #define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common.
304 1.1 jakllsch #define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value.
305 1.1 jakllsch #define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item.
306 1.1 jakllsch
307 1.1 jakllsch //
308 1.1 jakllsch // Type (fundamental) values.
309 1.1 jakllsch //
310 1.1 jakllsch
311 1.1 jakllsch #define IMAGE_SYM_TYPE_NULL 0 // no type.
312 1.1 jakllsch #define IMAGE_SYM_TYPE_VOID 1 //
313 1.1 jakllsch #define IMAGE_SYM_TYPE_CHAR 2 // type character.
314 1.1 jakllsch #define IMAGE_SYM_TYPE_SHORT 3 // type short integer.
315 1.1 jakllsch #define IMAGE_SYM_TYPE_INT 4 //
316 1.1 jakllsch #define IMAGE_SYM_TYPE_LONG 5 //
317 1.1 jakllsch #define IMAGE_SYM_TYPE_FLOAT 6 //
318 1.1 jakllsch #define IMAGE_SYM_TYPE_DOUBLE 7 //
319 1.1 jakllsch #define IMAGE_SYM_TYPE_STRUCT 8 //
320 1.1 jakllsch #define IMAGE_SYM_TYPE_UNION 9 //
321 1.1 jakllsch #define IMAGE_SYM_TYPE_ENUM 10 // enumeration.
322 1.1 jakllsch #define IMAGE_SYM_TYPE_MOE 11 // member of enumeration.
323 1.1 jakllsch #define IMAGE_SYM_TYPE_BYTE 12 //
324 1.1 jakllsch #define IMAGE_SYM_TYPE_WORD 13 //
325 1.1 jakllsch #define IMAGE_SYM_TYPE_UINT 14 //
326 1.1 jakllsch #define IMAGE_SYM_TYPE_DWORD 15 //
327 1.1 jakllsch
328 1.1 jakllsch //
329 1.1 jakllsch // Type (derived) values.
330 1.1 jakllsch //
331 1.1 jakllsch
332 1.1 jakllsch #define IMAGE_SYM_DTYPE_NULL 0 // no derived type.
333 1.1 jakllsch #define IMAGE_SYM_DTYPE_POINTER 1 // pointer.
334 1.1 jakllsch #define IMAGE_SYM_DTYPE_FUNCTION 2 // function.
335 1.1 jakllsch #define IMAGE_SYM_DTYPE_ARRAY 3 // array.
336 1.1 jakllsch
337 1.1 jakllsch //
338 1.1 jakllsch // Storage classes.
339 1.1 jakllsch //
340 1.1 jakllsch
341 1.1 jakllsch #define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1
342 1.1 jakllsch #define IMAGE_SYM_CLASS_NULL 0
343 1.1 jakllsch #define IMAGE_SYM_CLASS_AUTOMATIC 1
344 1.1 jakllsch #define IMAGE_SYM_CLASS_EXTERNAL 2
345 1.1 jakllsch #define IMAGE_SYM_CLASS_STATIC 3
346 1.1 jakllsch #define IMAGE_SYM_CLASS_REGISTER 4
347 1.1 jakllsch #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
348 1.1 jakllsch #define IMAGE_SYM_CLASS_LABEL 6
349 1.1 jakllsch #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
350 1.1 jakllsch #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
351 1.1 jakllsch #define IMAGE_SYM_CLASS_ARGUMENT 9
352 1.1 jakllsch #define IMAGE_SYM_CLASS_STRUCT_TAG 10
353 1.1 jakllsch #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
354 1.1 jakllsch #define IMAGE_SYM_CLASS_UNION_TAG 12
355 1.1 jakllsch #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
356 1.1 jakllsch #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
357 1.1 jakllsch #define IMAGE_SYM_CLASS_ENUM_TAG 15
358 1.1 jakllsch #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
359 1.1 jakllsch #define IMAGE_SYM_CLASS_REGISTER_PARAM 17
360 1.1 jakllsch #define IMAGE_SYM_CLASS_BIT_FIELD 18
361 1.1 jakllsch #define IMAGE_SYM_CLASS_BLOCK 100
362 1.1 jakllsch #define IMAGE_SYM_CLASS_FUNCTION 101
363 1.1 jakllsch #define IMAGE_SYM_CLASS_END_OF_STRUCT 102
364 1.1 jakllsch #define IMAGE_SYM_CLASS_FILE 103
365 1.1 jakllsch // new
366 1.1 jakllsch #define IMAGE_SYM_CLASS_SECTION 104
367 1.1 jakllsch #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
368 1.1 jakllsch
369 1.1 jakllsch // type packing constants
370 1.1 jakllsch
371 1.1 jakllsch #define N_BTMASK 017
372 1.1 jakllsch #define N_TMASK 060
373 1.1 jakllsch #define N_TMASK1 0300
374 1.1 jakllsch #define N_TMASK2 0360
375 1.1 jakllsch #define N_BTSHFT 4
376 1.1 jakllsch #define N_TSHIFT 2
377 1.1 jakllsch
378 1.1 jakllsch // MACROS
379 1.1 jakllsch
380 1.1 jakllsch //
381 1.1 jakllsch // Communal selection types.
382 1.1 jakllsch //
383 1.1 jakllsch
384 1.1 jakllsch #define IMAGE_COMDAT_SELECT_NODUPLICATES 1
385 1.1 jakllsch #define IMAGE_COMDAT_SELECT_ANY 2
386 1.1 jakllsch #define IMAGE_COMDAT_SELECT_SAME_SIZE 3
387 1.1 jakllsch #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
388 1.1 jakllsch #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
389 1.1 jakllsch
390 1.1 jakllsch #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
391 1.1 jakllsch #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
392 1.1 jakllsch #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
393 1.1 jakllsch
394 1.1 jakllsch
395 1.1 jakllsch //
396 1.1 jakllsch // Relocation format.
397 1.1 jakllsch //
398 1.1 jakllsch
399 1.1 jakllsch typedef struct _IMAGE_RELOCATION {
400 1.1 jakllsch UINT32 VirtualAddress;
401 1.1 jakllsch UINT32 SymbolTableIndex;
402 1.1 jakllsch UINT16 Type;
403 1.1 jakllsch } IMAGE_RELOCATION;
404 1.1 jakllsch
405 1.1 jakllsch #define IMAGE_SIZEOF_RELOCATION 10
406 1.1 jakllsch
407 1.1 jakllsch //
408 1.1 jakllsch // I386 relocation types.
409 1.1 jakllsch //
410 1.1 jakllsch
411 1.1 jakllsch #define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary
412 1.1 jakllsch #define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address
413 1.1 jakllsch #define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address
414 1.1 jakllsch #define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address
415 1.1 jakllsch #define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included
416 1.1 jakllsch #define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
417 1.1 jakllsch #define IMAGE_REL_I386_SECTION 012
418 1.1 jakllsch #define IMAGE_REL_I386_SECREL 013
419 1.1 jakllsch #define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address
420 1.1 jakllsch
421 1.1 jakllsch //
422 1.1 jakllsch // MIPS relocation types.
423 1.1 jakllsch //
424 1.1 jakllsch
425 1.1 jakllsch #define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary
426 1.1 jakllsch #define IMAGE_REL_MIPS_REFHALF 01
427 1.1 jakllsch #define IMAGE_REL_MIPS_REFWORD 02
428 1.1 jakllsch #define IMAGE_REL_MIPS_JMPADDR 03
429 1.1 jakllsch #define IMAGE_REL_MIPS_REFHI 04
430 1.1 jakllsch #define IMAGE_REL_MIPS_REFLO 05
431 1.1 jakllsch #define IMAGE_REL_MIPS_GPREL 06
432 1.1 jakllsch #define IMAGE_REL_MIPS_LITERAL 07
433 1.1 jakllsch #define IMAGE_REL_MIPS_SECTION 012
434 1.1 jakllsch #define IMAGE_REL_MIPS_SECREL 013
435 1.1 jakllsch #define IMAGE_REL_MIPS_REFWORDNB 042
436 1.1 jakllsch #define IMAGE_REL_MIPS_PAIR 045
437 1.1 jakllsch
438 1.1 jakllsch //
439 1.1 jakllsch // Alpha Relocation types.
440 1.1 jakllsch //
441 1.1 jakllsch
442 1.1 jakllsch #define IMAGE_REL_ALPHA_ABSOLUTE 0x0
443 1.1 jakllsch #define IMAGE_REL_ALPHA_REFLONG 0x1
444 1.1 jakllsch #define IMAGE_REL_ALPHA_REFQUAD 0x2
445 1.1 jakllsch #define IMAGE_REL_ALPHA_GPREL32 0x3
446 1.1 jakllsch #define IMAGE_REL_ALPHA_LITERAL 0x4
447 1.1 jakllsch #define IMAGE_REL_ALPHA_LITUSE 0x5
448 1.1 jakllsch #define IMAGE_REL_ALPHA_GPDISP 0x6
449 1.1 jakllsch #define IMAGE_REL_ALPHA_BRADDR 0x7
450 1.1 jakllsch #define IMAGE_REL_ALPHA_HINT 0x8
451 1.1 jakllsch #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9
452 1.1 jakllsch #define IMAGE_REL_ALPHA_REFHI 0xA
453 1.1 jakllsch #define IMAGE_REL_ALPHA_REFLO 0xB
454 1.1 jakllsch #define IMAGE_REL_ALPHA_PAIR 0xC
455 1.1 jakllsch #define IMAGE_REL_ALPHA_MATCH 0xD
456 1.1 jakllsch #define IMAGE_REL_ALPHA_SECTION 0xE
457 1.1 jakllsch #define IMAGE_REL_ALPHA_SECREL 0xF
458 1.1 jakllsch #define IMAGE_REL_ALPHA_REFLONGNB 0x10
459 1.1 jakllsch
460 1.1 jakllsch //
461 1.1 jakllsch // IBM PowerPC relocation types.
462 1.1 jakllsch //
463 1.1 jakllsch
464 1.1 jakllsch #define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP
465 1.1 jakllsch #define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address
466 1.1 jakllsch #define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address
467 1.1 jakllsch #define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute)
468 1.1 jakllsch #define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address
469 1.1 jakllsch #define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword)
470 1.1 jakllsch #define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative)
471 1.1 jakllsch #define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative)
472 1.1 jakllsch #define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base
473 1.1 jakllsch #define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword)
474 1.1 jakllsch
475 1.1 jakllsch #define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base
476 1.1 jakllsch #define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr)
477 1.1 jakllsch #define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number
478 1.1 jakllsch #define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code
479 1.1 jakllsch #define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction
480 1.1 jakllsch
481 1.1 jakllsch #define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type
482 1.1 jakllsch
483 1.1 jakllsch // Flag bits in IMAGE_RELOCATION.TYPE
484 1.1 jakllsch
485 1.1 jakllsch #define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it
486 1.1 jakllsch #define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken
487 1.1 jakllsch #define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken
488 1.1 jakllsch #define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc)
489 1.1 jakllsch
490 1.1 jakllsch //
491 1.1 jakllsch // Based relocation format.
492 1.1 jakllsch //
493 1.1 jakllsch
494 1.1 jakllsch typedef struct _IMAGE_BASE_RELOCATION {
495 1.1 jakllsch UINT32 VirtualAddress;
496 1.1 jakllsch UINT32 SizeOfBlock;
497 1.1 jakllsch // UINT16 TypeOffset[1];
498 1.1 jakllsch } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
499 1.1 jakllsch
500 1.1 jakllsch #define IMAGE_SIZEOF_BASE_RELOCATION 8
501 1.1 jakllsch
502 1.1 jakllsch //
503 1.1 jakllsch // Based relocation types.
504 1.1 jakllsch //
505 1.1 jakllsch
506 1.1 jakllsch #define IMAGE_REL_BASED_ABSOLUTE 0
507 1.1 jakllsch #define IMAGE_REL_BASED_HIGH 1
508 1.1 jakllsch #define IMAGE_REL_BASED_LOW 2
509 1.1 jakllsch #define IMAGE_REL_BASED_HIGHLOW 3
510 1.1 jakllsch #define IMAGE_REL_BASED_HIGHADJ 4
511 1.1 jakllsch #define IMAGE_REL_BASED_MIPS_JMPADDR 5
512 1.1 jakllsch #define IMAGE_REL_BASED_IA64_IMM64 9
513 1.1 jakllsch #define IMAGE_REL_BASED_DIR64 10
514 1.1 jakllsch
515 1.1 jakllsch //
516 1.1 jakllsch // Line number format.
517 1.1 jakllsch //
518 1.1 jakllsch
519 1.1 jakllsch typedef struct _IMAGE_LINENUMBER {
520 1.1 jakllsch union {
521 1.1 jakllsch UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
522 1.1 jakllsch UINT32 VirtualAddress; // Virtual address of line number.
523 1.1 jakllsch } Type;
524 1.1 jakllsch UINT16 Linenumber; // Line number.
525 1.1 jakllsch } IMAGE_LINENUMBER;
526 1.1 jakllsch
527 1.1 jakllsch #define IMAGE_SIZEOF_LINENUMBER 6
528 1.1 jakllsch
529 1.1 jakllsch //
530 1.1 jakllsch // Archive format.
531 1.1 jakllsch //
532 1.1 jakllsch
533 1.1 jakllsch #define IMAGE_ARCHIVE_START_SIZE 8
534 1.1 jakllsch #define IMAGE_ARCHIVE_START "!<arch>\n"
535 1.1 jakllsch #define IMAGE_ARCHIVE_END "`\n"
536 1.1 jakllsch #define IMAGE_ARCHIVE_PAD "\n"
537 1.1 jakllsch #define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
538 1.1 jakllsch #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
539 1.1 jakllsch
540 1.1 jakllsch typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
541 1.1 jakllsch UINT8 Name[16]; // File member name - `/' terminated.
542 1.1 jakllsch UINT8 Date[12]; // File member date - decimal.
543 1.1 jakllsch UINT8 UserID[6]; // File member user id - decimal.
544 1.1 jakllsch UINT8 GroupID[6]; // File member group id - decimal.
545 1.1 jakllsch UINT8 Mode[8]; // File member mode - octal.
546 1.1 jakllsch UINT8 Size[10]; // File member size - decimal.
547 1.1 jakllsch UINT8 EndHeader[2]; // String to end header.
548 1.1 jakllsch } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
549 1.1 jakllsch
550 1.1 jakllsch #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
551 1.1 jakllsch
552 1.1 jakllsch //
553 1.1 jakllsch // DLL support.
554 1.1 jakllsch //
555 1.1 jakllsch
556 1.1 jakllsch //
557 1.1 jakllsch // Export Format
558 1.1 jakllsch //
559 1.1 jakllsch
560 1.1 jakllsch typedef struct _IMAGE_EXPORT_DIRECTORY {
561 1.1 jakllsch UINT32 Characteristics;
562 1.1 jakllsch UINT32 TimeDateStamp;
563 1.1 jakllsch UINT16 MajorVersion;
564 1.1 jakllsch UINT16 MinorVersion;
565 1.1 jakllsch UINT32 Name;
566 1.1 jakllsch UINT32 Base;
567 1.1 jakllsch UINT32 NumberOfFunctions;
568 1.1 jakllsch UINT32 NumberOfNames;
569 1.1 jakllsch UINT32 AddressOfFunctions;
570 1.1 jakllsch UINT32 AddressOfNames;
571 1.1 jakllsch UINT32 AddressOfNameOrdinals;
572 1.1 jakllsch } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
573 1.1 jakllsch
574 1.1 jakllsch //
575 1.1 jakllsch // Import Format
576 1.1 jakllsch //
577 1.1 jakllsch
578 1.1 jakllsch typedef struct _IMAGE_IMPORT_BY_NAME {
579 1.1 jakllsch UINT16 Hint;
580 1.1 jakllsch UINT8 Name[1];
581 1.1 jakllsch } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
582 1.1 jakllsch
583 1.1 jakllsch typedef struct _IMAGE_THUNK_DATA {
584 1.1 jakllsch union {
585 1.1 jakllsch UINT32 Function;
586 1.1 jakllsch UINT32 Ordinal;
587 1.1 jakllsch PIMAGE_IMPORT_BY_NAME AddressOfData;
588 1.1 jakllsch } u1;
589 1.1 jakllsch } IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
590 1.1 jakllsch
591 1.1 jakllsch #define IMAGE_ORDINAL_FLAG 0x80000000
592 1.1 jakllsch #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
593 1.1 jakllsch #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
594 1.1 jakllsch
595 1.1 jakllsch typedef struct _IMAGE_IMPORT_DESCRIPTOR {
596 1.1 jakllsch UINT32 Characteristics;
597 1.1 jakllsch UINT32 TimeDateStamp;
598 1.1 jakllsch UINT32 ForwarderChain;
599 1.1 jakllsch UINT32 Name;
600 1.1 jakllsch PIMAGE_THUNK_DATA FirstThunk;
601 1.1 jakllsch } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
602 1.1 jakllsch
603 1.1 jakllsch #endif
604