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