176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    PE32+ header file
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _PE_H
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _PE_H
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_OS2_SIGNATURE                 0x454E      // NE
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_NT_SIGNATURE                  0x00004550  // PE00
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_EDOS_SIGNATURE                0x44454550  // PEED
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_magic;                     // Magic number
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_cblp;                      // Bytes on last page of file
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_cp;                        // Pages in file
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_crlc;                      // Relocations
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_cparhdr;                   // Size of header in paragraphs
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_minalloc;                  // Minimum extra paragraphs needed
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_maxalloc;                  // Maximum extra paragraphs needed
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_ss;                        // Initial (relative) SS value
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_sp;                        // Initial SP value
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_csum;                      // Checksum
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_ip;                        // Initial IP value
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_cs;                        // Initial (relative) CS value
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_lfarlc;                    // File address of relocation table
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_ovno;                      // Overlay number
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_res[4];                    // Reserved words
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_oemid;                     // OEM identifier (for e_oeminfo)
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_oeminfo;                   // OEM information; e_oemid specific
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   e_res2[10];                  // Reserved words
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   e_lfanew;                    // File address of new exe header
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_OS2_HEADER {      // OS/2 .EXE header
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_magic;                    // Magic number
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8    ne_ver;                      // Version number
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8    ne_rev;                      // Revision number
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_enttab;                   // Offset of Entry Table
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cbenttab;                 // Number of bytes in Entry Table
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ne_crc;                      // Checksum of whole file
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_flags;                    // Flag UINT16
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_autodata;                 // Automatic data segment number
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_heap;                     // Initial heap allocation
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_stack;                    // Initial stack allocation
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ne_csip;                     // Initial CS:IP setting
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ne_sssp;                     // Initial SS:SP setting
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cseg;                     // Count of file segments
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cmod;                     // Entries in Module Reference Table
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cbnrestab;                // Size of non-resident name table
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_segtab;                   // Offset of Segment Table
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_rsrctab;                  // Offset of Resource Table
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_restab;                   // Offset of resident name table
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_modtab;                   // Offset of Module Reference Table
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_imptab;                   // Offset of Imported Names Table
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ne_nrestab;                  // Offset of Non-resident Names Table
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cmovent;                  // Count of movable entries
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_align;                    // Segment alignment shift count
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_cres;                     // Count of resource segments
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8    ne_exetyp;                   // Target Operating system
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8    ne_flagsothers;              // Other .EXE flags
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_pretthunks;               // offset to return thunks
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_psegrefbytes;             // offset to segment ref. bytes
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_swaparea;                 // Minimum code swap area size
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   ne_expver;                   // Expected Windows version number
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// File header format.
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_FILE_HEADER {
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   Machine;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   NumberOfSections;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   TimeDateStamp;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   PointerToSymbolTable;
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   NumberOfSymbols;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   SizeOfOptionalHeader;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   Characteristics;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_FILE_HEADER             20
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_UNKNOWN           0
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_I386              0x14c   // Intel 386.
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_R3000             0x162   // MIPS little-endian, 0540 big-endian
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_R4000             0x166   // MIPS little-endian
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_ALPHA             0x184   // Alpha_AXP
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED    0x1c2   // Arm/Thumb
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_POWERPC           0x1F0   // IBM PowerPC Little-Endian
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_IA64              0x200   // IA-64
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_TAHOE             0x7cc   // Intel EM machine
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_EBC               0xebc   // EFI Byte Code
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FILE_MACHINE_X64               0x8664  // x86_64
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Directory format.
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_DATA_DIRECTORY {
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   VirtualAddress;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Size;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Optional header format.
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_OPTIONAL_HEADER {
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Standard fields.
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16    Magic;
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     MajorLinkerVersion;
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     MinorLinkerVersion;
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    SizeOfCode;
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    SizeOfInitializedData;
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    SizeOfUninitializedData;
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    AddressOfEntryPoint;
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    BaseOfCode;
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32    BaseOfData;
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // NT additional fields.
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ImageBase;
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SectionAlignment;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   FileAlignment;
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MajorOperatingSystemVersion;
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MinorOperatingSystemVersion;
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MajorImageVersion;
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MinorImageVersion;
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MajorSubsystemVersion;
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MinorSubsystemVersion;
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Reserved1;
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfImage;
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfHeaders;
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   CheckSum;
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   Subsystem;
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   DllCharacteristics;
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfStackReserve;
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfStackCommit;
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfHeapReserve;
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfHeapCommit;
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   LoaderFlags;
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   NumberOfRvaAndSizes;
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_ROM_OPTIONAL_HEADER {
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16  Magic;
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8   MajorLinkerVersion;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8   MinorLinkerVersion;
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  SizeOfCode;
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  SizeOfInitializedData;
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  SizeOfUninitializedData;
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  AddressOfEntryPoint;
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  BaseOfCode;
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  BaseOfData;
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  BaseOfBss;
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  GprMask;
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  CprMask[4];
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32  GpValue;
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER      56
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER      28
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER      224
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_NT_OPTIONAL_HDR_MAGIC        0x10b
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_NT_HEADERS {
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32 Signature;
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IMAGE_FILE_HEADER FileHeader;
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IMAGE_OPTIONAL_HEADER OptionalHeader;
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_ROM_HEADERS {
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IMAGE_FILE_HEADER FileHeader;
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ((UINT32)ntheader +                                                  \
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ))
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Subsystem Values
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image run  in the Posix character subsystem.
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Directory Entries
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_EXPORT         0   // Export Directory
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_IMPORT         1   // Import Directory
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_RESOURCE       2   // Resource Directory
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_EXCEPTION      3   // Exception Directory
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_SECURITY       4   // Security Directory
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_BASERELOC      5   // Base Relocation Table
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_DEBUG          6   // Debug Directory
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT      7   // Description String
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8   // Machine Value (MIPS GP)
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_TLS            9   // TLS Directory
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   10   // Load Configuration Directory
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Section header format.
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_SHORT_NAME              8
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_SECTION_HEADER {
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8   Name[IMAGE_SIZEOF_SHORT_NAME];
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            UINT32   PhysicalAddress;
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            UINT32   VirtualSize;
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } Misc;
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   VirtualAddress;
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfRawData;
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   PointerToRawData;
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   PointerToRelocations;
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   PointerToLinenumbers;
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   NumberOfRelocations;
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   NumberOfLinenumbers;
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Characteristics;
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_SECTION_HEADER          40
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Symbol format.
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_SYMBOL                  18
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Section values.
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Symbols have a section number of the section in which they are
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// defined. Otherwise, section numbers have the following meanings:
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_UNDEFINED           (UINT16)0           // Symbol is undefined or is common.
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_ABSOLUTE            (UINT16)-1          // Symbol is an absolute value.
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_DEBUG               (UINT16)-2          // Symbol is a special debug item.
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Type (fundamental) values.
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_NULL                  0           // no type.
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_VOID                  1           //
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_CHAR                  2           // type character.
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_SHORT                 3           // type short integer.
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_INT                   4           //
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_LONG                  5           //
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_FLOAT                 6           //
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_DOUBLE                7           //
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_STRUCT                8           //
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_UNION                 9           //
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_ENUM                  10          // enumeration.
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_MOE                   11          // member of enumeration.
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_BYTE                  12          //
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_WORD                  13          //
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_UINT                  14          //
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_TYPE_DWORD                 15          //
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Type (derived) values.
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_DTYPE_NULL                 0           // no derived type.
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_DTYPE_POINTER              1           // pointer.
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_DTYPE_FUNCTION             2           // function.
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_DTYPE_ARRAY                3           // array.
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Storage classes.
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_END_OF_FUNCTION      (BYTE )-1
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_NULL                 0
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_AUTOMATIC            1
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_EXTERNAL             2
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_STATIC               3
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_REGISTER             4
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_EXTERNAL_DEF         5
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_LABEL                6
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_UNDEFINED_LABEL      7
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT     8
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_ARGUMENT             9
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_STRUCT_TAG           10
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_MEMBER_OF_UNION      11
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_UNION_TAG            12
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_TYPE_DEFINITION      13
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_UNDEFINED_STATIC     14
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_ENUM_TAG             15
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM       16
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_REGISTER_PARAM       17
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_BIT_FIELD            18
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_BLOCK                100
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_FUNCTION             101
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_END_OF_STRUCT        102
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_FILE                 103
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// new
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_SECTION              104
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SYM_CLASS_WEAK_EXTERNAL        105
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// type packing constants
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_BTMASK                            017
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_TMASK                             060
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_TMASK1                            0300
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_TMASK2                            0360
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_BTSHFT                            4
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define N_TSHIFT                            2
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// MACROS
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Communal selection types.
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_COMDAT_SELECT_NODUPLICATES   1
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_COMDAT_SELECT_ANY            2
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_COMDAT_SELECT_SAME_SIZE      3
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_COMDAT_SELECT_EXACT_MATCH    4
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_COMDAT_SELECT_ASSOCIATIVE    5
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   2
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS     3
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Relocation format.
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_RELOCATION {
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   VirtualAddress;
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SymbolTableIndex;
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16    Type;
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_RELOCATION;
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_RELOCATION              10
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// I386 relocation types.
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_DIR16                 01          // Direct 16-bit reference to the symbols virtual address
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_REL16                 02          // PC-relative 16-bit reference to the symbols virtual address
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_DIR32                 06          // Direct 32-bit reference to the symbols virtual address
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_DIR32NB               07          // Direct 32-bit reference to the symbols virtual address, base not included
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_SEG12                 011         // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_SECTION               012
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_SECREL                013
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_I386_REL32                 024         // PC-relative 32-bit reference to the symbols virtual address
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// MIPS relocation types.
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_ABSOLUTE              0           // Reference is absolute, no relocation is necessary
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_REFHALF               01
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_REFWORD               02
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_JMPADDR               03
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_REFHI                 04
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_REFLO                 05
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_GPREL                 06
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_LITERAL               07
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_SECTION               012
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_SECREL                013
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_REFWORDNB             042
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_MIPS_PAIR                  045
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Alpha Relocation types.
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_ABSOLUTE             0x0
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_REFLONG              0x1
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_REFQUAD              0x2
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_GPREL32              0x3
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_LITERAL              0x4
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_LITUSE               0x5
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_GPDISP               0x6
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_BRADDR               0x7
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_HINT                 0x8
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_INLINE_REFLONG       0x9
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_REFHI                0xA
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_REFLO                0xB
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_PAIR                 0xC
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_MATCH                0xD
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_SECTION              0xE
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_SECREL               0xF
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_ALPHA_REFLONGNB            0x10
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// IBM PowerPC relocation types.
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ABSOLUTE 0x0000  // NOP
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR64   0x0001  // 64-bit address
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR32   0x0002  // 32-bit address
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR24   0x0003  // 26-bit address, shifted left 2 (branch absolute)
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR16   0x0004  // 16-bit address
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR14   0x0005  // 16-bit address, shifted left 2 (load doubleword)
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_REL24    0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_REL14    0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_TOCREL16 0x0008  // 16-bit offset from TOC base
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_TOCREL14 0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_ADDR32NB 0x000A  // 32-bit addr w/o image base
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_SECREL   0x000B  // va of containing section (as in an image sectionhdr)
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_SECTION  0x000C  // sectionheader number
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_IFGLUE   0x000D  // substitute TOC restore instruction iff symbol is glue code
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_IMGLUE   0x000E  // symbol is glue code; virtual address is TOC restore instruction
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_TYPEMASK 0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Flag bits in IMAGE_RELOCATION.TYPE
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_NEG      0x0100  // subtract reloc value rather than adding it
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_BRTAKEN  0x0200  // fix branch prediction bit to predict branch taken
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_BRNTAKEN 0x0400  // fix branch prediction bit to predict branch not taken
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_PPC_TOCDEFN  0x0800  // toc slot defined in file (or, data in toc)
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Based relocation format.
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_BASE_RELOCATION {
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   VirtualAddress;
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   SizeOfBlock;
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  UINT16    TypeOffset[1];
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_BASE_RELOCATION         8
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Based relocation types.
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_ABSOLUTE              0
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_HIGH                  1
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_LOW                   2
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_HIGHLOW               3
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_HIGHADJ               4
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_MIPS_JMPADDR          5
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_IA64_IMM64            9
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_REL_BASED_DIR64                 10
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Line number format.
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_LINENUMBER {
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        UINT32   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        UINT32   VirtualAddress;                 // Virtual address of line number.
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } Type;
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16    Linenumber;                         // Line number.
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_LINENUMBER;
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_LINENUMBER              6
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Archive format.
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_START_SIZE             8
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_START                  "!<arch>\n"
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_END                    "`\n"
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_PAD                    "\n"
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     Name[16];                          // File member name - `/' terminated.
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     Date[12];                          // File member date - decimal.
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     UserID[6];                         // File member user id - decimal.
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     GroupID[6];                        // File member group id - decimal.
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     Mode[8];                           // File member mode - octal.
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     Size[10];                          // File member size - decimal.
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     EndHeader[2];                      // String to end header.
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// DLL support.
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Export Format
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_EXPORT_DIRECTORY {
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Characteristics;
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   TimeDateStamp;
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MajorVersion;
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16   MinorVersion;
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Name;
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Base;
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   NumberOfFunctions;
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   NumberOfNames;
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   *AddressOfFunctions;
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   *AddressOfNames;
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   *AddressOfNameOrdinals;
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Import Format
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_IMPORT_BY_NAME {
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT16    Hint;
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT8     Name[1];
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_THUNK_DATA {
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    union {
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        UINT32 Function;
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        UINT32 Ordinal;
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        PIMAGE_IMPORT_BY_NAME AddressOfData;
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } u1;
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ORDINAL_FLAG 0x80000000
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _IMAGE_IMPORT_DESCRIPTOR {
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Characteristics;
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   TimeDateStamp;
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   ForwarderChain;
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32   Name;
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    PIMAGE_THUNK_DATA FirstThunk;
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
596