2 * Copyright Eric Youngdale (1994)
9 typedef struct _IMAGE_FILE_HEADER
{
11 WORD NumberOfSections
;
13 DWORD PointerToSymbolTable
;
14 DWORD NumberOfSymbols
;
15 WORD SizeOfOptionalHeader
;
17 } IMAGE_FILE_HEADER
,*LPIMAGE_FILE_HEADER
;
19 #define IMAGE_SIZEOF_FILE_HEADER 20
21 /* These defines describe the meanings of the bits in the Characteristics
24 #define IMAGE_FILE_RELOCS_STRIPPED 1 /* No relocation info */
25 #define IMAGE_FILE_EXECUTABLE_IMAGE 2
26 #define IMAGE_FILE_LINE_NUMS_STRIPPED 4
27 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8
28 #define IMAGE_FILE_16BIT_MACHINE 0x40
29 #define IMAGE_FILE_BYTES_REVERSED_LO 0x80
30 #define IMAGE_FILE_32BIT_MACHINE 0x100
31 #define IMAGE_FILE_DEBUG_STRIPPED 0x200
32 #define IMAGE_FILE_SYSTEM 0x1000
33 #define IMAGE_FILE_DLL 0x2000
34 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
36 /* These are the settings of the Machine field. */
37 #define IMAGE_FILE_MACHINE_UNKNOWN 0
38 #define IMAGE_FILE_MACHINE_I860 0x14d
39 #define IMAGE_FILE_MACHINE_I386 0x14c
40 #define IMAGE_FILE_MACHINE_R3000 0x162
41 #define IMAGE_FILE_MACHINE_R4000 0x166
42 #define IMAGE_FILE_MACHINE_R10000 0x168
43 #define IMAGE_FILE_MACHINE_ALPHA 0x184
44 #define IMAGE_FILE_MACHINE_POWERPC 0x1F0
46 typedef struct _IMAGE_DATA_DIRECTORY
50 } IMAGE_DATA_DIRECTORY
,*LPIMAGE_DATA_DIRECTORY
;
52 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
54 /* Optional coff header - used by NT to provide additional information. */
55 typedef struct _IMAGE_OPTIONAL_HEADER
62 BYTE MajorLinkerVersion
;
63 BYTE MinorLinkerVersion
;
65 DWORD SizeOfInitializedData
;
66 DWORD SizeOfUninitializedData
;
67 DWORD AddressOfEntryPoint
;
72 * NT additional fields.
76 DWORD SectionAlignment
;
78 WORD MajorOperatingSystemVersion
;
79 WORD MinorOperatingSystemVersion
;
80 WORD MajorImageVersion
;
81 WORD MinorImageVersion
;
82 WORD MajorSubsystemVersion
;
83 WORD MinorSubsystemVersion
;
89 WORD DllCharacteristics
;
90 DWORD SizeOfStackReserve
;
91 DWORD SizeOfStackCommit
;
92 DWORD SizeOfHeapReserve
;
93 DWORD SizeOfHeapCommit
;
95 DWORD NumberOfRvaAndSizes
;
96 IMAGE_DATA_DIRECTORY DataDirectory
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
];
97 } IMAGE_OPTIONAL_HEADER
,*LPIMAGE_OPTIONAL_HEADER
;
99 /* These are indexes into the DataDirectory array */
100 #define IMAGE_FILE_EXPORT_DIRECTORY 0
101 #define IMAGE_FILE_IMPORT_DIRECTORY 1
102 #define IMAGE_FILE_RESOURCE_DIRECTORY 2
103 #define IMAGE_FILE_EXCEPTION_DIRECTORY 3
104 #define IMAGE_FILE_SECURITY_DIRECTORY 4
105 #define IMAGE_FILE_BASE_RELOCATION_TABLE 5
106 #define IMAGE_FILE_DEBUG_DIRECTORY 6
107 #define IMAGE_FILE_DESCRIPTION_STRING 7
108 #define IMAGE_FILE_MACHINE_VALUE 8 /* Mips */
109 #define IMAGE_FILE_THREAD_LOCAL_STORAGE 9
110 #define IMAGE_FILE_CALLBACK_DIRECTORY 10
112 /* Directory Entries, indices into the DataDirectory array */
114 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
115 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
116 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
117 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
118 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4
119 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
120 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6
121 #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
122 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 /* (MIPS GP) */
123 #define IMAGE_DIRECTORY_ENTRY_TLS 9
124 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
125 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
126 #define IMAGE_DIRECTORY_ENTRY_IAT 12 /* Import Address Table */
128 /* Subsystem Values */
130 #define IMAGE_SUBSYSTEM_UNKNOWN 0
131 #define IMAGE_SUBSYSTEM_NATIVE 1
132 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 /* Windows GUI subsystem */
133 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 /* Windows character subsystem*/
134 #define IMAGE_SUBSYSTEM_OS2_CUI 5
135 #define IMAGE_SUBSYSTEM_POSIX_CUI 7
137 typedef struct _IMAGE_NT_HEADERS
{
139 IMAGE_FILE_HEADER FileHeader
;
140 IMAGE_OPTIONAL_HEADER OptionalHeader
;
141 } IMAGE_NT_HEADERS
,*LPIMAGE_NT_HEADERS
;
143 /* Section header format */
145 #define IMAGE_SIZEOF_SHORT_NAME 8
147 typedef struct _IMAGE_SECTION_HEADER
{
148 BYTE Name
[IMAGE_SIZEOF_SHORT_NAME
];
150 DWORD PhysicalAddress
;
153 DWORD VirtualAddress
;
155 DWORD PointerToRawData
;
156 DWORD PointerToRelocations
;
157 DWORD PointerToLinenumbers
;
158 WORD NumberOfRelocations
;
159 WORD NumberOfLinenumbers
;
160 DWORD Characteristics
;
161 } IMAGE_SECTION_HEADER
,*LPIMAGE_SECTION_HEADER
;
163 #define IMAGE_SIZEOF_SECTION_HEADER 40
165 /* These defines are for the Characteristics bitfield. */
166 /* #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved */
167 /* #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved */
168 /* #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved */
169 /* #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved */
170 /* #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 - Reserved */
171 /* #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved */
173 #define IMAGE_SCN_CNT_CODE 0x00000020
174 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
175 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
177 #define IMAGE_SCN_LNK_OTHER 0x00000100
178 #define IMAGE_SCN_LNK_INFO 0x00000200
179 /* #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved */
180 #define IMAGE_SCN_LNK_REMOVE 0x00000800
181 #define IMAGE_SCN_LNK_COMDAT 0x00001000
183 /* 0x00002000 - Reserved */
184 /* #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete */
185 #define IMAGE_SCN_MEM_FARDATA 0x00008000
187 /* #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete */
188 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000
189 #define IMAGE_SCN_MEM_16BIT 0x00020000
190 #define IMAGE_SCN_MEM_LOCKED 0x00040000
191 #define IMAGE_SCN_MEM_PRELOAD 0x00080000
193 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000
194 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000
195 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000
196 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000
197 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default */
198 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000
199 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000
200 /* 0x00800000 - Unused */
202 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
205 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
206 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
207 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
208 #define IMAGE_SCN_MEM_SHARED 0x10000000
209 #define IMAGE_SCN_MEM_EXECUTE 0x20000000
210 #define IMAGE_SCN_MEM_READ 0x40000000
211 #define IMAGE_SCN_MEM_WRITE 0x80000000
214 /* Import name entry */
215 typedef struct _IMAGE_IMPORT_BY_NAME
{
218 } IMAGE_IMPORT_BY_NAME
,*LPIMAGE_IMPORT_BY_NAME
;
221 typedef struct _IMAGE_THUNK_DATA
{
223 LPBYTE ForwarderString
;
226 LPIMAGE_IMPORT_BY_NAME AddressOfData
;
228 } IMAGE_THUNK_DATA
,*LPIMAGE_THUNK_DATA
;
230 /* Import module directory */
232 typedef struct _IMAGE_IMPORT_DESCRIPTOR
{
234 DWORD Characteristics
; /* 0 for terminating null import descriptor */
235 LPIMAGE_THUNK_DATA OriginalFirstThunk
; /* RVA to original unbound IAT */
237 DWORD TimeDateStamp
; /* 0 if not bound,
238 * -1 if bound, and real date\time stamp
239 * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
241 * otherwise date/time stamp of DLL bound to
244 DWORD ForwarderChain
; /* -1 if no forwarders */
246 /* RVA to IAT (if bound this IAT has actual addresses) */
247 LPIMAGE_THUNK_DATA FirstThunk
;
248 } IMAGE_IMPORT_DESCRIPTOR
,*LPIMAGE_IMPORT_DESCRIPTOR
;
250 #define IMAGE_ORDINAL_FLAG 0x80000000
251 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
252 #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
254 /* Export module directory */
256 typedef struct _IMAGE_EXPORT_DIRECTORY
{
257 DWORD Characteristics
;
263 DWORD NumberOfFunctions
;
265 LPDWORD
*AddressOfFunctions
;
266 LPDWORD
*AddressOfNames
;
267 LPWORD
*AddressOfNameOrdinals
;
268 /* u_char ModuleName[1]; */
269 } IMAGE_EXPORT_DIRECTORY
,*LPIMAGE_EXPORT_DIRECTORY
;
273 * Resource directory stuff
275 typedef struct _IMAGE_RESOURCE_DIRECTORY
{
276 DWORD Characteristics
;
280 WORD NumberOfNamedEntries
;
281 WORD NumberOfIdEntries
;
282 /* IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */
283 } IMAGE_RESOURCE_DIRECTORY
,*LPIMAGE_RESOURCE_DIRECTORY
;
285 #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
286 #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
288 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
{
292 DWORD NameIsString
:1;
300 DWORD OffsetToDirectory
:31;
301 DWORD DataIsDirectory
:1;
304 } IMAGE_RESOURCE_DIRECTORY_ENTRY
,*LPIMAGE_RESOURCE_DIRECTORY_ENTRY
;
307 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING
{
309 CHAR NameString
[ 1 ];
310 } IMAGE_RESOURCE_DIRECTORY_STRING
,*LPIMAGE_RESOURCE_DIRECTORY_STRING
;
312 typedef struct _IMAGE_RESOURCE_DIR_STRING_U
{
314 WCHAR NameString
[ 1 ];
315 } IMAGE_RESOURCE_DIR_STRING_U
,*LPIMAGE_RESOURCE_DIR_STRING_U
;
317 typedef struct _IMAGE_RESOURCE_DATA_ENTRY
{
322 } IMAGE_RESOURCE_DATA_ENTRY
,*LPIMAGE_RESOURCE_DATA_ENTRY
;
324 typedef struct _IMAGE_BASE_RELOCATION
326 DWORD VirtualAddress
;
329 } IMAGE_BASE_RELOCATION
,*LPIMAGE_BASE_RELOCATION
;
331 typedef struct _IMAGE_DEBUG_DIRECTORY
{
332 DWORD Characteristics
;
338 DWORD AddressOfRawData
;
339 DWORD PointerToRawData
;
340 } IMAGE_DEBUG_DIRECTORY
,*LPIMAGE_DEBUG_DIRECTORY
;
342 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY
{
343 DWORD Characteristics
;
347 DWORD GlobalFlagsClear
;
348 DWORD GlobalFlagsSet
;
349 DWORD CriticalSectionDefaultTimeout
;
350 DWORD DeCommitFreeBlockThreshold
;
351 DWORD DeCommitTotalFreeThreshold
;
352 LPVOID LockPrefixTable
;
353 DWORD MaximumAllocationSize
;
354 DWORD VirtualMemoryThreshold
;
355 DWORD ProcessHeapFlags
;
357 } IMAGE_LOAD_CONFIG_DIRECTORY
,*LPIMAGE_LOAD_CONFIG_DIRECTORY
;
359 typedef VOID (*LPIMAGE_TLS_CALLBACK
)(
360 LPVOID DllHandle
,DWORD Reason
,LPVOID Reserved
363 typedef struct _IMAGE_TLS_DIRECTORY
{
364 DWORD StartAddressOfRawData
;
365 DWORD EndAddressOfRawData
;
366 LPDWORD AddressOfIndex
;
367 LPIMAGE_TLS_CALLBACK
*AddressOfCallBacks
;
368 DWORD SizeOfZeroFill
;
369 DWORD Characteristics
;
370 } IMAGE_TLS_DIRECTORY
,*LPIMAGE_TLS_DIRECTORY
;
373 * The IMAGE_DEBUG_DIRECTORY data directory points to an array of
389 * The type field above can take these (plus a few other
390 * irrelevant) values.
392 #define IMAGE_DEBUG_TYPE_UNKNOWN 0
393 #define IMAGE_DEBUG_TYPE_COFF 1
394 #define IMAGE_DEBUG_TYPE_CODEVIEW 2
395 #define IMAGE_DEBUG_TYPE_FPO 3
396 #define IMAGE_DEBUG_TYPE_MISC 4
397 #define IMAGE_DEBUG_TYPE_EXCEPTION 5
398 #define IMAGE_DEBUG_TYPE_FIXUP 6
399 #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
400 #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
403 #define IMAGE_REL_BASED_ABSOLUTE 0
404 #define IMAGE_REL_BASED_HIGH 1
405 #define IMAGE_REL_BASED_LOW 2
406 #define IMAGE_REL_BASED_HIGHLOW 3
407 #define IMAGE_REL_BASED_HIGHADJ 4
408 #define IMAGE_REL_BASED_MIPS_JMPADDR 5
411 * This is the structure that appears at the very start of a .DBG file.
413 typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
{
417 WORD Characteristics
;
422 DWORD NumberOfSections
;
423 DWORD ExportedNamesSize
;
424 DWORD DebugDirectorySize
;
426 } IMAGE_SEPARATE_DEBUG_HEADER
,*LPIMAGE_SEPARATE_DEBUG_HEADER
;
428 #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
430 #endif /* __WINE_PEEXE_H */