/* dos.h
* This file is part of Decomp - a disassembler. This file contains
* definitions used in the DOS/Win32 module.
*
* Copyright (C) 2002 Jonathan duSaint <dusaint@earthlink.net>
*
* Started on 25 Feb 2002
*/
#ifndef DOS_H
#define DOS_H
#include <stdint.h>
/* define some Windows types */
typedef uint8_t BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint64_t QWORD;
/* typedef uint128_t OWORD */
/* NE definitions */
#define NE_POS_ISNE_INDICATOR 0x18
#define NE_ISNE_INDICATOR 0x40
#define NE_POS_HEADER_OFFSET 0x3c
#define NE_MAKE_REAL_ADDRESS(segment,offset) (((DWORD)(segment) << 16) \
+ (DWORD)(offset))
struct ne_file_header {
char Signature[2]; /* NE */
BYTE LinkerMajorVersion;
BYTE LinkerMinorVersion;
WORD EntryTableOffset;
WORD EntryTableSize;
BYTE Reserved[4];
WORD Flags;
WORD AutoDataSegment;
WORD HeapSize;
WORD StackSize;
WORD CS;
WORD IP;
WORD SS;
WORD SP;
WORD SegmentTableEntries;
WORD ModuleRefTableEntries;
WORD NonresidentNameTableSize;
WORD SegmentTableOffset;
WORD ResourceTableOffset;
WORD ResidentNameTableOffset;
WORD ModuleReferenceTableOffset;
WORD ImportedNameTableOffset;
WORD NonresidentNameTableOffset;
WORD MovableEntryPoints;
WORD Alignment;
WORD ResourceSegments;
BYTE OperatingSystem;
BYTE AdditionalInformation;
WORD FastLoadSectorOffset;
WORD FastLoadSectorSize;
WORD Reserved1;
WORD WindowsVersion;
};
/* values for the Flags field */
#define NEFLAG_SINGLEDATA (1<<0)
#define NEFLAG_MULTIPLEDATA (1<<1)
#define NEFLAG_BOOTSTRAP (1<<11)
#define NEFLAG_HAS_ERRORS (1<<13)
#define NEFLAG_ISLIB (1<<15)
/* values for the OperatingSystem field */
#define NEOS_UNKNOWN (1<<0)
#define NEOS_MSWINDOWS (1<<2)
/* values for the AdditionalInformation field */
#define NEAINFO_PROTECTED (1<<1)
#define NEAINFO_PROPORTIONAL_FONTS (1<<2)
#define NEAINFO_FASTLOAD_AREA (1<<3)
struct ne_segment_header {
WORD SegmentDataSectorOffset; /* from file start to segment in sectors */
WORD SegmentLength; /* 0 -> 64K */
WORD Flags;
WORD AllocationSize; /* 0 -> 64K */
};
#define NE_SEGMENT_TYPE (1<<0)
#define NE_CODE_SEGMENT(flags) (!((flags) & NE_SEGMENT_TYPE))
#define NE_DATA_SEGMENT(flags) ((flags) & NE_SEGMENT_TYPE)
#define NE_MEM_ALLOCED (1<<1)
#define NE_SEGMENT_LOADED (1<<2)
#define NE_SEGMENT_MOVABLE (1<<4)
#define NE_SEGMENT_SHAREABLE (1<<5)
#define NE_SEGMENT_PRELOAD (1<<6)
#define NE_CODE_EXECUTEONLY (1<<7)
#define NE_DATA_READONLY (1<<7)
#define NE_CONTAINS_RELOC_DATA (1<<8)
#define NE_DISCARDABLE_SEGMENT (1<<12)
/* resource table ?? */
/* PE definitions */
#define PE_HEADER_OFFSET 0x3c
#define PE32_MAGIC 0x010b
#define PE32PLUS_MAGIC 0x020b
#define PE_ROM_MAGIC 0x0107 /* shouldn't see this */
/* number of optional header data directories */
#define N_OHDD 16
/* the names in this header may not be strictly correct, I'm just
going off of the documentation and some educated guesses. */
typedef struct _COFF_HEADER {
char PeSignature[4]; /* 4 byte signature (PE\0\0) */
WORD Machine; /* PE machine type */
WORD NumberOfSections; /* number of sections */
DWORD TimeDateStamp; /* time and date of file creation */
DWORD PointerToSymbolTable; /* file offset of the symbol table or 0 */
DWORD NumberOfSymbols; /* number of entries in the symbol table */
WORD SizeOfOptionalHeader; /* size of the optional header */
WORD Characteristics; /* attribute flags for this file */
} COFF_HEADER, *PCOFF_HEADER;
/* machine types (Machine field) */
#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 /* applicable to any machine */
#define IMAGE_FILE_MACHINE_ALPHA 0x184 /* AXP Alpha */
#define IMAGE_FILE_MACHINE_ARM 0x1c0 /* Strong ARM */
#define IMAGE_FILE_MACHINE_ALPHA64 0x284 /* 64 bit AXP Alpha (err??) */
#define IMAGE_FILE_MACHINE_I386 0x14c /* 386 and later */
#define IMAGE_FILE_MACHINE_IA64 0x200 /* IA-64 */
#define IMAGE_FILE_MACHINE_M68K 0x268 /* Motorola 68K series */
#define IMAGE_FILE_MACHINE_MIPS16 0x266 /* 16 bit MIPS */
#define IMAGE_FILE_MACHINE_MIPSFPU 0x366 /* MIPS with FPU */
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x466 /* 16 bit MIPS with FPU */
#define IMAGE_FILE_MACHINE_POWERPC 0x110 /* Power PC, little endian */
#define IMAGE_FILE_MACHINE_R3000 0x162
#define IMAGE_FILE_MACHINE_R4000 0x166 /* MIPS little endian */
#define IMAGE_FILE_MACHINE_R10000 0x168
#define IMAGE_FILE_MACHINE_SH3 0x1a2 /* Hitachi SH3 */
#define IMAGE_FILE_MACHINE_SH4 0x1a8 /* Hitachi SH4 */
#define IMAGE_FILE_MACHINE_THUMB 0x1c2
/* characteristics (Characteristics field) */
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
#define IMAGE_FILE_16BIT_MACHINE 0x0040
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
#define IMAGE_FILE_32BIT_MACHINE 0x0100
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
#define IMAGE_FILE_SYSTEM 0x1000
#define IMAGE_FILE_DLL 0x2000
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
/* optional header info */
typedef struct _PE32PLUS_OPTIONAL_HEADER {
/* standard fields */
WORD Magic; /* PE32/PE32+ magic number */
BYTE MajorLinkerVersion; /* linker major version number */
BYTE MinorLinkerVersion; /* linker minor version number */
DWORD SizeOfCode; /* size of all of the text sections */
DWORD SizeOfInitializedData; /* size of all the data sections */
DWORD SizeOfUninitializedData; /* size of all the bss sections */
DWORD AddressOfEntryPoint; /* relative entry point */
DWORD BaseOfCode; /* relative address of the start of
the code section */
/* Windows NT specific fields */
/* this next field is 32 bits in PE32 and 64 bits in PE32+ */
QWORD ImageBase; /* address of start of image in memory */
DWORD SectionAlignment; /* byte alignment of sections in memory */
DWORD FileAlignment; /* byte alignment of sections on disk */
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Reserved; /* dd (??) */
DWORD SizeOfImage; /* size of the image with headers */
DWORD SizeOfHeaders; /* size of the stubs/headers */
DWORD CheckSum; /* image checksum */
WORD Subsystem; /* Windows NT subsystem */
WORD DLLCharacteristics;
/* next field is 32 bits in PE32, 64 in PE32+ */
QWORD SizeOfStackReserve; /* size of stack to reserve */
/* next field is 32 bits in PE32, 64 in PE32+ */
QWORD SizeOfStackCommit; /* size of stack to commit */
/* next field is 32 bits in PE32, 64 in PE32+ */
QWORD SizeOfHeapReserve; /* size of heap to reserve */
/* next field is 32 bits in PE32, 64 in PE32+ */
QWORD SizeOfHeapCommit; /* size of heap to commit */
DWORD LoaderFlags; /* this field is obselete */
DWORD NumberOfRvaAndSizes; /* number of data dictionary entries */
} PE32PLUS_OPTIONAL_HEADER, *PPE32PLUS_OPTIONAL_HEADER;
typedef struct _PE32_OPTIONAL_HEADER {
/* standard fields */
WORD Magic; /* PE32/PE32+ magic number */
BYTE MajorLinkerVersion; /* linker major version number */
BYTE MinorLinkerVersion; /* linker minor version number */
DWORD SizeOfCode; /* size of all of the text sections */
DWORD SizeOfInitializedData; /* size of all the data sections */
DWORD SizeOfUninitializedData; /* size of all the bss sections */
DWORD AddressOfEntryPoint; /* relative entry point */
DWORD BaseOfCode; /* relative address of the start of
the code section */
/* this next field is only in PE32 files */
DWORD BaseOfData; /* relative address of the start of the data section */
/* Windows NT specific fields */
/* this next field is 32 bits in PE32 and 64 bits in PE32+ */
DWORD ImageBase; /* address of start of image in memory */
DWORD SectionAlignment; /* byte alignment of sections in memory */
DWORD FileAlignment; /* byte alignment of sections on disk */
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Reserved; /* dd (??) */
DWORD SizeOfImage; /* size of the image with headers */
DWORD SizeOfHeaders; /* size of the stubs/headers */
DWORD CheckSum; /* image checksum */
WORD Subsystem; /* Windows NT subsystem */
WORD DLLCharacteristics;
/* next field is 32 bits in PE32, 64 in PE32+ */
DWORD SizeOfStackReserve; /* size of stack to reserve */
/* next field is 32 bits in PE32, 64 in PE32+ */
DWORD SizeOfStackCommit; /* size of stack to commit */
/* next field is 32 bits in PE32, 64 in PE32+ */
DWORD SizeOfHeapReserve; /* size of heap to reserve */
/* next field is 32 bits in PE32, 64 in PE32+ */
DWORD SizeOfHeapCommit; /* size of heap to commit */
DWORD LoaderFlags; /* this field is obselete */
DWORD NumberOfRvaAndSizes; /* number of data dictionary entries */
} PE32_OPTIONAL_HEADER, *PPE32_OPTIONAL_HEADER;
#define MAGIC_PE32 0x10b
#define MAGIC_PE32_PLUS 0x20b
/* Subsystem field in optional header */
#define IMAGE_SUBSYSTEM_UNKNOWN 0
#define IMAGE_SUBSYSTEM_NATIVE 1
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
#define IMAGE_SUBSYSTEM_POSIX_CUI 7
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
/* DLLCharacteristics field in optional header */
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER 0x8000
/* optional header data directory */
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD RVA; /* relative virtual address (to base of image at runtime) */
DWORD Size; /* size in bytes */
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
/* section information */
typedef struct _SECTION_HEADER {
char Name[8];
DWORD VirtualSize;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} SECTION_HEADER, *PSECTION_HEADER;
/* section flags */
#define IMAGE_SCN_TYPE_REG 0x00000000
#define IMAGE_SCN_TYPE_DSECT 0x00000001
#define IMAGE_SCN_TYPE_NOLOAD 0x00000002
#define IMAGE_SCN_TYPE_GROUP 0x00000004
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008
#define IMAGE_SCN_TYPE_COPY 0x00000010
#define IMAGE_SCN_CNT_CODE 0x00000020
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
#define IMAGE_SCN_LNK_OTHER 0x00000100
#define IMAGE_SCN_LNK_INFO 0x00000200
#define IMAGE_SCN_TYPE_OVER 0x00000400
#define IMAGE_SCN_LNK_REMOVE 0x00000800
#define IMAGE_SCN_LNK_COMDAT 0x00001000
#define IMAGE_SCN_MEM_FARDATA 0x00008000
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 /* huh? these two */
#define IMAGE_SCN_MEM_16BIT 0x00020000 /* have the same value */
#define IMAGE_SCN_MEM_LOCKED 0x00040000
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
#define IMAGE_SCN_ALIGN_128BYTES 0x00800000
#define IMAGE_SCN_ALIGN_256BYTES 0x00900000
#define IMAGE_SCN_ALIGN_512BYTES 0x00a00000
#define IMAGE_SCN_ALIGN_1024BYTES 0x00b00000
#define IMAGE_SCN_ALIGN_2048BYTES 0x00c00000
#define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
#define IMAGE_SCN_ALIGN_8192BYTES 0x00e00000
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
#define IMAGE_SCN_MEM_SHARED 0x10000000
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
#define IMAGE_SCN_MEM_READ 0x40000000
#define IMAGE_SCN_MEM_WRITE 0x80000000
/* COFF relocations */
typedef struct _COFF_RELOCATIONS {
DWORD VirtualAddress;
DWORD SymbolTableIndex;
WORD Type;
} COFF_RELOCATIONS, *PCOFF_RELOCATIONS;
/* COFF relocation type indicators */
/* IA-32 */
#define IMAGE_REL_I386_ABSOLUTE 0x0000
#define IMAGE_REL_I386_DIR16 0x0001
#define IMAGE_REL_I386_REL16 0x0002
#define IMAGE_REL_I386_DIR32 0x0006
#define IMAGE_REL_I386_DIR32NB 0x0007
#define IMAGE_REL_I386_SEG12 0x0009
#define IMAGE_REL_I386_SECTION 0x000a
#define IMAGE_REL_I386_SECREL 0x000b
#define IMAGE_REL_I386_REL32 0x0014
/* Alpha */
#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
#define IMAGE_REL_ALPHA_REFLONG 0x0001
#define IMAGE_REL_ALPHA_REFQUAD 0x0002
#define IMAGE_REL_ALPHA_GPREL32 0x0003
#define IMAGE_REL_ALPHA_LITERAL 0x0004
#define IMAGE_REL_ALPHA_LITUSE 0x0005
#define IMAGE_REL_ALPHA_GPDISP 0x0006
#define IMAGE_REL_ALPHA_BRADDR 0x0007
#define IMAGE_REL_ALPHA_HINT 0x0008
#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
#define IMAGE_REL_ALPHA_REFHI 0x000a
#define IMAGE_REL_ALPHA_REFLO 0x000b
#define IMAGE_REL_ALPHA_PAIR 0x000c
#define IMAGE_REL_ALPHA_MATCH 0x000d
#define IMAGE_REL_ALPHA_SECTION 0x000e
#define IMAGE_REL_ALPHA_SECREL 0x000f
#define IMAGE_REL_ALPHA_REFLONGNB 0x0010
#define IMAGE_REL_ALPHA_SECRELLO 0x0011
#define IMAGE_REL_ALPHA_SECRELHI 0x0012
#define IMAGE_REL_ALPHA_REFQ3 0x0013
#define IMAGE_REL_ALPHA_REFQ2 0x0014
#define IMAGE_REL_ALPHA_REFQ1 0x0015
#define IMAGE_REL_ALPHA_GPRELLO 0x0016
#define IMAGE_REL_ALPHA_GPRELHI 0x0017
/* IBM PowerPC */
/* Hitachi SuperH */
/* ARM */
/* MIPS */
/* if I ever get around to including support for these processors,
then I'll fill out these sections */
/* COFF line numbers */
typedef struct _COFF_LINE_NUMBERS {
union {
DWORD SymbolTableIndex;
DWORD RVA;
} Type;
WORD Linenumber;
DWORD SymbolTableIndex;
DWORD VirtualAddress;
} COFF_LINE_NUMBERS, *PCOFF_LINE_NUMBERS;
/* COFF symbol table */
#define SIZE_SYMBOL_TABLE 18
typedef struct _COFF_SYMBOL_TABLE {
union {
char ShortName[8];
struct {
DWORD Zeroes;
DWORD Offset;
} LongName;
} Name;
DWORD Value;
WORD SectionNumber;
WORD Type;
BYTE StorageClass;
BYTE NumberOfAuxSymbols;
} COFF_SYMBOL_TABLE, *PCOFF_SYMBOL_TABLE;
/* section number values */
#define IMAGE_SYM_UNDEFINED (0UL)
#define IMAGE_SYM_ABSOLUTE (-1UL)
#define IMAGE_SYM_DEBUG (-2UL)
/* type representation */
/* simple types */
#define IMAGE_TYPE_MSB(type) ((type) >> 8)
/* complex types */
#define IMAGE_TYPE_LSB(type) ((type) & 0x00ff)
/* LSB */
#define IMAGE_SYM_TYPE_NULL 0 /* Microsoft tools use this setting */
#define IMAGE_SYM_TYPE_VOID 1
#define IMAGE_SYM_TYPE_CHAR 2
#define IMAGE_SYM_TYPE_SHORT 3
#define IMAGE_SYM_TYPE_INT 4
#define IMAGE_SYM_TYPE_LONG 5
#define IMAGE_SYM_TYPE_FLOAT 6
#define IMAGE_SYM_TYPE_DOUBLE 7
#define IMAGE_SYM_TYPE_STRUCT 8
#define IMAGE_SYM_TYPE_UNION 9
#define IMAGE_SYM_TYPE_ENUM 10
#define IMAGE_SYM_TYPE_MOE 11
#define IMAGE_SYM_TYPE_BYTE 12
#define IMAGE_SYM_TYPE_WORD 13
#define IMAGE_SYM_TYPE_UINT 14
#define IMAGE_SYM_TYPE_DWORD 15
/* MSB */
#define IMAGE_SYM_DTYPE_NULL 0 /* Microsoft tools use either this value */
#define IMAGE_SYM_DTYPE_POINTER 1
#define IMAGE_SYM_DTYPE_FUNCTION 2 /* or this one */
#define IMAGE_SYM_DTYPE_ARRAY 3
/* storage class */
#define IMAGE_SYM_CLASS_END_OF_FUNCTION 0xff /* -1 */
#define IMAGE_SYM_CLASS_NULL 0
#define IMAGE_SYM_CLASS_AUTOMATIC 1
#define IMAGE_SYM_CLASS_EXTERNAL 2
#define IMAGE_SYM_CLASS_STATIC 3
#define IMAGE_SYM_CLASS_REGISTER 4
#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5
#define IMAGE_SYM_CLASS_LABEL 6
#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7
#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8
#define IMAGE_SYM_CLASS_ARGUMENT 9
#define IMAGE_SYM_CLASS_STRUCT_TAG 10
#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11
#define IMAGE_SYM_CLASS_UNION_TAG 12
#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13
#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14
#define IMAGE_SYM_CLASS_ENUM_TAG 15
#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16
#define IMAGE_SYM_CLASS_REGISTER_PARAM 17
#define IMAGE_SYM_CLASS_BIT_FIELD 18
#define IMAGE_SYM_CLASS_BLOCK 100
#define IMAGE_SYM_CLASS_FUNCTION 101
#define IMAGE_SYM_CLASS_END_OF_STRUCT 102
#define IMAGE_SYM_CLASS_FILE 103
#define IMAGE_SYM_CLASS_SECTION 104
#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105
/* Auxiliary symbol records - these will always be 18 bytes */
/* format 1: function definitions */
typedef struct _AUXILIARY_FORMAT_ONE {
DWORD TagIndex;
DWORD TotalSize;
DWORD PointerToLinenumber;
DWORD PointerToNextFunction;
BYTE Unused[2];
} AUXILIARY_FORMAT_ONE, *PAUXILIARY_FORMAT_ONE;
/* format 2: .bf and .ef symbols */
typedef struct _AUXILIARY_FORMAT_TWO {
BYTE Unused1[4];
WORD Linenumber;
BYTE Unused2[6];
DWORD PointerToNextFunction; /* only used with .bf */
BYTE Unused3[2];
} AUXILIARY_FORMAT_TWO, *PAUXILIARY_FORMAT_TWO;
/* format 3: weak externals */
typedef struct _AUXILIARY_FORMAT_THREE {
DWORD TagIndex;
DWORD Characteristics;
BYTE Unused[10];
} AUXILIARY_FORMAT_THREE, *PAUXILIARY_FORMAT_THREE;
/* format 4: files */
typedef struct _AUXILIARY_FORMAT_FOUR {
char FileName[18];
} AUXILIARY_FORMAT_FOUR, *PAUXILIARY_FORMAT_FOUR;
/* format 5: section definitions */
typedef struct _AUXILIARY_FORMAT_FIVE {
DWORD Length;
WORD NumberOfRelocations;
WORD NumberOfLineNumbers;
DWORD CheckSum;
WORD Number;
BYTE Selection;
BYTE Unused[3];
} AUXILIARY_FORMAT_FIVE, *PAUXILIARY_FORMAT_FIVE;
/* COMDAT sections */
#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
#define IMAGE_COMDAT_SELECT_ANY 2
#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
#define IMAGE_COMDAT_SELECT_LARGEST 6
/* Attribute Certificate table */
typedef struct _ATTRIBUTE_CERTIFICATE_TABLE_ENTRY {
DWORD CertificateData;
DWORD SizeOfCertificate;
} ATTRIBUTE_CERTIFICATE_TABLE_ENTRY, *PATTRIBUTE_CERTIFICATE_TABLE_ENTRY;
/* Delay-Load Import table */
typedef struct _DELAY_LOAD_DIRECTORY_TABLE {
DWORD Attributes;
DWORD Name;
DWORD ModuleHandle;
DWORD DelayImportAddressTable;
DWORD DelayImportNameTable;
DWORD BoundDelayImportTable;
DWORD UnloadDelayImportTable;
DWORD TimeStamp;
} DELAY_LOAD_DIRECTORY_TABLE, *PDELAY_LOAD_DIRECTORY_TABLE;
/* the .debug section */
/* debug directory */
typedef struct _DEBUG_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Type;
DWORD SizeOfData;
DWORD AddressOfRawData;
DWORD PointerToRawData;
} DEBUG_DIRECTORY, *PDEBUG_DIRECTORY;
/* debug type */
#define IMAGE_DEBUG_TYPE_UNKNOWN 0
#define IMAGE_DEBUG_TYPE_COFF 1
#define IMAGE_DEBUG_TYPE_CODEVIEW 2
#define IMAGE_DEBUG_TYPE_FPO 3
#define IMAGE_DEBUG_TYPE_MISC 4
#define IMAGE_DEBUG_TYPE_EXCEPTION 5
#define IMAGE_DEBUG_TYPE_FIXUP 6
#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
#define IMAGE_DEBUG_TYPE_BORLAND 9
/* .edata section - exported symbols */
/* ignore for now (pg 49) */
/* .idata section - imported symbols */
/* ignore for now (pg 52) */
/* .pdata section - function pointers for exception handling */
/* ignore for now (pg 54) */
/* .reloc section */
/* ignore for now (pg 55) */
/* .tls section */
/* ignore for now (pg 57) */
/* .rsrc section */
/* resource directory table */
typedef struct _RESOURCE_DIRECTORY_TABLE {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
WORD NumberOfNameEntries;
WORD NumberOfIDEntries;
} RESOURCE_DIRECTORY_TABLE, *PRESOURCE_DIRECTORY_TABLE;
/* resource directory entries */
typedef struct _RESOURCE_DIRECTORY_ENTRY {
DWORD NameRVA;
DWORD IntegerID;
DWORD DataEntryRVA;
DWORD SubdirectoryRVA;
} RESOURCE_DIRECTORY_ENTRY, *PRESOURCE_DIRECTORY_ENTRY;
/* resource directory string */
/* 2 byte length field followed by LENGTH sized unicode string */
/* resource data entry */
#endif /* !DOS_H */