source: trunk/tools/common/PEexe.h@ 10367

Last change on this file since 10367 was 8003, checked in by bird, 24 years ago

New kFile* classes; now in sync with os2tools.

File size: 22.7 KB
Line 
1/* $Id: PEexe.h,v 1.1 2002-02-24 02:47:23 bird Exp $
2 *
3 * PE DEFINITIONS AND DECLARATIONS.
4 * --------------------------------
5 *
6 * Copyright Eric Youngdale (1994)
7 * Copyright knut st. osmundsen (2001) (I've messed them up ;-)
8 *
9 */
10
11#ifndef _peexe_h_
12#define _peexe_h_
13
14#define IMAGE_NT_SIGNATURE 0x00004550 /* PE00 */
15
16/**
17 * The file header.
18 */
19typedef struct _IMAGE_FILE_HEADER
20{
21 unsigned short Machine;
22 unsigned short NumberOfSections;
23 unsigned long TimeDateStamp;
24 unsigned long PointerToSymbolTable;
25 unsigned long NumberOfSymbols;
26 unsigned short SizeOfOptionalHeader;
27 unsigned short Characteristics;
28} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
29
30#define IMAGE_SIZEOF_FILE_HEADER 20
31
32/*
33 * These defines describe the meanings of the bits in the Characteristics field
34 */
35#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */
36#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
37#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
38#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
39#define IMAGE_FILE_16BIT_MACHINE 0x0040
40#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
41#define IMAGE_FILE_32BIT_MACHINE 0x0100
42#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
43#define IMAGE_FILE_SYSTEM 0x1000
44#define IMAGE_FILE_DLL 0x2000
45#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
46
47/*
48 * These are the settings of the Machine field.
49 */
50#define IMAGE_FILE_MACHINE_UNKNOWN 0
51#define IMAGE_FILE_MACHINE_I860 0x14d
52#define IMAGE_FILE_MACHINE_I386 0x14c
53#define IMAGE_FILE_MACHINE_R3000 0x162
54#define IMAGE_FILE_MACHINE_R4000 0x166
55#define IMAGE_FILE_MACHINE_R10000 0x168
56#define IMAGE_FILE_MACHINE_ALPHA 0x184
57#define IMAGE_FILE_MACHINE_POWERPC 0x1F0
58
59
60/**
61 * This struct is used in the optional header.
62 */
63typedef struct _IMAGE_DATA_DIRECTORY
64{
65 unsigned long VirtualAddress;
66 unsigned long Size;
67} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
68
69#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
70
71
72/*
73 * Optional coff header - used by NT to provide additional information.
74 * (-Yeah, very optional.. in NT it's everything but optional :-)
75 * - And the one designing this struct never used it, or perhaps he had
76 * a 300 columns editor ;-) Membernames are far to long! )
77 */
78typedef struct _IMAGE_OPTIONAL_HEADER
79{
80 /*
81 * Standard fields.
82 */
83 unsigned short Magic;
84 unsigned char MajorLinkerVersion;
85 unsigned char MinorLinkerVersion;
86 unsigned long SizeOfCode;
87 unsigned long SizeOfInitializedData;
88 unsigned long SizeOfUninitializedData;
89 unsigned long AddressOfEntryPoint;
90 unsigned long BaseOfCode;
91 unsigned long BaseOfData;
92
93 /*
94 * NT additional fields.
95 */
96 unsigned long ImageBase;
97 unsigned long SectionAlignment;
98 unsigned long FileAlignment;
99 unsigned short MajorOperatingSystemVersion;
100 unsigned short MinorOperatingSystemVersion;
101 unsigned short MajorImageVersion;
102 unsigned short MinorImageVersion;
103 unsigned short MajorSubsystemVersion;
104 unsigned short MinorSubsystemVersion;
105 unsigned long Reserved1;
106 unsigned long SizeOfImage;
107 unsigned long SizeOfHeaders;
108 unsigned long CheckSum;
109 unsigned short Subsystem;
110 unsigned short DllCharacteristics;
111 unsigned long SizeOfStackReserve;
112 unsigned long SizeOfStackCommit;
113 unsigned long SizeOfHeapReserve;
114 unsigned long SizeOfHeapCommit;
115 unsigned long LoaderFlags;
116 unsigned long NumberOfRvaAndSizes;
117 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
118} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
119
120/* Possible Magic values */
121#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
122#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
123
124/* These are indexes into the DataDirectory array */
125#define IMAGE_FILE_EXPORT_DIRECTORY 0
126#define IMAGE_FILE_IMPORT_DIRECTORY 1
127#define IMAGE_FILE_RESOURCE_DIRECTORY 2
128#define IMAGE_FILE_EXCEPTION_DIRECTORY 3
129#define IMAGE_FILE_SECURITY_DIRECTORY 4
130#define IMAGE_FILE_BASE_RELOCATION_TABLE 5
131#define IMAGE_FILE_DEBUG_DIRECTORY 6
132#define IMAGE_FILE_DESCRIPTION_STRING 7
133#define IMAGE_FILE_MACHINE_VALUE 8 /* Mips */
134#define IMAGE_FILE_THREAD_LOCAL_STORAGE 9
135#define IMAGE_FILE_CALLBACK_DIRECTORY 10
136
137/* Directory Entries, indices into the DataDirectory array */
138
139#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
140#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
141#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
142#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
143#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
144#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
145#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
146#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
147#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 /* (MIPS GP) */
148#define IMAGE_DIRECTORY_ENTRY_TLS 9
149#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
150#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
151#define IMAGE_DIRECTORY_ENTRY_IAT 12 /* Import Address Table */
152#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
153#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
154
155/* Subsystem Values */
156#define IMAGE_SUBSYSTEM_UNKNOWN 0
157#define IMAGE_SUBSYSTEM_NATIVE 1
158#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 /* Windows GUI subsystem */
159#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 /* Windows character subsystem*/
160#define IMAGE_SUBSYSTEM_OS2_CUI 5
161#define IMAGE_SUBSYSTEM_POSIX_CUI 7
162#define IMAGE_SUBSYSTEM_WINDOWCE 8
163
164/*
165 * Sum header - all NT headers in one struct...
166 */
167typedef struct _IMAGE_NT_HEADERS
168{
169 unsigned long Signature;
170 IMAGE_FILE_HEADER FileHeader;
171 IMAGE_OPTIONAL_HEADER OptionalHeader;
172} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
173
174
175#define PE_HEADER(module) \
176 ((IMAGE_NT_HEADERS*)((PUCHAR)(module) + \
177 (((IMAGE_DOS_HEADER*)(module))->e_lfanew)))
178
179#define PE_SECTIONS(module) \
180 ((IMAGE_SECTION_HEADER*)((PUCHAR)&PE_HEADER(module)->OptionalHeader + \
181 PE_HEADER(module)->FileHeader.SizeOfOptionalHeader))
182
183#define RVA_PTR(module,field) ((PUCHAR)(module) + PE_HEADER(module)->field)
184
185
186/*
187 * Section header format
188 */
189#define IMAGE_SIZEOF_SHORT_NAME 8
190typedef struct _IMAGE_SECTION_HEADER
191{
192 char Name[IMAGE_SIZEOF_SHORT_NAME];
193 union
194 {
195 unsigned long PhysicalAddress;
196 unsigned long VirtualSize;
197 } Misc;
198 unsigned long VirtualAddress;
199 unsigned long SizeOfRawData;
200 unsigned long PointerToRawData;
201 unsigned long PointerToRelocations;
202 unsigned long PointerToLinenumbers;
203 unsigned short NumberOfRelocations;
204 unsigned short NumberOfLinenumbers;
205 unsigned long Characteristics;
206} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
207
208#define IMAGE_SIZEOF_SECTION_HEADER 40
209
210/* These defines are for the Characteristics bitfield. */
211/* #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved */
212/* #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved */
213/* #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved */
214/* #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved */
215/* #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 - Reserved */
216/* #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved */
217#define IMAGE_SCN_CNT_CODE 0x00000020
218#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
219#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
220#define IMAGE_SCN_LNK_OTHER 0x00000100
221#define IMAGE_SCN_LNK_INFO 0x00000200
222/* #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved */
223#define IMAGE_SCN_LNK_REMOVE 0x00000800
224#define IMAGE_SCN_LNK_COMDAT 0x00001000
225/* 0x00002000 - Reserved */
226/* #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete */
227#define IMAGE_SCN_MEM_FARDATA 0x00008000
228/* #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete */
229#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
230#define IMAGE_SCN_MEM_16BIT 0x00020000
231#define IMAGE_SCN_MEM_LOCKED 0x00040000
232#define IMAGE_SCN_MEM_PRELOAD 0x00080000
233#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
234#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
235#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
236#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
237#define IMAGE_SCN_ALIGN_16BYTES 0x00500000/* Default */
238#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
239#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
240/* 0x00800000 - Unused */
241#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
242#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
243#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
244#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
245#define IMAGE_SCN_MEM_SHARED 0x10000000
246#define IMAGE_SCN_MEM_EXECUTE 0x20000000
247#define IMAGE_SCN_MEM_READ 0x40000000
248#define IMAGE_SCN_MEM_WRITE 0x80000000
249
250
251/**
252 * Import name entry
253 */
254typedef struct _IMAGE_IMPORT_BY_NAME
255{
256 unsigned short Hint;
257 char Name[1];
258} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
259
260
261/**
262 * Import thunk
263 */
264typedef struct _IMAGE_THUNK_DATA
265{
266 union
267 {
268 char * ForwarderString;
269 void * Function;
270 unsigned long Ordinal;
271 PIMAGE_IMPORT_BY_NAME AddressOfData;
272 } u1;
273} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
274
275
276/**
277 * Import module directory
278 */
279typedef struct _IMAGE_IMPORT_DESCRIPTOR
280{
281 union
282 {
283 unsigned long Characteristics; /* 0 for terminating null import descriptor */
284 PIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */
285 } u;
286 unsigned long TimeDateStamp; /* 0 if not bound,
287 * -1 if bound, and real date\time stamp
288 * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
289 * (new BIND)
290 * otherwise date/time stamp of DLL bound to
291 * (Old BIND)
292 */
293 unsigned long ForwarderChain; /* -1 if no forwarders */
294 unsigned long Name;
295 /* RVA to IAT (if bound this IAT has actual addresses) */
296 PIMAGE_THUNK_DATA FirstThunk;
297} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
298
299#define IMAGE_ORDINAL_FLAG 0x80000000
300#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
301#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
302
303
304
305/**
306 * Export module directory
307 */
308typedef struct _IMAGE_EXPORT_DIRECTORY
309{
310 unsigned long Characteristics;
311 unsigned long TimeDateStamp;
312 unsigned short MajorVersion;
313 unsigned short MinorVersion;
314 unsigned long Name;
315 unsigned long Base;
316 unsigned long NumberOfFunctions;
317 unsigned long NumberOfNames;
318 unsigned long **AddressOfFunctions;
319 unsigned long **AddressOfNames;
320 unsigned short**AddressOfNameOrdinals;
321/* u_char ModuleName[1]; */
322} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
323
324
325/**
326 * Import directory.
327 */
328typedef struct tagImportDirectory
329{
330 unsigned long dwRVAFunctionNameList;
331 unsigned long dwUseless1;
332 unsigned long dwUseless2;
333 unsigned long dwRVAModuleName;
334 unsigned long dwRVAFunctionAddressList;
335} IMAGE_IMPORT_MODULE_DIRECTORY, * PIMAGE_IMPORT_MODULE_DIRECTORY;
336
337
338/**
339 * Resource directory stuff
340 */
341typedef struct _IMAGE_RESOURCE_DIRECTORY
342{
343 unsigned long Characteristics;
344 unsigned long TimeDateStamp;
345 unsigned short MajorVersion;
346 unsigned short MinorVersion;
347 unsigned short NumberOfNamedEntries;
348 unsigned short NumberOfIdEntries;
349 /* IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */
350} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
351
352#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
353#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
354
355typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
356{
357 union
358 {
359 struct
360 {
361 unsigned NameOffset:31;
362 unsigned NameIsString:1;
363 } s;
364 unsigned long Name;
365 unsigned short Id;
366 } u1;
367 union
368 {
369 unsigned long OffsetToData;
370 struct
371 {
372 unsigned OffsetToDirectory:31;
373 unsigned DataIsDirectory:1;
374 } s;
375 } u2;
376} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
377
378
379typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING
380{
381 unsigned short Length;
382 char NameString[1];
383} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
384
385typedef struct _IMAGE_RESOURCE_DIR_STRING_U
386{
387 unsigned short Length;
388 unsigned short NameString[1];
389} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
390
391typedef struct _IMAGE_RESOURCE_DATA_ENTRY
392{
393 unsigned long OffsetToData;
394 unsigned long Size;
395 unsigned long CodePage;
396 unsigned long ResourceHandle;
397} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
398
399
400/**
401 * Message Resource Stuff
402 */
403typedef struct tagMESSAGE_RESOURCE_ENTRY {
404 unsigned short Length;
405 unsigned short Flags;
406 char Text[1];
407} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
408#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
409#define MESSAGE_RESOURCE_UNICODE 0x0001
410
411typedef struct tagMESSAGE_RESOURCE_BLOCK {
412 unsigned long LowId;
413 unsigned long HighId;
414 unsigned long OffsetToEntries;
415} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
416
417typedef struct tagMESSAGE_RESOURCE_DATA {
418 unsigned long NumberOfBlocks;
419 MESSAGE_RESOURCE_BLOCK Blocks[1];
420} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
421
422
423/**
424 * Base relocations (aka fixups)
425 */
426typedef struct _IMAGE_BASE_RELOCATION
427{
428 unsigned long VirtualAddress;
429 unsigned long SizeOfBlock;
430 unsigned short TypeOffset[1];
431} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
432
433/* generic relocation types */
434#define IMAGE_REL_BASED_ABSOLUTE 0
435#define IMAGE_REL_BASED_HIGH 1
436#define IMAGE_REL_BASED_LOW 2
437#define IMAGE_REL_BASED_HIGHLOW 3
438#define IMAGE_REL_BASED_HIGHADJ 4
439#define IMAGE_REL_BASED_MIPS_JMPADDR 5
440#define IMAGE_REL_BASED_SECTION 6
441#define IMAGE_REL_BASED_REL 7
442#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
443#define IMAGE_REL_BASED_IA64_IMM64 9 /* yes, 9 too */
444#define IMAGE_REL_BASED_DIR64 10
445#define IMAGE_REL_BASED_HIGH3ADJ 11
446
447/* I386 relocation types */
448#define IMAGE_REL_I386_ABSOLUTE 0
449#define IMAGE_REL_I386_DIR16 1
450#define IMAGE_REL_I386_REL16 2
451#define IMAGE_REL_I386_DIR 6
452#define IMAGE_REL_I386_DIR32NB 7
453#define IMAGE_REL_I386_SEG12 9
454#define IMAGE_REL_I386_SECTION 10
455#define IMAGE_REL_I386_SECREL 11
456#define IMAGE_REL_I386_REL 20
457
458/* MIPS relocation types */
459#define IMAGE_REL_MIPS_ABSOLUTE 0x0000
460#define IMAGE_REL_MIPS_REFHALF 0x0001
461#define IMAGE_REL_MIPS_REFWORD 0x0002
462#define IMAGE_REL_MIPS_JMPADDR 0x0003
463#define IMAGE_REL_MIPS_REFHI 0x0004
464#define IMAGE_REL_MIPS_REFLO 0x0005
465#define IMAGE_REL_MIPS_GPREL 0x0006
466#define IMAGE_REL_MIPS_LITERAL 0x0007
467#define IMAGE_REL_MIPS_SECTION 0x000A
468#define IMAGE_REL_MIPS_SECREL 0x000B
469#define IMAGE_REL_MIPS_SECRELLO 0x000C
470#define IMAGE_REL_MIPS_SECRELHI 0x000D
471#define IMAGE_REL_MIPS_JMPADDR16 0x0010
472#define IMAGE_REL_MIPS_REFWORDNB 0x0022
473#define IMAGE_REL_MIPS_PAIR 0x0025
474
475/* ALPHA relocation types */
476#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
477#define IMAGE_REL_ALPHA_REFLONG 0x0001
478#define IMAGE_REL_ALPHA_REFQUAD 0x0002
479#define IMAGE_REL_ALPHA_GPREL 0x0003
480#define IMAGE_REL_ALPHA_LITERAL 0x0004
481#define IMAGE_REL_ALPHA_LITUSE 0x0005
482#define IMAGE_REL_ALPHA_GPDISP 0x0006
483#define IMAGE_REL_ALPHA_BRADDR 0x0007
484#define IMAGE_REL_ALPHA_HINT 0x0008
485#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
486#define IMAGE_REL_ALPHA_REFHI 0x000A
487#define IMAGE_REL_ALPHA_REFLO 0x000B
488#define IMAGE_REL_ALPHA_PAIR 0x000C
489#define IMAGE_REL_ALPHA_MATCH 0x000D
490#define IMAGE_REL_ALPHA_SECTION 0x000E
491#define IMAGE_REL_ALPHA_SECREL 0x000F
492#define IMAGE_REL_ALPHA_REFLONGNB 0x0010
493#define IMAGE_REL_ALPHA_SECRELLO 0x0011
494#define IMAGE_REL_ALPHA_SECRELHI 0x0012
495#define IMAGE_REL_ALPHA_REFQ3 0x0013
496#define IMAGE_REL_ALPHA_REFQ2 0x0014
497#define IMAGE_REL_ALPHA_REFQ1 0x0015
498#define IMAGE_REL_ALPHA_GPRELLO 0x0016
499#define IMAGE_REL_ALPHA_GPRELHI 0x0017
500
501/* PowerPC relocation types */
502#define IMAGE_REL_PPC_ABSOLUTE 0x0000
503#define IMAGE_REL_PPC_ADDR64 0x0001
504#define IMAGE_REL_PPC_ADDR 0x0002
505#define IMAGE_REL_PPC_ADDR24 0x0003
506#define IMAGE_REL_PPC_ADDR16 0x0004
507#define IMAGE_REL_PPC_ADDR14 0x0005
508#define IMAGE_REL_PPC_REL24 0x0006
509#define IMAGE_REL_PPC_REL14 0x0007
510#define IMAGE_REL_PPC_TOCREL16 0x0008
511#define IMAGE_REL_PPC_TOCREL14 0x0009
512#define IMAGE_REL_PPC_ADDR32NB 0x000A
513#define IMAGE_REL_PPC_SECREL 0x000B
514#define IMAGE_REL_PPC_SECTION 0x000C
515#define IMAGE_REL_PPC_IFGLUE 0x000D
516#define IMAGE_REL_PPC_IMGLUE 0x000E
517#define IMAGE_REL_PPC_SECREL16 0x000F
518#define IMAGE_REL_PPC_REFHI 0x0010
519#define IMAGE_REL_PPC_REFLO 0x0011
520#define IMAGE_REL_PPC_PAIR 0x0012
521#define IMAGE_REL_PPC_SECRELLO 0x0013
522#define IMAGE_REL_PPC_SECRELHI 0x0014
523#define IMAGE_REL_PPC_GPREL 0x0015
524#define IMAGE_REL_PPC_TYPEMASK 0x00FF
525/* modifier bits */
526#define IMAGE_REL_PPC_NEG 0x0100
527#define IMAGE_REL_PPC_BRTAKEN 0x0200
528#define IMAGE_REL_PPC_BRNTAKEN 0x0400
529#define IMAGE_REL_PPC_TOCDEFN 0x0800
530
531/* SH3 ? relocation type */
532#define IMAGE_REL_SH3_ABSOLUTE 0x0000
533#define IMAGE_REL_SH3_DIRECT16 0x0001
534#define IMAGE_REL_SH3_DIRECT 0x0002
535#define IMAGE_REL_SH3_DIRECT8 0x0003
536#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004
537#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005
538#define IMAGE_REL_SH3_DIRECT4 0x0006
539#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007
540#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008
541#define IMAGE_REL_SH3_PCREL8_WORD 0x0009
542#define IMAGE_REL_SH3_PCREL8_LONG 0x000A
543#define IMAGE_REL_SH3_PCREL12_WORD 0x000B
544#define IMAGE_REL_SH3_STARTOF_SECTION 0x000C
545#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D
546#define IMAGE_REL_SH3_SECTION 0x000E
547#define IMAGE_REL_SH3_SECREL 0x000F
548#define IMAGE_REL_SH3_DIRECT32_NB 0x0010
549
550/* ARM (Archimedes?) relocation types */
551#define IMAGE_REL_ARM_ABSOLUTE 0x0000
552#define IMAGE_REL_ARM_ADDR 0x0001
553#define IMAGE_REL_ARM_ADDR32NB 0x0002
554#define IMAGE_REL_ARM_BRANCH24 0x0003
555#define IMAGE_REL_ARM_BRANCH11 0x0004
556#define IMAGE_REL_ARM_SECTION 0x000E
557#define IMAGE_REL_ARM_SECREL 0x000F
558
559/* IA64 relocation types */
560#define IMAGE_REL_IA64_ABSOLUTE 0x0000
561#define IMAGE_REL_IA64_IMM14 0x0001
562#define IMAGE_REL_IA64_IMM22 0x0002
563#define IMAGE_REL_IA64_IMM64 0x0003
564#define IMAGE_REL_IA64_DIR 0x0004
565#define IMAGE_REL_IA64_DIR64 0x0005
566#define IMAGE_REL_IA64_PCREL21B 0x0006
567#define IMAGE_REL_IA64_PCREL21M 0x0007
568#define IMAGE_REL_IA64_PCREL21F 0x0008
569#define IMAGE_REL_IA64_GPREL22 0x0009
570#define IMAGE_REL_IA64_LTOFF22 0x000A
571#define IMAGE_REL_IA64_SECTION 0x000B
572#define IMAGE_REL_IA64_SECREL22 0x000C
573#define IMAGE_REL_IA64_SECREL64I 0x000D
574#define IMAGE_REL_IA64_SECREL 0x000E
575#define IMAGE_REL_IA64_LTOFF64 0x000F
576#define IMAGE_REL_IA64_DIR32NB 0x0010
577#define IMAGE_REL_IA64_RESERVED_11 0x0011
578#define IMAGE_REL_IA64_RESERVED_12 0x0012
579#define IMAGE_REL_IA64_RESERVED_13 0x0013
580#define IMAGE_REL_IA64_RESERVED_14 0x0014
581#define IMAGE_REL_IA64_RESERVED_15 0x0015
582#define IMAGE_REL_IA64_RESERVED_16 0x0016
583#define IMAGE_REL_IA64_ADDEND 0x001F
584
585
586/**
587 * Load Config Directory.
588 */
589typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY
590{
591 unsigned long Characteristics;
592 unsigned long TimeDateStamp;
593 unsigned short MajorVersion;
594 unsigned short MinorVersion;
595 unsigned long GlobalFlagsClear;
596 unsigned long GlobalFlagsSet;
597 unsigned long CriticalSectionDefaultTimeout;
598 unsigned long DeCommitFreeBlockThreshold;
599 unsigned long DeCommitTotalFreeThreshold;
600 void * LockPrefixTable;
601 unsigned long MaximumAllocationSize;
602 unsigned long VirtualMemoryThreshold;
603 unsigned long ProcessHeapFlags;
604 unsigned long Reserved[4];
605} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;
606
607
608/**
609 * TLS Stuff.
610 */
611#ifndef STDCALL
612# define STDCALL
613#endif
614typedef void (* STDCALL PIMAGE_TLS_CALLBACK) (
615 void * DllHandle, unsigned long* Reason, void *Reserved
616);
617
618typedef struct _IMAGE_TLS_DIRECTORY
619{
620 unsigned long StartAddressOfRawData;
621 unsigned long EndAddressOfRawData;
622 unsigned long* AddressOfIndex;
623 PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
624 unsigned long SizeOfZeroFill;
625 unsigned long Characteristics;
626} IMAGE_TLS_DIRECTORY, *PIMAGE_TLS_DIRECTORY;
627
628
629/**
630 * The IMAGE_DEBUG_DIRECTORY data directory points to an array of
631 * these structures.
632 */
633typedef struct _IMAGE_DEBUG_DIRECTORY
634{
635 unsigned long Characteristics;
636 unsigned long TimeDateStamp;
637 unsigned short MajorVersion;
638 unsigned short MinorVersion;
639 unsigned long Type;
640 unsigned long SizeOfData;
641 unsigned long AddressOfRawData;
642 unsigned long PointerToRawData;
643} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
644
645/*
646 * The type field above can take these (plus a few other
647 * irrelevant) values.
648 */
649#define IMAGE_DEBUG_TYPE_UNKNOWN 0
650#define IMAGE_DEBUG_TYPE_COFF 1
651#define IMAGE_DEBUG_TYPE_CODEVIEW 2
652#define IMAGE_DEBUG_TYPE_FPO 3
653#define IMAGE_DEBUG_TYPE_MISC 4
654#define IMAGE_DEBUG_TYPE_EXCEPTION 5
655#define IMAGE_DEBUG_TYPE_FIXUP 6
656#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
657#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
658
659
660/**
661 * This is the structure that appears at the very start of a .DBG file.
662 */
663typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
664{
665 unsigned short Signature;
666 unsigned short Flags;
667 unsigned short Machine;
668 unsigned short Characteristics;
669 unsigned long TimeDateStamp;
670 unsigned long CheckSum;
671 unsigned long ImageBase;
672 unsigned long SizeOfImage;
673 unsigned long NumberOfSections;
674 unsigned long ExportedNamesSize;
675 unsigned long DebugDirectorySize;
676 unsigned long Reserved[3];
677} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
678
679
680#endif
681
Note: See TracBrowser for help on using the repository browser.