1 #ifndef NE_SPECS_H 2 #define NE_SPECS_H 3 4 enum { 5 LOBYTE = 0, 6 SEL_16 = 2, 7 POI_32 = 3, 8 OFF_16 = 5, 9 POI_48 = 11, 10 OFF_32 = 13 11 }; 12 13 enum { 14 INTERNAL_REF = 0, 15 IMPORTED_ORD = 1, 16 IMPORTED_NAME = 2, 17 OSFIXUP = 3, 18 ADDITIVE = 4 19 }; 20 21 typedef struct _RELOC { 22 ut8 type; 23 ut8 flags; 24 ut16 offset; 25 union { 26 ut16 index; 27 struct { // internal_fixed 28 ut8 segnum; 29 ut8 zero; 30 ut16 segoff; 31 }; 32 struct { // internal_moveable 33 ut16 ignore; 34 ut16 entry_ordinal; 35 }; 36 struct { // import_ordinal 37 ut16 align1; 38 ut16 func_ord; 39 }; 40 struct { // import_name 41 ut16 align2; 42 ut16 name_off; 43 }; 44 }; 45 } NE_image_reloc_item; 46 47 enum { 48 IS_DATA = 1, 49 IS_MOVEABLE = 0x10, 50 IS_SHAREABLE = 0x20, 51 IS_PRELOAD = 0x40, 52 RELOCINFO = 0x100, 53 IS_RX = 0x1000 54 }; 55 56 enum { 57 NOAUTODATA = 0, 58 SINGLEDATA = 1, 59 LINKERROR = 0x2000, 60 LIBRARY = 0x8000 61 }; 62 63 typedef struct _SEGMENT { 64 ut16 offset; //Specifies the offset, in sectors, to the segment data (relative to the beginning of the file). A value of zero means no data exists. 65 ut16 length; //Length of the segment in bytes. A value of zero indicates that the segment length is 64K, unless the selector offset is also zero. 66 ut16 flags; // NE_SEGMENT_FLAGS 67 ut16 minAllocSz; //A value of zero indicates that the minimum allocation size is 64K 68 } NE_image_segment_entry; 69 70 typedef struct _NAMEINFO { 71 ut16 rnOffset; 72 ut16 rnLength; 73 ut16 rnFlags; 74 ut16 rnID; 75 ut16 rnHandle; 76 ut16 rnUsage; 77 } NE_image_nameinfo_entry; 78 79 typedef struct _TYPEINFO { 80 ut16 rtTypeID; 81 ut16 rtResourceCount; 82 ut32 rtReserved; 83 NE_image_nameinfo_entry rtNameInfo[]; 84 } NE_image_typeinfo_entry; 85 86 typedef struct { 87 char sig[2]; // "NE" 88 ut8 MajLinkerVersion; // The major linker version 89 ut8 MinLinkerVersion; // The minor linker version 90 ut16 EntryTableOffset; // Offset of entry table 91 ut16 EntryTableLength; // Length of entry table in bytes 92 ut32 FileLoadCRC; // 32-bit CRC of entire contents of file 93 ut8 ProgFlags; // Program flags, bitmapped 94 ut8 ApplFlags; // Application flags, bitmapped 95 ut8 AutoDataSegIndex; // The automatic data segment index 96 ut16 InitHeapSize; // The intial local heap size 97 ut16 InitStackSize; // The inital stack size 98 ut16 ipEntryPoint; // IP entry point offset 99 ut16 csEntryPoint; // CS entrypoint index into segment table (Start at 1) 100 ut32 InitStack; // SS:SP inital stack pointer, SS is index into segment table 101 ut16 SegCount; // Number of segments in segment table 102 ut16 ModRefs; // Number of module references (DLLs) 103 ut16 NoResNamesTabSiz; // Size of non-resident names table, in bytes 104 ut16 SegTableOffset; // Offset of Segment table 105 ut16 ResTableOffset; // Offset of resources table 106 ut16 ResidNamTable; // Offset of resident names table 107 ut16 ModRefTable; // Offset of module reference table 108 ut16 ImportNameTable; // Offset of imported names table (array of counted strings, terminated with string of length 00h) 109 ut32 OffStartNonResTab; // Offset from start of file to non-resident names table 110 ut16 MovEntryCount; // Count of moveable entry point listed in entry table 111 ut16 FileAlnSzShftCnt; // File alligbment size shift count (0=9(default 512 byte pages)) 112 ut16 nResTabEntries; // Number of resource table entries 113 ut8 targOS; // Target OS 114 ut8 OS2EXEFlags; // Other OS/2 flags 115 ut16 retThunkOffset; // Offset to return thunks or start of gangload area - what is gangload? 116 ut16 segrefthunksoff; // Offset to segment reference thunks or size of gangload area 117 ut16 mincodeswap; // Minimum code swap area size 118 ut8 expctwinver[2]; // Expected windows version (minor first) 119 } NE_image_header; 120 121 #endif