Home | History | Annotate | Download | only in ddk
      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>
     51 typedef 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 //
     76 // Export/Import Format
     77 //
     78 #include <pshpack4.h>
     79 typedef struct _IMAGE_EXPORT_DIRECTORY {
     80     ULONG Characteristics;
     81     ULONG TimeDateStamp;
     82     USHORT MajorVersion;
     83     USHORT MinorVersion;
     84     ULONG Name;
     85     ULONG Base;
     86     ULONG NumberOfFunctions;
     87     ULONG NumberOfNames;
     88     ULONG AddressOfFunctions;
     89     ULONG AddressOfNames;
     90     ULONG AddressOfNameOrdinals;
     91 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
     92 
     93 
     94 //
     95 // Resource Data Entry Format
     96 //
     97 typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
     98     ULONG OffsetToData;
     99     ULONG Size;
    100     ULONG CodePage;
    101     ULONG Reserved;
    102 } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
    103 
    104 
    105 //
    106 // Load Configuration Directory Entry Format
    107 //
    108 typedef struct {
    109     ULONG   Size;
    110     ULONG   TimeDateStamp;
    111     USHORT  MajorVersion;
    112     USHORT  MinorVersion;
    113     ULONG   GlobalFlagsClear;
    114     ULONG   GlobalFlagsSet;
    115     ULONG   CriticalSectionDefaultTimeout;
    116     ULONG   DeCommitFreeBlockThreshold;
    117     ULONG   DeCommitTotalFreeThreshold;
    118     ULONG   LockPrefixTable;
    119     ULONG   MaximumAllocationSize;
    120     ULONG   VirtualMemoryThreshold;
    121     ULONG   ProcessHeapFlags;
    122     ULONG   ProcessAffinityMask;
    123     USHORT  CSDVersion;
    124     USHORT  Reserved1;
    125     ULONG   EditList;
    126     ULONG   SecurityCookie;
    127     ULONG   SEHandlerTable;
    128     ULONG   SEHandlerCount;
    129 } IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
    130 
    131 typedef struct {
    132     ULONG      Size;
    133     ULONG      TimeDateStamp;
    134     USHORT     MajorVersion;
    135     USHORT     MinorVersion;
    136     ULONG      GlobalFlagsClear;
    137     ULONG      GlobalFlagsSet;
    138     ULONG      CriticalSectionDefaultTimeout;
    139     ULONGLONG  DeCommitFreeBlockThreshold;
    140     ULONGLONG  DeCommitTotalFreeThreshold;
    141     ULONGLONG  LockPrefixTable;
    142     ULONGLONG  MaximumAllocationSize;
    143     ULONGLONG  VirtualMemoryThreshold;
    144     ULONGLONG  ProcessAffinityMask;
    145     ULONG      ProcessHeapFlags;
    146     USHORT     CSDVersion;
    147     USHORT     Reserved1;
    148     ULONGLONG  EditList;
    149     ULONGLONG  SecurityCookie;
    150     ULONGLONG  SEHandlerTable;
    151     ULONGLONG  SEHandlerCount;
    152 } IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
    153 
    154 #ifdef _WIN64
    155 typedef IMAGE_LOAD_CONFIG_DIRECTORY64     IMAGE_LOAD_CONFIG_DIRECTORY;
    156 typedef PIMAGE_LOAD_CONFIG_DIRECTORY64    PIMAGE_LOAD_CONFIG_DIRECTORY;
    157 #else
    158 typedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;
    159 typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;
    160 #endif
    161 
    162 
    163 //
    164 // Base Relocation Format
    165 //
    166 typedef struct _IMAGE_BASE_RELOCATION {
    167 	ULONG VirtualAddress;
    168 	ULONG SizeOfBlock;
    169 } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
    170 
    171 
    172 //
    173 // Resource Format
    174 //
    175 typedef struct _IMAGE_RESOURCE_DIRECTORY {
    176     ULONG Characteristics;
    177     ULONG TimeDateStamp;
    178     USHORT MajorVersion;
    179     USHORT MinorVersion;
    180     USHORT NumberOfNamedEntries;
    181     USHORT NumberOfIdEntries;
    182 } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
    183 
    184 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
    185     USHORT Length;
    186     CHAR NameString[ANYSIZE_ARRAY];
    187 } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
    188 
    189 
    190 //
    191 // Section Header Format
    192 //
    193 #define IMAGE_SIZEOF_SHORT_NAME              8
    194 #define IMAGE_SIZEOF_SECTION_HEADER          40
    195 
    196 typedef struct _IMAGE_SECTION_HEADER {
    197     UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
    198     union
    199     {
    200         ULONG PhysicalAddress;
    201         ULONG VirtualSize;
    202     } Misc;
    203     ULONG VirtualAddress;
    204     ULONG SizeOfRawData;
    205     ULONG PointerToRawData;
    206     ULONG PointerToRelocations;
    207     ULONG PointerToLinenumbers;
    208     USHORT NumberOfRelocations;
    209     USHORT NumberOfLinenumbers;
    210     ULONG Characteristics;
    211 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
    212 
    213 //
    214 // Section Characteristics
    215 //
    216 #define IMAGE_SCN_CNT_CODE                   0x00000020
    217 #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040
    218 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080
    219 
    220 #define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000
    221 #define IMAGE_SCN_MEM_DISCARDABLE            0x02000000
    222 #define IMAGE_SCN_MEM_NOT_CACHED             0x04000000
    223 #define IMAGE_SCN_MEM_NOT_PAGED              0x08000000
    224 #define IMAGE_SCN_MEM_SHARED                 0x10000000
    225 #define IMAGE_SCN_MEM_EXECUTE                0x20000000
    226 #define IMAGE_SCN_MEM_READ                   0x40000000
    227 #define IMAGE_SCN_MEM_WRITE                  0x80000000
    228 
    229 
    230 //
    231 // File Header Format
    232 //
    233 #define IMAGE_SIZEOF_FILE_HEADER             20
    234 
    235 typedef struct _IMAGE_FILE_HEADER {
    236     USHORT Machine;
    237     USHORT NumberOfSections;
    238     ULONG TimeDateStamp;
    239     ULONG PointerToSymbolTable;
    240     ULONG NumberOfSymbols;
    241     USHORT SizeOfOptionalHeader;
    242     USHORT Characteristics;
    243 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
    244 
    245 //
    246 // File Characteristics
    247 //
    248 #define IMAGE_FILE_RELOCS_STRIPPED           0x0001
    249 #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002
    250 #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004
    251 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008
    252 #define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010
    253 #define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020
    254 #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080
    255 #define IMAGE_FILE_32BIT_MACHINE             0x0100
    256 #define IMAGE_FILE_DEBUG_STRIPPED            0x0200
    257 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400
    258 #define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800
    259 #define IMAGE_FILE_SYSTEM                    0x1000
    260 #define IMAGE_FILE_DLL                       0x2000
    261 #define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000
    262 #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000
    263 
    264 
    265 //
    266 // Directory format.
    267 //
    268 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
    269 
    270 typedef struct _IMAGE_DATA_DIRECTORY {
    271     ULONG   VirtualAddress;
    272     ULONG   Size;
    273 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    274 
    275 
    276 //
    277 // Optional Header Formats
    278 //
    279 typedef struct _IMAGE_OPTIONAL_HEADER {
    280     USHORT  Magic;
    281     UCHAR   MajorLinkerVersion;
    282     UCHAR   MinorLinkerVersion;
    283     ULONG   SizeOfCode;
    284     ULONG   SizeOfInitializedData;
    285     ULONG   SizeOfUninitializedData;
    286     ULONG   AddressOfEntryPoint;
    287     ULONG   BaseOfCode;
    288     ULONG   BaseOfData;
    289     ULONG   ImageBase;
    290     ULONG   SectionAlignment;
    291     ULONG   FileAlignment;
    292     USHORT  MajorOperatingSystemVersion;
    293     USHORT  MinorOperatingSystemVersion;
    294     USHORT  MajorImageVersion;
    295     USHORT  MinorImageVersion;
    296     USHORT  MajorSubsystemVersion;
    297     USHORT  MinorSubsystemVersion;
    298     ULONG   Win32VersionValue;
    299     ULONG   SizeOfImage;
    300     ULONG   SizeOfHeaders;
    301     ULONG   CheckSum;
    302     USHORT  Subsystem;
    303     USHORT  DllCharacteristics;
    304     ULONG   SizeOfStackReserve;
    305     ULONG   SizeOfStackCommit;
    306     ULONG   SizeOfHeapReserve;
    307     ULONG   SizeOfHeapCommit;
    308     ULONG   LoaderFlags;
    309     ULONG   NumberOfRvaAndSizes;
    310     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    311 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
    312 
    313 typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
    314     USHORT Magic;
    315     UCHAR  MajorLinkerVersion;
    316     UCHAR  MinorLinkerVersion;
    317     ULONG  SizeOfCode;
    318     ULONG  SizeOfInitializedData;
    319     ULONG  SizeOfUninitializedData;
    320     ULONG  AddressOfEntryPoint;
    321     ULONG  BaseOfCode;
    322     ULONG  BaseOfData;
    323     ULONG  BaseOfBss;
    324     ULONG  GprMask;
    325     ULONG  CprMask[4];
    326     ULONG  GpValue;
    327 } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
    328 
    329 typedef struct _IMAGE_OPTIONAL_HEADER64 {
    330     USHORT      Magic;
    331     UCHAR       MajorLinkerVersion;
    332     UCHAR       MinorLinkerVersion;
    333     ULONG       SizeOfCode;
    334     ULONG       SizeOfInitializedData;
    335     ULONG       SizeOfUninitializedData;
    336     ULONG       AddressOfEntryPoint;
    337     ULONG       BaseOfCode;
    338     ULONGLONG   ImageBase;
    339     ULONG       SectionAlignment;
    340     ULONG       FileAlignment;
    341     USHORT      MajorOperatingSystemVersion;
    342     USHORT      MinorOperatingSystemVersion;
    343     USHORT      MajorImageVersion;
    344     USHORT      MinorImageVersion;
    345     USHORT      MajorSubsystemVersion;
    346     USHORT      MinorSubsystemVersion;
    347     ULONG       Win32VersionValue;
    348     ULONG       SizeOfImage;
    349     ULONG       SizeOfHeaders;
    350     ULONG       CheckSum;
    351     USHORT      Subsystem;
    352     USHORT      DllCharacteristics;
    353     ULONGLONG   SizeOfStackReserve;
    354     ULONGLONG   SizeOfStackCommit;
    355     ULONGLONG   SizeOfHeapReserve;
    356     ULONGLONG   SizeOfHeapCommit;
    357     ULONG       LoaderFlags;
    358     ULONG       NumberOfRvaAndSizes;
    359     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    360 } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
    361 
    362 //
    363 // Format Identifier Magics
    364 //
    365 #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
    366 #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
    367 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
    368 
    369 
    370 #ifdef _WIN64
    371 typedef IMAGE_OPTIONAL_HEADER64             IMAGE_OPTIONAL_HEADER;
    372 typedef PIMAGE_OPTIONAL_HEADER64            PIMAGE_OPTIONAL_HEADER;
    373 #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR64_MAGIC
    374 #else
    375 typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
    376 typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;
    377 #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR32_MAGIC
    378 #endif
    379 
    380 
    381 //
    382 // Nt Header Formats
    383 //
    384 typedef struct _IMAGE_NT_HEADERS64 {
    385     ULONG Signature;
    386     IMAGE_FILE_HEADER FileHeader;
    387     IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    388 } IMAGE_NT_HEADERS64;
    389 
    390 typedef struct _IMAGE_NT_HEADERS {
    391     ULONG Signature;
    392     IMAGE_FILE_HEADER FileHeader;
    393     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    394 } IMAGE_NT_HEADERS32;
    395 
    396 #ifdef _WIN64
    397 typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
    398 #else
    399 typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
    400 #endif
    401 
    402 #ifndef _NTDDK_
    403 
    404 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
    405 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
    406 
    407 #ifdef _WIN64
    408 typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;
    409 #else
    410 typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
    411 #endif
    412 
    413 #endif /* _NTDDK_ */
    414 
    415 //
    416 // Retreives the first image section header from the Nt Header
    417 //
    418 #define IMAGE_FIRST_SECTION( NtHeader ) ((PIMAGE_SECTION_HEADER)        \
    419     ((ULONG_PTR)(NtHeader) +                                            \
    420      FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
    421      ((NtHeader))->FileHeader.SizeOfOptionalHeader   \
    422     ))
    423 
    424 //
    425 // Dll Characteristics
    426 //
    427 #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE          0x0040
    428 #define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY       0x0080
    429 #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT             0x0100
    430 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION          0x0200
    431 #define IMAGE_DLLCHARACTERISTICS_NO_SEH                0x0400
    432 #define IMAGE_DLLCHARACTERISTICS_NO_BIND               0x0800
    433 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER            0x2000
    434 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
    435 
    436 //
    437 // Loader Flags
    438 //
    439 #define IMAGE_LOADER_FLAGS_COMPLUS       0x00000001
    440 #define IMAGE_LOADER_FLAGS_SYSTEM_GLOBAL 0x01000000
    441 
    442 //
    443 // Directory Entry Specifiers
    444 //
    445 #define IMAGE_DIRECTORY_ENTRY_EXPORT          0
    446 #define IMAGE_DIRECTORY_ENTRY_IMPORT          1
    447 #define IMAGE_DIRECTORY_ENTRY_RESOURCE        2
    448 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3
    449 #define IMAGE_DIRECTORY_ENTRY_SECURITY        4
    450 #define IMAGE_DIRECTORY_ENTRY_BASERELOC       5
    451 #define IMAGE_DIRECTORY_ENTRY_DEBUG           6
    452 #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7
    453 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8
    454 #define IMAGE_DIRECTORY_ENTRY_TLS             9
    455 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10
    456 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11
    457 #define IMAGE_DIRECTORY_ENTRY_IAT            12
    458 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13
    459 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
    460 
    461 
    462 //
    463 // Import Formats
    464 //
    465 typedef struct _IMAGE_IMPORT_BY_NAME {
    466     USHORT  Hint;
    467     UCHAR   Name[1];
    468 } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
    469 
    470 #include <pshpack8.h>
    471 typedef struct _IMAGE_THUNK_DATA64 {
    472     union {
    473         ULONGLONG ForwarderString;
    474         ULONGLONG Function;
    475         ULONGLONG Ordinal;
    476         ULONGLONG AddressOfData;
    477     } u1;
    478 } IMAGE_THUNK_DATA64, *PIMAGE_THUNK_DATA64;
    479 #include <poppack.h>
    480 
    481 typedef struct _IMAGE_THUNK_DATA32 {
    482     union {
    483         ULONG ForwarderString;
    484         ULONG Function;
    485         ULONG Ordinal;
    486         ULONG AddressOfData;
    487     } u1;
    488 } IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;
    489 
    490 #define IMAGE_ORDINAL_FLAG64 0x8000000000000000ULL
    491 #define IMAGE_ORDINAL_FLAG32 0x80000000
    492 #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
    493 #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
    494 #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
    495 #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
    496 
    497 
    498 //
    499 // Thread Local Storage (TLS)
    500 //
    501 typedef
    502 VOID
    503 (NTAPI *PIMAGE_TLS_CALLBACK) (
    504     PVOID DllHandle,
    505     ULONG Reason,
    506     PVOID Reserved
    507 );
    508 
    509 typedef struct _IMAGE_TLS_DIRECTORY64 {
    510     ULONGLONG   StartAddressOfRawData;
    511     ULONGLONG   EndAddressOfRawData;
    512     ULONGLONG   AddressOfIndex;
    513     ULONGLONG   AddressOfCallBacks;
    514     ULONG   SizeOfZeroFill;
    515     ULONG   Characteristics;
    516 } IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64;
    517 
    518 typedef struct _IMAGE_TLS_DIRECTORY32 {
    519     ULONG   StartAddressOfRawData;
    520     ULONG   EndAddressOfRawData;
    521     ULONG   AddressOfIndex;
    522     ULONG   AddressOfCallBacks;
    523     ULONG   SizeOfZeroFill;
    524     ULONG   Characteristics;
    525 } IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32;
    526 
    527 #ifdef _WIN64
    528 #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG64
    529 #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL64(Ordinal)
    530 typedef IMAGE_THUNK_DATA64              IMAGE_THUNK_DATA;
    531 typedef PIMAGE_THUNK_DATA64             PIMAGE_THUNK_DATA;
    532 #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL64(Ordinal)
    533 typedef IMAGE_TLS_DIRECTORY64           IMAGE_TLS_DIRECTORY;
    534 typedef PIMAGE_TLS_DIRECTORY64          PIMAGE_TLS_DIRECTORY;
    535 #else
    536 #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG32
    537 #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL32(Ordinal)
    538 typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
    539 typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;
    540 #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL32(Ordinal)
    541 typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
    542 typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;
    543 #endif
    544 
    545 typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    546     _ANONYMOUS_UNION union {
    547         ULONG   Characteristics;
    548         ULONG   OriginalFirstThunk;
    549     } DUMMYUNIONNAME;
    550     ULONG   TimeDateStamp;
    551     ULONG   ForwarderChain;
    552     ULONG   Name;
    553     ULONG   FirstThunk;
    554 } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
    555 
    556 #include <poppack.h>
    557 
    558 
    559 #endif /* _NTIMAGE_ */
    560 
    561