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