Release 950727
[wine] / include / neexe.h
1 /* $Id: neexe.h,v 1.4 1993/07/04 04:04:21 root Exp root $
2  */
3 /*
4  * Copyright  Robert J. Amstadt, 1993
5  */
6 #ifndef NEEXE_H
7 #define NEEXE_H
8
9 #include "wintypes.h"
10
11 /*
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.
14  */
15 struct mz_header_s
16 {
17     WORD mz_magic;         /* MZ Header signature */
18     BYTE  dont_care[0x3a];  /* MZ Header stuff */
19     WORD ne_offset;        /* Offset to extended header */
20 };
21
22 #define MZ_SIGNATURE  ('M' | ('Z' << 8))
23
24 /*
25  * This is the Windows executable (NE) header.
26  */
27 struct ne_header_s
28 {
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      */
61 };
62
63 #define NE_SIGNATURE  ('N' | ('E' << 8))
64 #define PE_SIGNATURE  ('P' | ('E' << 8))
65
66 /*
67  * NE Header FORMAT FLAGS
68  */
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
74
75 /*
76  * NE Header OPERATING SYSTEM
77  */
78 #define NE_OSFLAGS_UNKNOWN      0x01
79 #define NE_OSFLAGS_WINDOWS      0x04
80
81 /*
82  * NE Header ADDITIONAL FLAGS
83  */
84 #define NE_AFLAGS_WIN2_PROTMODE 0x02
85 #define NE_AFLAGS_WIN2_PROFONTS 0x04
86 #define NE_AFLAGS_FASTLOAD      0x08
87
88 /*
89  * Segment table entry
90  */
91 struct ne_segment_table_entry_s
92 {
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     */
97 };
98
99 /*
100  * Segment Flags
101  */
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
113
114 /*
115  * Relocation table entry
116  */
117 struct relocation_entry_s
118 {
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                 */
124 };
125
126 /*
127  * Relocation address types
128  */
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
135
136 /*
137  * Relocation types
138  */
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
144
145 /*
146  * DOS PSP
147  */
148 struct dos_psp_s
149 {
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];
165 };
166
167 /*
168  * Entry table structures.
169  */
170 struct entry_tab_header_s
171 {
172     unsigned char n_entries;
173     unsigned char seg_number;
174 };
175
176 struct entry_tab_movable_s
177 {
178     unsigned char flags;
179     unsigned char int3f[2];
180     unsigned char seg_number;
181     unsigned short offset;
182 };
183
184 struct entry_tab_fixed_s
185 {
186     unsigned char flags;
187     unsigned char offset[2];
188 };
189
190 /*
191  * Resource table structures.
192  */
193 struct resource_nameinfo_s
194 {
195     unsigned short offset;
196     unsigned short length;
197     unsigned short flags;
198     unsigned short id;
199     unsigned short handle;
200     unsigned short usage;
201 };
202
203 struct resource_typeinfo_s
204 {
205     unsigned short type_id;     /* Type identifier */
206     unsigned short count;       /* Number of resources of this type */
207     unsigned long  reserved;
208     /*
209      * Name info array.
210      */
211 };
212
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
225
226 int  load_typeinfo  (int, struct resource_typeinfo_s *);
227 int  load_nameinfo  (int, struct resource_nameinfo_s *);
228
229 #endif /* NEEXE_H */