Release 970329
[wine/multimedia.git] / include / peexe.h
blobd60affc973e6a6d6cbe30bd1f2309a6874482c6d
1 /*
2 * Copyright Eric Youngdale (1994)
3 */
4 #ifndef __WINE_PEEXE_H
5 #define __WINE_PEEXE_H
7 #include "wintypes.h"
9 typedef struct _IMAGE_FILE_HEADER {
10 WORD Machine;
11 WORD NumberOfSections;
12 DWORD TimeDateStamp;
13 DWORD PointerToSymbolTable;
14 DWORD NumberOfSymbols;
15 WORD SizeOfOptionalHeader;
16 WORD Characteristics;
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
22 field */
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
48 DWORD VirtualAddress;
49 DWORD Size;
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
58 * Standard fields.
61 WORD Magic;
62 BYTE MajorLinkerVersion;
63 BYTE MinorLinkerVersion;
64 DWORD SizeOfCode;
65 DWORD SizeOfInitializedData;
66 DWORD SizeOfUninitializedData;
67 DWORD AddressOfEntryPoint;
68 DWORD BaseOfCode;
69 DWORD BaseOfData;
72 * NT additional fields.
75 DWORD ImageBase;
76 DWORD SectionAlignment;
77 DWORD FileAlignment;
78 WORD MajorOperatingSystemVersion;
79 WORD MinorOperatingSystemVersion;
80 WORD MajorImageVersion;
81 WORD MinorImageVersion;
82 WORD MajorSubsystemVersion;
83 WORD MinorSubsystemVersion;
84 DWORD Reserved1;
85 DWORD SizeOfImage;
86 DWORD SizeOfHeaders;
87 DWORD CheckSum;
88 WORD Subsystem;
89 WORD DllCharacteristics;
90 DWORD SizeOfStackReserve;
91 DWORD SizeOfStackCommit;
92 DWORD SizeOfHeapReserve;
93 DWORD SizeOfHeapCommit;
94 DWORD LoaderFlags;
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 {
138 DWORD Signature;
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];
149 union {
150 DWORD PhysicalAddress;
151 DWORD VirtualSize;
152 } Misc;
153 DWORD VirtualAddress;
154 DWORD SizeOfRawData;
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 {
216 WORD Hint;
217 BYTE Name[1];
218 } IMAGE_IMPORT_BY_NAME,*LPIMAGE_IMPORT_BY_NAME;
220 /* Import thunk */
221 typedef struct _IMAGE_THUNK_DATA {
222 union {
223 LPBYTE ForwarderString;
224 LPDWORD Function;
225 DWORD Ordinal;
226 LPIMAGE_IMPORT_BY_NAME AddressOfData;
227 } u1;
228 } IMAGE_THUNK_DATA,*LPIMAGE_THUNK_DATA;
230 /* Import module directory */
232 typedef struct _IMAGE_IMPORT_DESCRIPTOR {
233 union {
234 DWORD Characteristics; /* 0 for terminating null import descriptor */
235 LPIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */
236 } u;
237 DWORD TimeDateStamp; /* 0 if not bound,
238 * -1 if bound, and real date\time stamp
239 * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
240 * (new BIND)
241 * otherwise date/time stamp of DLL bound to
242 * (Old BIND)
244 DWORD ForwarderChain; /* -1 if no forwarders */
245 DWORD Name;
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;
258 DWORD TimeDateStamp;
259 WORD MajorVersion;
260 WORD MinorVersion;
261 DWORD Name;
262 DWORD Base;
263 DWORD NumberOfFunctions;
264 DWORD NumberOfNames;
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;
277 DWORD TimeDateStamp;
278 WORD MajorVersion;
279 WORD MinorVersion;
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 {
289 union {
290 struct {
291 DWORD NameOffset:31;
292 DWORD NameIsString:1;
293 } s;
294 DWORD Name;
295 WORD Id;
296 } u1;
297 union {
298 DWORD OffsetToData;
299 struct {
300 DWORD OffsetToDirectory:31;
301 DWORD DataIsDirectory:1;
302 } s;
303 } u2;
304 } IMAGE_RESOURCE_DIRECTORY_ENTRY,*LPIMAGE_RESOURCE_DIRECTORY_ENTRY;
307 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
308 WORD Length;
309 CHAR NameString[ 1 ];
310 } IMAGE_RESOURCE_DIRECTORY_STRING,*LPIMAGE_RESOURCE_DIRECTORY_STRING;
312 typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
313 WORD Length;
314 WCHAR NameString[ 1 ];
315 } IMAGE_RESOURCE_DIR_STRING_U,*LPIMAGE_RESOURCE_DIR_STRING_U;
317 typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
318 DWORD OffsetToData;
319 DWORD Size;
320 DWORD CodePage;
321 DWORD Reserved;
322 } IMAGE_RESOURCE_DATA_ENTRY,*LPIMAGE_RESOURCE_DATA_ENTRY;
324 typedef struct _IMAGE_BASE_RELOCATION
326 DWORD VirtualAddress;
327 DWORD SizeOfBlock;
328 WORD TypeOffset[1];
329 } IMAGE_BASE_RELOCATION,*LPIMAGE_BASE_RELOCATION;
331 typedef struct _IMAGE_DEBUG_DIRECTORY {
332 DWORD Characteristics;
333 DWORD TimeDateStamp;
334 WORD MajorVersion;
335 WORD MinorVersion;
336 DWORD Type;
337 DWORD SizeOfData;
338 DWORD AddressOfRawData;
339 DWORD PointerToRawData;
340 } IMAGE_DEBUG_DIRECTORY,*LPIMAGE_DEBUG_DIRECTORY;
342 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
343 DWORD Characteristics;
344 DWORD TimeDateStamp;
345 WORD MajorVersion;
346 WORD MinorVersion;
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;
356 DWORD Reserved[ 4 ];
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
374 * these structures.
376 struct PE_Debug_dir
378 u_long flags;
379 u_long timestamp;
380 u_short major;
381 u_short minor;
382 u_long type;
383 u_long dbgsize;
384 u_long dbgptr;
385 u_long dbgoff;
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 {
414 WORD Signature;
415 WORD Flags;
416 WORD Machine;
417 WORD Characteristics;
418 DWORD TimeDateStamp;
419 DWORD CheckSum;
420 DWORD ImageBase;
421 DWORD SizeOfImage;
422 DWORD NumberOfSections;
423 DWORD ExportedNamesSize;
424 DWORD DebugDirectorySize;
425 DWORD Reserved[ 3 ];
426 } IMAGE_SEPARATE_DEBUG_HEADER,*LPIMAGE_SEPARATE_DEBUG_HEADER;
428 #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
430 #endif /* __WINE_PEEXE_H */