1 /* $Id: neexe.h,v 1.4 1993/07/04 04:04:21 root Exp root $
4 * Copyright Robert J. Amstadt, 1993
12 * Old MZ header for DOS programs. Actually just a couple of fields
13 * from it, so that we can find the start of the NE header.
17 WORD mz_magic; /* MZ Header signature */
18 BYTE dont_care[0x3a]; /* MZ Header stuff */
19 WORD ne_offset; /* Offset to extended header */
22 #define MZ_SIGNATURE ('M' | ('Z' << 8))
25 * This is the Windows executable (NE) header.
29 WORD ne_magic; /* NE signature 'NE' */
30 BYTE linker_version; /* Linker version number */
31 BYTE linker_revision; /* Linker revision number */
32 WORD entry_tab_offset; /* Offset to entry table relative to NE */
33 WORD entry_tab_length; /* Length of entry table in bytes */
34 DWORD reserved1; /* Reserved by Microsoft */
35 WORD format_flags; /* Flags about segments in this file */
36 WORD auto_data_seg; /* Automatic data segment number */
37 WORD local_heap_length; /* Initial size of local heap */
38 WORD stack_length; /* Initial size of stack */
39 WORD ip; /* Initial IP */
40 WORD cs; /* Initial CS */
41 WORD sp; /* Initial SP */
42 WORD ss; /* Initial SS */
43 WORD n_segment_tab; /* # of entries in segment table */
44 WORD n_mod_ref_tab; /* # of entries in module reference tab.*/
45 WORD nrname_tab_length; /* Length of nonresident-name table */
46 WORD segment_tab_offset; /* Offset to segment table */
47 WORD resource_tab_offset;/* Offset to resource table */
48 WORD rname_tab_offset; /* Offset to resident-name table */
49 WORD moduleref_tab_offset;/* Offset to module reference table */
50 WORD iname_tab_offset; /* Offset to imported name table */
51 DWORD nrname_tab_offset; /* Offset to nonresident-name table */
52 WORD n_mov_entry_points; /* # of movable entry points */
53 WORD align_shift_count; /* Logical sector alignment shift count */
54 WORD n_resource_seg; /* # of resource segments */
55 BYTE operating_system; /* Flags indicating target OS */
56 BYTE additional_flags; /* Additional information flags */
57 WORD fastload_offset; /* Offset to fast load area */
58 WORD fastload_length; /* Length of fast load area */
59 WORD reserved2; /* Reserved by Microsoft */
60 WORD expect_version; /* Expected Windows version number */
63 #define NE_SIGNATURE ('N' | ('E' << 8))
64 #define PE_SIGNATURE ('P' | ('E' << 8))
67 * NE Header FORMAT FLAGS
69 #define NE_FFLAGS_SINGLEDATA 0x0001
70 #define NE_FFLAGS_MULTIPLEDATA 0x0002
71 #define NE_FFLAGS_SELFLOAD 0x0800
72 #define NE_FFLAGS_LINKERROR 0x2000
73 #define NE_FFLAGS_LIBMODULE 0x8000
76 * NE Header OPERATING SYSTEM
78 #define NE_OSFLAGS_UNKNOWN 0x01
79 #define NE_OSFLAGS_WINDOWS 0x04
82 * NE Header ADDITIONAL FLAGS
84 #define NE_AFLAGS_WIN2_PROTMODE 0x02
85 #define NE_AFLAGS_WIN2_PROFONTS 0x04
86 #define NE_AFLAGS_FASTLOAD 0x08
91 struct ne_segment_table_entry_s
93 WORD seg_data_offset; /* Sector offset of segment data */
94 WORD seg_data_length; /* Length of segment data */
95 WORD seg_flags; /* Flags associated with this segment */
96 WORD min_alloc; /* Minimum allocation size for this */
102 #define NE_SEGFLAGS_DATA 0x0001
103 #define NE_SEGFLAGS_ALLOCATED 0x0002
104 #define NE_SEGFLAGS_LOADED 0x0004
105 #define NE_SEGFLAGS_ITERATED 0x0008
106 #define NE_SEGFLAGS_MOVEABLE 0x0010
107 #define NE_SEGFLAGS_SHAREABLE 0x0020
108 #define NE_SEGFLAGS_PRELOAD 0x0040
109 #define NE_SEGFLAGS_EXECUTEONLY 0x0080
110 #define NE_SEGFLAGS_READONLY 0x0080
111 #define NE_SEGFLAGS_RELOC_DATA 0x0100
112 #define NE_SEGFLAGS_DISCARDABLE 0x1000
115 * Relocation table entry
117 struct relocation_entry_s
119 BYTE address_type; /* Relocation address type */
120 BYTE relocation_type; /* Relocation type */
121 WORD offset; /* Offset in segment to fixup */
122 WORD target1; /* Target specification */
123 WORD target2; /* Target specification */
127 * Relocation address types
129 #define NE_RADDR_LOWBYTE 0
130 #define NE_RADDR_SELECTOR 2
131 #define NE_RADDR_POINTER32 3
132 #define NE_RADDR_OFFSET16 5
133 #define NE_RADDR_POINTER48 11
134 #define NE_RADDR_OFFSET32 13
139 #define NE_RELTYPE_INTERNAL 0
140 #define NE_RELTYPE_ORDINAL 1
141 #define NE_RELTYPE_NAME 2
142 #define NE_RELTYPE_OSFIXUP 3
143 #define NE_RELFLAG_ADDITIVE 4
150 unsigned short pspInt20;
151 unsigned short pspNextParagraph;
152 unsigned char pspReserved1;
153 unsigned char pspDispatcher[5];
154 unsigned short pspTerminateVector[2];
155 unsigned short pspControlCVector[2];
156 unsigned short pspCritErrorVector[2];
157 unsigned short pspReserved2[11];
158 unsigned short pspEnvironment;
159 unsigned short pspReserved3[23];
160 unsigned char pspFCB_1[16];
161 unsigned char pspFCB_2[16];
162 unsigned char pspReserved4[4];
163 unsigned char pspCommandTailCount;
164 unsigned char pspCommandTail[128];
168 * Entry table structures.
170 struct entry_tab_header_s
172 unsigned char n_entries;
173 unsigned char seg_number;
176 struct entry_tab_movable_s
179 unsigned char int3f[2];
180 unsigned char seg_number;
181 unsigned short offset;
184 struct entry_tab_fixed_s
187 unsigned char offset[2];
191 * Resource table structures.
193 struct resource_nameinfo_s
195 unsigned short offset;
196 unsigned short length;
197 unsigned short flags;
199 unsigned short handle;
200 unsigned short usage;
203 struct resource_typeinfo_s
205 unsigned short type_id; /* Type identifier */
206 unsigned short count; /* Number of resources of this type */
207 unsigned long reserved;
213 #define NE_RSCTYPE_ACCELERATOR 0x8009
214 #define NE_RSCTYPE_BITMAP 0x8002
215 #define NE_RSCTYPE_CURSOR 0x8001
216 #define NE_RSCTYPE_DIALOG 0x8005
217 #define NE_RSCTYPE_FONT 0x8008
218 #define NE_RSCTYPE_FONTDIR 0x8007
219 #define NE_RSCTYPE_GROUP_CURSOR 0x800c
220 #define NE_RSCTYPE_GROUP_ICON 0x800e
221 #define NE_RSCTYPE_ICON 0x8003
222 #define NE_RSCTYPE_MENU 0x8004
223 #define NE_RSCTYPE_RCDATA 0x800a
224 #define NE_RSCTYPE_STRING 0x8006
226 int load_typeinfo (int, struct resource_typeinfo_s *);
227 int load_nameinfo (int, struct resource_nameinfo_s *);