~vojtech-horky/helenos/numa

« back to all changes in this revision

Viewing changes to boot/arch/ia64/loader/gefi/inc/ia64/pe.h

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

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