Reactos
1#ifndef _NTIMAGE_
2#define _NTIMAGE_
3
4//
5// Image Formats
6//
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
12
13//
14// Image architectures
15//
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
45
46
47//
48// DOS Image Header Format
49//
50#include <pshpack2.h>
51typedef struct _IMAGE_DOS_HEADER {
52 USHORT e_magic;
53 USHORT e_cblp;
54 USHORT e_cp;
55 USHORT e_crlc;
56 USHORT e_cparhdr;
57 USHORT e_minalloc;
58 USHORT e_maxalloc;
59 USHORT e_ss;
60 USHORT e_sp;
61 USHORT e_csum;
62 USHORT e_ip;
63 USHORT e_cs;
64 USHORT e_lfarlc;
65 USHORT e_ovno;
66 USHORT e_res[4];
67 USHORT e_oemid;
68 USHORT e_oeminfo;
69 USHORT e_res2[10];
70 LONG e_lfanew;
71} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
72#include <poppack.h>
73
74//
75// Export/Import Format
76//
77#include <pshpack4.h>
78typedef struct _IMAGE_EXPORT_DIRECTORY {
79 ULONG Characteristics;
80 ULONG TimeDateStamp;
81 USHORT MajorVersion;
82 USHORT MinorVersion;
83 ULONG Name;
84 ULONG Base;
85 ULONG NumberOfFunctions;
86 ULONG NumberOfNames;
87 ULONG AddressOfFunctions;
88 ULONG AddressOfNames;
89 ULONG AddressOfNameOrdinals;
90} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
91
92//
93// Resource Data Entry Format
94//
95typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
96 ULONG OffsetToData;
97 ULONG Size;
98 ULONG CodePage;
99 ULONG Reserved;
100} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
101
102//
103// Load Configuration Directory Entry Format
104//
105typedef struct {
106 ULONG Size;
107 ULONG TimeDateStamp;
108 USHORT MajorVersion;
109 USHORT MinorVersion;
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;
120 USHORT CSDVersion;
121 USHORT Reserved1;
122 ULONG EditList;
123 ULONG SecurityCookie;
124 ULONG SEHandlerTable;
125 ULONG SEHandlerCount;
126} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
127
128typedef struct {
129 ULONG Size;
130 ULONG TimeDateStamp;
131 USHORT MajorVersion;
132 USHORT MinorVersion;
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;
143 USHORT CSDVersion;
144 USHORT Reserved1;
145 ULONGLONG EditList;
146 ULONGLONG SecurityCookie;
147 ULONGLONG SEHandlerTable;
148 ULONGLONG SEHandlerCount;
149} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
150
151#ifdef _WIN64
152typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;
153typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY;
154#else
155typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;
156typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY;
157#endif
158
159//
160// Base Relocation Format
161//
162typedef struct _IMAGE_BASE_RELOCATION {
163 ULONG VirtualAddress;
164 ULONG SizeOfBlock;
165} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
166
167//
168// Resource Format
169//
170typedef struct _IMAGE_RESOURCE_DIRECTORY {
171 ULONG Characteristics;
172 ULONG TimeDateStamp;
173 USHORT MajorVersion;
174 USHORT MinorVersion;
175 USHORT NumberOfNamedEntries;
176 USHORT NumberOfIdEntries;
177} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
178
179#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
180#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
181
182typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
183 _ANONYMOUS_UNION union {
184 _ANONYMOUS_STRUCT struct {
185 ULONG NameOffset:31;
186 ULONG NameIsString:1;
187 } DUMMYSTRUCTNAME;
188 ULONG Name;
189 USHORT Id;
190 } DUMMYUNIONNAME;
191 _ANONYMOUS_UNION union {
192 ULONG OffsetToData;
193 _ANONYMOUS_STRUCT struct {
194 ULONG OffsetToDirectory:31;
195 ULONG DataIsDirectory:1;
196 } DUMMYSTRUCTNAME2;
197 } DUMMYUNIONNAME2;
198} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
199
200typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
201 USHORT Length;
202 CHAR NameString[ANYSIZE_ARRAY];
203} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
204
205//
206// Section Header Format
207//
208#define IMAGE_SIZEOF_SHORT_NAME 8
209#define IMAGE_SIZEOF_SECTION_HEADER 40
210
211typedef struct _IMAGE_SECTION_HEADER {
212 UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
213 union {
214 ULONG PhysicalAddress;
215 ULONG VirtualSize;
216 } Misc;
217 ULONG VirtualAddress;
218 ULONG SizeOfRawData;
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;
226
227//
228// Section Characteristics
229//
230#define IMAGE_SCN_CNT_CODE 0x00000020
231#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
232#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
233
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
242
243//
244// File Header Format
245//
246#define IMAGE_SIZEOF_FILE_HEADER 20
247
248typedef struct _IMAGE_FILE_HEADER {
249 USHORT Machine;
250 USHORT NumberOfSections;
251 ULONG TimeDateStamp;
252 ULONG PointerToSymbolTable;
253 ULONG NumberOfSymbols;
254 USHORT SizeOfOptionalHeader;
255 USHORT Characteristics;
256} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
257
258//
259// File Characteristics
260//
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
276
277//
278// Directory format.
279//
280#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
281
282typedef struct _IMAGE_DATA_DIRECTORY {
283 ULONG VirtualAddress;
284 ULONG Size;
285} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
286
287//
288// Optional Header Formats
289//
290typedef struct _IMAGE_OPTIONAL_HEADER {
291 USHORT Magic;
292 UCHAR MajorLinkerVersion;
293 UCHAR MinorLinkerVersion;
294 ULONG SizeOfCode;
295 ULONG SizeOfInitializedData;
296 ULONG SizeOfUninitializedData;
297 ULONG AddressOfEntryPoint;
298 ULONG BaseOfCode;
299 ULONG BaseOfData;
300 ULONG ImageBase;
301 ULONG SectionAlignment;
302 ULONG FileAlignment;
303 USHORT MajorOperatingSystemVersion;
304 USHORT MinorOperatingSystemVersion;
305 USHORT MajorImageVersion;
306 USHORT MinorImageVersion;
307 USHORT MajorSubsystemVersion;
308 USHORT MinorSubsystemVersion;
309 ULONG Win32VersionValue;
310 ULONG SizeOfImage;
311 ULONG SizeOfHeaders;
312 ULONG CheckSum;
313 USHORT Subsystem;
314 USHORT DllCharacteristics;
315 ULONG SizeOfStackReserve;
316 ULONG SizeOfStackCommit;
317 ULONG SizeOfHeapReserve;
318 ULONG SizeOfHeapCommit;
319 ULONG LoaderFlags;
320 ULONG NumberOfRvaAndSizes;
321 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
322} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
323
324typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
325 USHORT Magic;
326 UCHAR MajorLinkerVersion;
327 UCHAR MinorLinkerVersion;
328 ULONG SizeOfCode;
329 ULONG SizeOfInitializedData;
330 ULONG SizeOfUninitializedData;
331 ULONG AddressOfEntryPoint;
332 ULONG BaseOfCode;
333 ULONG BaseOfData;
334 ULONG BaseOfBss;
335 ULONG GprMask;
336 ULONG CprMask[4];
337 ULONG GpValue;
338} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
339
340typedef struct _IMAGE_OPTIONAL_HEADER64 {
341 USHORT Magic;
342 UCHAR MajorLinkerVersion;
343 UCHAR MinorLinkerVersion;
344 ULONG SizeOfCode;
345 ULONG SizeOfInitializedData;
346 ULONG SizeOfUninitializedData;
347 ULONG AddressOfEntryPoint;
348 ULONG BaseOfCode;
349 ULONGLONG ImageBase;
350 ULONG SectionAlignment;
351 ULONG FileAlignment;
352 USHORT MajorOperatingSystemVersion;
353 USHORT MinorOperatingSystemVersion;
354 USHORT MajorImageVersion;
355 USHORT MinorImageVersion;
356 USHORT MajorSubsystemVersion;
357 USHORT MinorSubsystemVersion;
358 ULONG Win32VersionValue;
359 ULONG SizeOfImage;
360 ULONG SizeOfHeaders;
361 ULONG CheckSum;
362 USHORT Subsystem;
363 USHORT DllCharacteristics;
364 ULONGLONG SizeOfStackReserve;
365 ULONGLONG SizeOfStackCommit;
366 ULONGLONG SizeOfHeapReserve;
367 ULONGLONG SizeOfHeapCommit;
368 ULONG LoaderFlags;
369 ULONG NumberOfRvaAndSizes;
370 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
371} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
372
373//
374// Format Identifier Magics
375//
376#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
377#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
378#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
379
380#ifdef _WIN64
381typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
382typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
383#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
384#else
385typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
386typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
387#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
388#endif
389
390//
391// Nt Header Formats
392//
393typedef struct _IMAGE_NT_HEADERS64 {
394 ULONG Signature;
395 IMAGE_FILE_HEADER FileHeader;
396 IMAGE_OPTIONAL_HEADER64 OptionalHeader;
397} IMAGE_NT_HEADERS64;
398
399typedef struct _IMAGE_NT_HEADERS {
400 ULONG Signature;
401 IMAGE_FILE_HEADER FileHeader;
402 IMAGE_OPTIONAL_HEADER32 OptionalHeader;
403} IMAGE_NT_HEADERS32;
404
405#ifdef _WIN64
406typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
407#else
408typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
409#endif
410
411#ifndef _NTDDK_
412
413typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
414typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
415
416#ifdef _WIN64
417typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
418#else
419typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
420#endif
421
422#endif /* _NTDDK_ */
423
424//
425// Retreives the first image section header from the Nt Header
426//
427#define IMAGE_FIRST_SECTION( NtHeader ) \
428 ((PIMAGE_SECTION_HEADER) ((ULONG_PTR)(NtHeader) + \
429 FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
430 ((NtHeader))->FileHeader.SizeOfOptionalHeader))
431
432//
433// Subsystems
434//
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
450
451//
452// Dll Characteristics
453//
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
465
466//
467// Loader Flags
468//
469#define IMAGE_LOADER_FLAGS_COMPLUS 0x00000001
470#define IMAGE_LOADER_FLAGS_SYSTEM_GLOBAL 0x01000000
471
472//
473// Directory Entry Specifiers
474//
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
490
491//
492// Import Formats
493//
494typedef struct _IMAGE_IMPORT_BY_NAME {
495 USHORT Hint;
496 UCHAR Name[1];
497} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
498
499#include <pshpack8.h>
500typedef struct _IMAGE_THUNK_DATA64 {
501 union {
502 ULONGLONG ForwarderString;
503 ULONGLONG Function;
504 ULONGLONG Ordinal;
505 ULONGLONG AddressOfData;
506 } u1;
507} IMAGE_THUNK_DATA64, *PIMAGE_THUNK_DATA64;
508#include <poppack.h>
509
510typedef struct _IMAGE_THUNK_DATA32 {
511 union {
512 ULONG ForwarderString;
513 ULONG Function;
514 ULONG Ordinal;
515 ULONG AddressOfData;
516 } u1;
517} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;
518
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)
525
526//
527// Thread Local Storage (TLS)
528//
529typedef
530VOID
531(NTAPI *PIMAGE_TLS_CALLBACK) (
532 PVOID DllHandle,
533 ULONG Reason,
534 PVOID Reserved);
535
536typedef 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;
544
545typedef 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;
553
554#ifdef _WIN64
555#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
556#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
557typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
558typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;
559#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
560typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
561typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;
562#else
563#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
564#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
565typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
566typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;
567#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
568typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
569typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
570#endif
571
572typedef struct _IMAGE_IMPORT_DESCRIPTOR {
573 _ANONYMOUS_UNION union {
574 ULONG Characteristics;
575 ULONG OriginalFirstThunk;
576 } DUMMYUNIONNAME;
577 ULONG TimeDateStamp;
578 ULONG ForwarderChain;
579 ULONG Name;
580 ULONG FirstThunk;
581} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
582
583#include <poppack.h>
584
585#endif /* _NTIMAGE_ */