/* 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 * * Started on 25 Feb 2002 */ #ifndef DOS_H #define DOS_H #include /* 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 */