7 #define IMAGE_DOS_SIGNATURE 0x5A4D
8 #define IMAGE_OS2_SIGNATURE 0x454E
9 #define IMAGE_OS2_SIGNATURE_LE 0x454C
10 #define IMAGE_VXD_SIGNATURE 0x454C
11 #define IMAGE_NT_SIGNATURE 0x00004550
14 // Image architectures
16 #define IMAGE_FILE_MACHINE_AM33 0x1d3
17 #define IMAGE_FILE_MACHINE_AMD64 0x8664
18 #define IMAGE_FILE_MACHINE_ARM 0x1c0
19 #define IMAGE_FILE_MACHINE_ARMV7 0x1c4
20 #define IMAGE_FILE_MACHINE_EBC 0xebc
21 #define IMAGE_FILE_MACHINE_I386 0x14c
22 #define IMAGE_FILE_MACHINE_IA64 0x200
23 #define IMAGE_FILE_MACHINE_M32R 0x9041
24 #define IMAGE_FILE_MACHINE_MIPS16 0x266
25 #define IMAGE_FILE_MACHINE_MIPSFPU 0x366
26 #define IMAGE_FILE_MACHINE_MIPSFPU16 0x466
27 #define IMAGE_FILE_MACHINE_POWERPC 0x1f0
28 #define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1
29 #define IMAGE_FILE_MACHINE_R4000 0x166
30 #define IMAGE_FILE_MACHINE_SH3 0x1a2
31 #define IMAGE_FILE_MACHINE_SH3E 0x01a4
32 #define IMAGE_FILE_MACHINE_SH3DSP 0x1a3
33 #define IMAGE_FILE_MACHINE_SH4 0x1a6
34 #define IMAGE_FILE_MACHINE_SH5 0x1a8
35 #define IMAGE_FILE_MACHINE_THUMB 0x1c2
36 #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169
37 #define IMAGE_FILE_MACHINE_R3000 0x162
38 #define IMAGE_FILE_MACHINE_R10000 0x168
39 #define IMAGE_FILE_MACHINE_ALPHA 0x184
40 #define IMAGE_FILE_MACHINE_ALPHA64 0x0284
41 #define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
42 #define IMAGE_FILE_MACHINE_CEE 0xC0EE
43 #define IMAGE_FILE_MACHINE_TRICORE 0x0520
44 #define IMAGE_FILE_MACHINE_CEF 0x0CEF
48 // DOS Image Header Format
51 typedef struct _IMAGE_DOS_HEADER
{
71 } IMAGE_DOS_HEADER
, *PIMAGE_DOS_HEADER
;
75 // Export/Import Format
78 typedef struct _IMAGE_EXPORT_DIRECTORY
{
79 ULONG Characteristics
;
85 ULONG NumberOfFunctions
;
87 ULONG AddressOfFunctions
;
89 ULONG AddressOfNameOrdinals
;
90 } IMAGE_EXPORT_DIRECTORY
, *PIMAGE_EXPORT_DIRECTORY
;
93 // Resource Data Entry Format
95 typedef struct _IMAGE_RESOURCE_DATA_ENTRY
{
100 } IMAGE_RESOURCE_DATA_ENTRY
, *PIMAGE_RESOURCE_DATA_ENTRY
;
103 // Load Configuration Directory Entry Format
110 ULONG GlobalFlagsClear
;
111 ULONG GlobalFlagsSet
;
112 ULONG CriticalSectionDefaultTimeout
;
113 ULONG DeCommitFreeBlockThreshold
;
114 ULONG DeCommitTotalFreeThreshold
;
115 ULONG LockPrefixTable
;
116 ULONG MaximumAllocationSize
;
117 ULONG VirtualMemoryThreshold
;
118 ULONG ProcessHeapFlags
;
119 ULONG ProcessAffinityMask
;
123 ULONG SecurityCookie
;
124 ULONG SEHandlerTable
;
125 ULONG SEHandlerCount
;
126 } IMAGE_LOAD_CONFIG_DIRECTORY32
, *PIMAGE_LOAD_CONFIG_DIRECTORY32
;
133 ULONG GlobalFlagsClear
;
134 ULONG GlobalFlagsSet
;
135 ULONG CriticalSectionDefaultTimeout
;
136 ULONGLONG DeCommitFreeBlockThreshold
;
137 ULONGLONG DeCommitTotalFreeThreshold
;
138 ULONGLONG LockPrefixTable
;
139 ULONGLONG MaximumAllocationSize
;
140 ULONGLONG VirtualMemoryThreshold
;
141 ULONGLONG ProcessAffinityMask
;
142 ULONG ProcessHeapFlags
;
146 ULONGLONG SecurityCookie
;
147 ULONGLONG SEHandlerTable
;
148 ULONGLONG SEHandlerCount
;
149 } IMAGE_LOAD_CONFIG_DIRECTORY64
, *PIMAGE_LOAD_CONFIG_DIRECTORY64
;
152 typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY
;
153 typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY
;
155 typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY
;
156 typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY
;
160 // Base Relocation Format
162 typedef struct _IMAGE_BASE_RELOCATION
{
163 ULONG VirtualAddress
;
165 } IMAGE_BASE_RELOCATION
, *PIMAGE_BASE_RELOCATION
;
170 typedef struct _IMAGE_RESOURCE_DIRECTORY
{
171 ULONG Characteristics
;
175 USHORT NumberOfNamedEntries
;
176 USHORT NumberOfIdEntries
;
177 } IMAGE_RESOURCE_DIRECTORY
, *PIMAGE_RESOURCE_DIRECTORY
;
179 #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
180 #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
182 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
{
183 _ANONYMOUS_UNION
union {
184 _ANONYMOUS_STRUCT
struct {
186 ULONG NameIsString
:1;
191 _ANONYMOUS_UNION
union {
193 _ANONYMOUS_STRUCT
struct {
194 ULONG OffsetToDirectory
:31;
195 ULONG DataIsDirectory
:1;
198 } IMAGE_RESOURCE_DIRECTORY_ENTRY
, *PIMAGE_RESOURCE_DIRECTORY_ENTRY
;
200 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING
{
202 CHAR NameString
[ANYSIZE_ARRAY
];
203 } IMAGE_RESOURCE_DIRECTORY_STRING
, *PIMAGE_RESOURCE_DIRECTORY_STRING
;
206 // Section Header Format
208 #define IMAGE_SIZEOF_SHORT_NAME 8
209 #define IMAGE_SIZEOF_SECTION_HEADER 40
211 typedef struct _IMAGE_SECTION_HEADER
{
212 UCHAR Name
[IMAGE_SIZEOF_SHORT_NAME
];
214 ULONG PhysicalAddress
;
217 ULONG VirtualAddress
;
219 ULONG PointerToRawData
;
220 ULONG PointerToRelocations
;
221 ULONG PointerToLinenumbers
;
222 USHORT NumberOfRelocations
;
223 USHORT NumberOfLinenumbers
;
224 ULONG Characteristics
;
225 } IMAGE_SECTION_HEADER
, *PIMAGE_SECTION_HEADER
;
228 // Section Characteristics
230 #define IMAGE_SCN_CNT_CODE 0x00000020
231 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
232 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
234 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
235 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
236 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
237 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
238 #define IMAGE_SCN_MEM_SHARED 0x10000000
239 #define IMAGE_SCN_MEM_EXECUTE 0x20000000
240 #define IMAGE_SCN_MEM_READ 0x40000000
241 #define IMAGE_SCN_MEM_WRITE 0x80000000
244 // File Header Format
246 #define IMAGE_SIZEOF_FILE_HEADER 20
248 typedef struct _IMAGE_FILE_HEADER
{
250 USHORT NumberOfSections
;
252 ULONG PointerToSymbolTable
;
253 ULONG NumberOfSymbols
;
254 USHORT SizeOfOptionalHeader
;
255 USHORT Characteristics
;
256 } IMAGE_FILE_HEADER
, *PIMAGE_FILE_HEADER
;
259 // File Characteristics
261 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001
262 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
263 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
264 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
265 #define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010
266 #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
267 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
268 #define IMAGE_FILE_32BIT_MACHINE 0x0100
269 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200
270 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
271 #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
272 #define IMAGE_FILE_SYSTEM 0x1000
273 #define IMAGE_FILE_DLL 0x2000
274 #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
275 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
280 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
282 typedef struct _IMAGE_DATA_DIRECTORY
{
283 ULONG VirtualAddress
;
285 } IMAGE_DATA_DIRECTORY
, *PIMAGE_DATA_DIRECTORY
;
288 // Optional Header Formats
290 typedef struct _IMAGE_OPTIONAL_HEADER
{
292 UCHAR MajorLinkerVersion
;
293 UCHAR MinorLinkerVersion
;
295 ULONG SizeOfInitializedData
;
296 ULONG SizeOfUninitializedData
;
297 ULONG AddressOfEntryPoint
;
301 ULONG SectionAlignment
;
303 USHORT MajorOperatingSystemVersion
;
304 USHORT MinorOperatingSystemVersion
;
305 USHORT MajorImageVersion
;
306 USHORT MinorImageVersion
;
307 USHORT MajorSubsystemVersion
;
308 USHORT MinorSubsystemVersion
;
309 ULONG Win32VersionValue
;
314 USHORT DllCharacteristics
;
315 ULONG SizeOfStackReserve
;
316 ULONG SizeOfStackCommit
;
317 ULONG SizeOfHeapReserve
;
318 ULONG SizeOfHeapCommit
;
320 ULONG NumberOfRvaAndSizes
;
321 IMAGE_DATA_DIRECTORY DataDirectory
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
];
322 } IMAGE_OPTIONAL_HEADER32
, *PIMAGE_OPTIONAL_HEADER32
;
324 typedef struct _IMAGE_ROM_OPTIONAL_HEADER
{
326 UCHAR MajorLinkerVersion
;
327 UCHAR MinorLinkerVersion
;
329 ULONG SizeOfInitializedData
;
330 ULONG SizeOfUninitializedData
;
331 ULONG AddressOfEntryPoint
;
338 } IMAGE_ROM_OPTIONAL_HEADER
, *PIMAGE_ROM_OPTIONAL_HEADER
;
340 typedef struct _IMAGE_OPTIONAL_HEADER64
{
342 UCHAR MajorLinkerVersion
;
343 UCHAR MinorLinkerVersion
;
345 ULONG SizeOfInitializedData
;
346 ULONG SizeOfUninitializedData
;
347 ULONG AddressOfEntryPoint
;
350 ULONG SectionAlignment
;
352 USHORT MajorOperatingSystemVersion
;
353 USHORT MinorOperatingSystemVersion
;
354 USHORT MajorImageVersion
;
355 USHORT MinorImageVersion
;
356 USHORT MajorSubsystemVersion
;
357 USHORT MinorSubsystemVersion
;
358 ULONG Win32VersionValue
;
363 USHORT DllCharacteristics
;
364 ULONGLONG SizeOfStackReserve
;
365 ULONGLONG SizeOfStackCommit
;
366 ULONGLONG SizeOfHeapReserve
;
367 ULONGLONG SizeOfHeapCommit
;
369 ULONG NumberOfRvaAndSizes
;
370 IMAGE_DATA_DIRECTORY DataDirectory
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
];
371 } IMAGE_OPTIONAL_HEADER64
, *PIMAGE_OPTIONAL_HEADER64
;
374 // Format Identifier Magics
376 #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
377 #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
378 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
381 typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER
;
382 typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER
;
383 #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
385 typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER
;
386 typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER
;
387 #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
393 typedef struct _IMAGE_NT_HEADERS64
{
395 IMAGE_FILE_HEADER FileHeader
;
396 IMAGE_OPTIONAL_HEADER64 OptionalHeader
;
397 } IMAGE_NT_HEADERS64
;
399 typedef struct _IMAGE_NT_HEADERS
{
401 IMAGE_FILE_HEADER FileHeader
;
402 IMAGE_OPTIONAL_HEADER32 OptionalHeader
;
403 } IMAGE_NT_HEADERS32
;
406 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS
;
408 typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS
;
413 typedef struct _IMAGE_NT_HEADERS
*PIMAGE_NT_HEADERS32
;
414 typedef struct _IMAGE_NT_HEADERS64
*PIMAGE_NT_HEADERS64
;
417 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS
;
419 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
;
425 // Retreives the first image section header from the Nt Header
427 #define IMAGE_FIRST_SECTION( NtHeader ) \
428 ((PIMAGE_SECTION_HEADER) ((ULONG_PTR)(NtHeader) + \
429 FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
430 ((NtHeader))->FileHeader.SizeOfOptionalHeader))
435 #define IMAGE_SUBSYSTEM_UNKNOWN 0
436 #define IMAGE_SUBSYSTEM_NATIVE 1
437 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
438 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
439 #define IMAGE_SUBSYSTEM_OS2_CUI 5
440 #define IMAGE_SUBSYSTEM_POSIX_CUI 7
441 #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8
442 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
443 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
444 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
445 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
446 #define IMAGE_SUBSYSTEM_EFI_ROM 13
447 #define IMAGE_SUBSYSTEM_XBOX 14
448 #define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16
449 #define IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG 17
452 // Dll Characteristics
454 #define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020
455 #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040
456 #define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080
457 #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100
458 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
459 #define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
460 #define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
461 #define IMAGE_DLLCHARACTERISTICS_APPCONTAINER 0x1000
462 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
463 #define IMAGE_DLLCHARACTERISTICS_GUARD_CF 0x4000
464 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
469 #define IMAGE_LOADER_FLAGS_COMPLUS 0x00000001
470 #define IMAGE_LOADER_FLAGS_SYSTEM_GLOBAL 0x01000000
473 // Directory Entry Specifiers
475 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
476 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
477 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
478 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
479 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4
480 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
481 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6
482 #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7
483 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
484 #define IMAGE_DIRECTORY_ENTRY_TLS 9
485 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
486 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
487 #define IMAGE_DIRECTORY_ENTRY_IAT 12
488 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
489 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
494 typedef struct _IMAGE_IMPORT_BY_NAME
{
497 } IMAGE_IMPORT_BY_NAME
, *PIMAGE_IMPORT_BY_NAME
;
499 #include <pshpack8.h>
500 typedef struct _IMAGE_THUNK_DATA64
{
502 ULONGLONG ForwarderString
;
505 ULONGLONG AddressOfData
;
507 } IMAGE_THUNK_DATA64
, *PIMAGE_THUNK_DATA64
;
510 typedef struct _IMAGE_THUNK_DATA32
{
512 ULONG ForwarderString
;
517 } IMAGE_THUNK_DATA32
, *PIMAGE_THUNK_DATA32
;
519 #define IMAGE_ORDINAL_FLAG64 0x8000000000000000ULL
520 #define IMAGE_ORDINAL_FLAG32 0x80000000
521 #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
522 #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
523 #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
524 #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
527 // Thread Local Storage (TLS)
531 (NTAPI
*PIMAGE_TLS_CALLBACK
) (
536 typedef struct _IMAGE_TLS_DIRECTORY64
{
537 ULONGLONG StartAddressOfRawData
;
538 ULONGLONG EndAddressOfRawData
;
539 ULONGLONG AddressOfIndex
;
540 ULONGLONG AddressOfCallBacks
;
541 ULONG SizeOfZeroFill
;
542 ULONG Characteristics
;
543 } IMAGE_TLS_DIRECTORY64
, *PIMAGE_TLS_DIRECTORY64
;
545 typedef struct _IMAGE_TLS_DIRECTORY32
{
546 ULONG StartAddressOfRawData
;
547 ULONG EndAddressOfRawData
;
548 ULONG AddressOfIndex
;
549 ULONG AddressOfCallBacks
;
550 ULONG SizeOfZeroFill
;
551 ULONG Characteristics
;
552 } IMAGE_TLS_DIRECTORY32
, *PIMAGE_TLS_DIRECTORY32
;
555 #define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
556 #define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
557 typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA
;
558 typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA
;
559 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
560 typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY
;
561 typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY
;
563 #define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
564 #define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
565 typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA
;
566 typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA
;
567 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
568 typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY
;
569 typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY
;
572 typedef struct _IMAGE_IMPORT_DESCRIPTOR
{
573 _ANONYMOUS_UNION
union {
574 ULONG Characteristics
;
575 ULONG OriginalFirstThunk
;
578 ULONG ForwarderChain
;
581 } IMAGE_IMPORT_DESCRIPTOR
, *PIMAGE_IMPORT_DESCRIPTOR
;
585 #endif /* _NTIMAGE_ */