|
|
1.1 root 1: /*
2: * SCCSID = @(#)newexe.h 13.4 89/06/26
3: *
4: * Title
5: *
6: * newexe.h
7: * (C) Copyright Microsoft Corp 1984-1987
8: *
9: * Description
10: *
11: * Data structure definitions for the DOS 4.0/Windows 2.0
12: * executable file format.
13: *
14: */
15:
16:
17:
18: /*_________________________________________________________________*
19: | |
20: | |
21: | DOS3 .EXE FILE HEADER DEFINITION |
22: | |
23: |_________________________________________________________________|
24: * */
25:
26:
27: #define EMAGIC 0x5A4D /* Old magic number */
28: #define ENEWEXE sizeof(struct exe_hdr)
29: /* Value of E_LFARLC for new .EXEs */
30: #define ENEWHDR 0x003C /* Offset in old hdr. of ptr. to new */
31: #define ERESWDS 0x0010 /* No. of reserved words (OLD) */
32: #define ERES1WDS 0x0004 /* No. of reserved words in e_res */
33: #define ERES2WDS 0x000A /* No. of reserved words in e_res2 */
34: #define ECP 0x0004 /* Offset in struct of E_CP */
35: #define ECBLP 0x0002 /* Offset in struct of E_CBLP */
36: #define EMINALLOC 0x000A /* Offset in struct of E_MINALLOC */
37:
38: struct exe_hdr /* DOS 1, 2, 3 .EXE header */
39: {
40: unsigned short e_magic; /* Magic number */
41: unsigned short e_cblp; /* Bytes on last page of file */
42: unsigned short e_cp; /* Pages in file */
43: unsigned short e_crlc; /* Relocations */
44: unsigned short e_cparhdr; /* Size of header in paragraphs */
45: unsigned short e_minalloc; /* Minimum extra paragraphs needed */
46: unsigned short e_maxalloc; /* Maximum extra paragraphs needed */
47: unsigned short e_ss; /* Initial (relative) SS value */
48: unsigned short e_sp; /* Initial SP value */
49: unsigned short e_csum; /* Checksum */
50: unsigned short e_ip; /* Initial IP value */
51: unsigned short e_cs; /* Initial (relative) CS value */
52: unsigned short e_lfarlc; /* File address of relocation table */
53: unsigned short e_ovno; /* Overlay number */
54: unsigned short e_res[ERES1WDS];/* Reserved words */
55: unsigned short e_oemid; /* OEM identifier (for e_oeminfo) */
56: unsigned short e_oeminfo; /* OEM information; e_oemid specific */
57: unsigned short e_res2[ERES2WDS];/* Reserved words */
58: long e_lfanew; /* File address of new exe header */
59: };
60:
61: #define E_MAGIC(x) (x).e_magic
62: #define E_CBLP(x) (x).e_cblp
63: #define E_CP(x) (x).e_cp
64: #define E_CRLC(x) (x).e_crlc
65: #define E_CPARHDR(x) (x).e_cparhdr
66: #define E_MINALLOC(x) (x).e_minalloc
67: #define E_MAXALLOC(x) (x).e_maxalloc
68: #define E_SS(x) (x).e_ss
69: #define E_SP(x) (x).e_sp
70: #define E_CSUM(x) (x).e_csum
71: #define E_IP(x) (x).e_ip
72: #define E_CS(x) (x).e_cs
73: #define E_LFARLC(x) (x).e_lfarlc
74: #define E_OVNO(x) (x).e_ovno
75: #define E_RES(x) (x).e_res
76: #define E_OEMID(x) (x).e_oemid
77: #define E_OEMINFO(x) (x).e_oeminfo
78: #define E_RES2(x) (x).e_res2
79: #define E_LFANEW(x) (x).e_lfanew
80:
81:
82: /*_________________________________________________________________*
83: | |
84: | |
85: | OS/2 & WINDOWS .EXE FILE HEADER DEFINITION - 286 version |
86: | |
87: |_________________________________________________________________|
88: * */
89:
90: #define NEMAGIC 0x454E /* New magic number */
91: #define NERESBYTES 8 /* Eight bytes reserved (now) */
92: #define NECRC 8 /* Offset into new header of NE_CRC */
93:
94: struct new_exe /* New .EXE header */
95: {
96: unsigned short ne_magic; /* Magic number NE_MAGIC */
97: unsigned char ne_ver; /* Version number */
98: unsigned char ne_rev; /* Revision number */
99: unsigned short ne_enttab; /* Offset of Entry Table */
100: unsigned short ne_cbenttab; /* Number of bytes in Entry Table */
101: long ne_crc; /* Checksum of whole file */
102: unsigned short ne_flags; /* Flag word */
103: unsigned short ne_autodata; /* Automatic data segment number */
104: unsigned short ne_heap; /* Initial heap allocation */
105: unsigned short ne_stack; /* Initial stack allocation */
106: long ne_csip; /* Initial CS:IP setting */
107: long ne_sssp; /* Initial SS:SP setting */
108: unsigned short ne_cseg; /* Count of file segments */
109: unsigned short ne_cmod; /* Entries in Module Reference Table */
110: unsigned short ne_cbnrestab; /* Size of non-resident name table */
111: unsigned short ne_segtab; /* Offset of Segment Table */
112: unsigned short ne_rsrctab; /* Offset of Resource Table */
113: unsigned short ne_restab; /* Offset of resident name table */
114: unsigned short ne_modtab; /* Offset of Module Reference Table */
115: unsigned short ne_imptab; /* Offset of Imported Names Table */
116: long ne_nrestab; /* Offset of Non-resident Names Table */
117: unsigned short ne_cmovent; /* Count of movable entries */
118: unsigned short ne_align; /* Segment alignment shift count */
119: unsigned short ne_cres; /* Count of resource entries */
120: unsigned char ne_exetyp; /* Target operating system */
121: unsigned char ne_flagsothers; /* Other .EXE flags */
122: char ne_res[NERESBYTES];
123: /* Pad structure to 64 bytes */
124: };
125:
126: #define NE_MAGIC(x) (x).ne_magic
127: #define NE_VER(x) (x).ne_ver
128: #define NE_REV(x) (x).ne_rev
129: #define NE_ENTTAB(x) (x).ne_enttab
130: #define NE_CBENTTAB(x) (x).ne_cbenttab
131: #define NE_CRC(x) (x).ne_crc
132: #define NE_FLAGS(x) (x).ne_flags
133: #define NE_AUTODATA(x) (x).ne_autodata
134: #define NE_HEAP(x) (x).ne_heap
135: #define NE_STACK(x) (x).ne_stack
136: #define NE_CSIP(x) (x).ne_csip
137: #define NE_SSSP(x) (x).ne_sssp
138: #define NE_CSEG(x) (x).ne_cseg
139: #define NE_CMOD(x) (x).ne_cmod
140: #define NE_CBNRESTAB(x) (x).ne_cbnrestab
141: #define NE_SEGTAB(x) (x).ne_segtab
142: #define NE_RSRCTAB(x) (x).ne_rsrctab
143: #define NE_RESTAB(x) (x).ne_restab
144: #define NE_MODTAB(x) (x).ne_modtab
145: #define NE_IMPTAB(x) (x).ne_imptab
146: #define NE_NRESTAB(x) (x).ne_nrestab
147: #define NE_CMOVENT(x) (x).ne_cmovent
148: #define NE_ALIGN(x) (x).ne_align
149: #define NE_CRES(x) (x).ne_cres
150: #define NE_RES(x) (x).ne_res
151: #define NE_EXETYP(x) (x).ne_exetyp
152: #define NE_FLAGSOTHERS(x) (x).ne_flagsothers
153:
154: #define NE_USAGE(x) (WORD)*((WORD *)(x)+1)
155: #define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab
156: #define NE_ONEWEXE(x) (WORD)(x).ne_crc
157: #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)
158:
159:
160: /*
161: * Target operating systems
162: */
163:
164: #define NE_UNKNOWN 0x0 /* Unknown (any "new-format" OS) */
165: #define NE_OS2 0x1 /* Microsoft/IBM OS/2 (default) */
166: #define NE_WINDOWS 0x2 /* Microsoft Windows */
167: #define NE_DOS4 0x3 /* Microsoft MS-DOS 4.x */
168: #define NE_DEV386 0x4 /* Microsoft Windows 386 */
169:
170:
171: /*
172: * Format of NE_FLAGS(x):
173: *
174: * p Not-a-process
175: * x Unused
176: * e Errors in image
177: * x Unused
178: * b Bound Family/API
179: * ttt Application type
180: * f Floating-point instructions
181: * 3 386 instructions
182: * 2 286 instructions
183: * 0 8086 instructions
184: * P Protected mode only
185: * p Per-process library initialization
186: * i Instance data
187: * s Solo data
188: */
189: #define NENOTP 0x8000 /* Not a process */
190: #define NEIERR 0x2000 /* Errors in image */
191: #define NEBOUND 0x0800 /* Bound Family/API */
192: #define NEAPPTYP 0x0700 /* Application type mask */
193: #define NENOTWINCOMPAT 0x0100 /* Not compatible with P.M. Windowing */
194: #define NEWINCOMPAT 0x0200 /* Compatible with P.M. Windowing */
195: #define NEWINAPI 0x0300 /* Uses P.M. Windowing API */
196: #define NEFLTP 0x0080 /* Floating-point instructions */
197: #define NEI386 0x0040 /* 386 instructions */
198: #define NEI286 0x0020 /* 286 instructions */
199: #define NEI086 0x0010 /* 8086 instructions */
200: #define NEPROT 0x0008 /* Runs in protected mode only */
201: #define NEPPLI 0x0004 /* Per-Process Library Initialization */
202: #define NEINST 0x0002 /* Instance data */
203: #define NESOLO 0x0001 /* Solo data */
204:
205: /*
206: * Format of NE_FLAGSOTHERS(x):
207: *
208: * 7 6 5 4 3 2 1 0 - bit no
209: * |
210: * +---------------- Support for long file names
211: *
212: */
213:
214: #define NELONGNAMES 0x01
215:
216:
217:
218: struct new_seg /* New .EXE segment table entry */
219: {
220: unsigned short ns_sector; /* File sector of start of segment */
221: unsigned short ns_cbseg; /* Number of bytes in file */
222: unsigned short ns_flags; /* Attribute flags */
223: unsigned short ns_minalloc; /* Minimum allocation in bytes */
224: };
225:
226: #define NS_SECTOR(x) (x).ns_sector
227: #define NS_CBSEG(x) (x).ns_cbseg
228: #define NS_FLAGS(x) (x).ns_flags
229: #define NS_MINALLOC(x) (x).ns_minalloc
230:
231:
232: /*
233: * Format of NS_FLAGS(x)
234: *
235: * Flag word has the following format:
236: *
237: * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
238: * | | | | | | | | | | | | | | |
239: * | | | | | | | | | | | | +-+-+--- Segment type DATA/CODE
240: * | | | | | | | | | | | +--------- Iterated segment
241: * | | | | | | | | | | +----------- Movable segment
242: * | | | | | | | | | +------------- Segment can be shared
243: * | | | | | | | | +--------------- Preload segment
244: * | | | | | | | +----------------- Execute/read-only for code/data segment
245: * | | | | | | +------------------- Segment has relocations
246: * | | | | | +--------------------- Code conforming/Data is expand down
247: * | | | +--+----------------------- I/O privilege level
248: * | | +----------------------------- Discardable segment
249: * | +-------------------------------- 32-bit code segment
250: * +----------------------------------- Huge segment/GDT allocation requested
251: *
252: */
253:
254: #define NSTYPE 0x0007 /* Segment type mask */
255:
256: #if (EXE386 == 0)
257: #define NSCODE 0x0000 /* Code segment */
258: #define NSDATA 0x0001 /* Data segment */
259: #define NSITER 0x0008 /* Iterated segment flag */
260: #define NSMOVE 0x0010 /* Movable segment flag */
261: #define NSSHARED 0x0020 /* Shared segment flag */
262: #define NSPRELOAD 0x0040 /* Preload segment flag */
263: #define NSEXRD 0x0080 /* Execute-only (code segment), or
264: * read-only (data segment)
265: */
266: #define NSRELOC 0x0100 /* Segment has relocations */
267: #define NSCONFORM 0x0200 /* Conforming segment */
268: #define NSEXPDOWN 0x0200 /* Data segment is expand down */
269: #define NSDPL 0x0C00 /* I/O privilege level (286 DPL bits) */
270: #define SHIFTDPL 10 /* Left shift count for SEGDPL field */
271: #define NSDISCARD 0x1000 /* Segment is discardable */
272: #define NS32BIT 0x2000 /* 32-bit code segment */
273: #define NSHUGE 0x4000 /* Huge memory segment, length of
274: * segment and minimum allocation
275: * size are in segment sector units
276: */
277: #define NSGDT 0x8000 /* GDT allocation requested */
278:
279: #define NSPURE NSSHARED /* For compatibility */
280:
281: #define NSALIGN 9 /* Segment data aligned on 512 byte boundaries */
282:
283: #define NSLOADED 0x0004 /* ns_sector field contains memory addr */
284: #endif
285:
286:
287: struct new_segdata /* Segment data */
288: {
289: union
290: {
291: struct
292: {
293: unsigned short ns_niter; /* number of iterations */
294: unsigned short ns_nbytes; /* number of bytes */
295: char ns_iterdata; /* iterated data bytes */
296: } ns_iter;
297: struct
298: {
299: char ns_data; /* data bytes */
300: } ns_noniter;
301: } ns_union;
302: };
303:
304: struct new_rlcinfo /* Relocation info */
305: {
306: unsigned short nr_nreloc; /* number of relocation items that */
307: }; /* follow */
308:
309: #pragma pack(1)
310:
311:
312: struct new_rlc /* Relocation item */
313: {
314: char nr_stype; /* Source type */
315: char nr_flags; /* Flag byte */
316: unsigned short nr_soff; /* Source offset */
317: union
318: {
319: struct
320: {
321: char nr_segno; /* Target segment number */
322: char nr_res; /* Reserved */
323: unsigned short nr_entry; /* Target Entry Table offset */
324: } nr_intref; /* Internal reference */
325: struct
326: {
327: unsigned short nr_mod; /* Index into Module Reference Table */
328: unsigned short nr_proc; /* Procedure ordinal or name offset */
329: } nr_import; /* Import */
330: struct
331: {
332: unsigned short nr_ostype; /* OSFIXUP type */
333: unsigned short nr_osres; /* reserved */
334: } nr_osfix; /* Operating system fixup */
335: } nr_union; /* Union */
336: };
337:
338: #pragma pack()
339:
340:
341: #define NR_STYPE(x) (x).nr_stype
342: #define NR_FLAGS(x) (x).nr_flags
343: #define NR_SOFF(x) (x).nr_soff
344: #define NR_SEGNO(x) (x).nr_union.nr_intref.nr_segno
345: #define NR_RES(x) (x).nr_union.nr_intref.nr_res
346: #define NR_ENTRY(x) (x).nr_union.nr_intref.nr_entry
347: #define NR_MOD(x) (x).nr_union.nr_import.nr_mod
348: #define NR_PROC(x) (x).nr_union.nr_import.nr_proc
349: #define NR_OSTYPE(x) (x).nr_union.nr_osfix.nr_ostype
350: #define NR_OSRES(x) (x).nr_union.nr_osfix.nr_osres
351:
352:
353:
354: /*
355: * Format of NR_STYPE(x) and R32_STYPE(x):
356: *
357: * 7 6 5 4 3 2 1 0 - bit no
358: * | | | |
359: * +-+-+-+--- source type
360: *
361: */
362:
363: #define NRSTYP 0x0f /* Source type mask */
364: #define NRSBYT 0x00 /* lo byte (8-bits)*/
365: #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
366: #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
367: #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
368: #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
369: #define NROFF32 0x07 /* 32-bit offset (32-bits) */
370: #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
371:
372:
373: /*
374: * Format of NR_FLAGS(x) and R32_FLAGS(x):
375: *
376: * 7 6 5 4 3 2 1 0 - bit no
377: * | | |
378: * | +-+--- Reference type
379: * +------- Additive fixup
380: */
381:
382: #define NRADD 0x04 /* Additive fixup */
383: #define NRRTYP 0x03 /* Reference type mask */
384: #define NRRINT 0x00 /* Internal reference */
385: #define NRRORD 0x01 /* Import by ordinal */
386: #define NRRNAM 0x02 /* Import by name */
387: #define NRROSF 0x03 /* Operating system fixup */
388:
389:
390: #if (EXE386 == 0)
391:
392: /* Resource type or name string */
393: struct rsrc_string
394: {
395: char rs_len; /* number of bytes in string */
396: char rs_string[ 1 ]; /* text of string */
397: };
398:
399: #define RS_LEN( x ) (x).rs_len
400: #define RS_STRING( x ) (x).rs_string
401:
402: /* Resource type information block */
403: struct rsrc_typeinfo
404: {
405: unsigned short rt_id;
406: unsigned short rt_nres;
407: long rt_proc;
408: };
409:
410: #define RT_ID( x ) (x).rt_id
411: #define RT_NRES( x ) (x).rt_nres
412: #define RT_PROC( x ) (x).rt_proc
413:
414: /* Resource name information block */
415: struct rsrc_nameinfo
416: {
417: /* The following two fields must be shifted left by the value of */
418: /* the rs_align field to compute their actual value. This allows */
419: /* resources to be larger than 64k, but they do not need to be */
420: /* aligned on 512 byte boundaries, the way segments are */
421: unsigned short rn_offset; /* file offset to resource data */
422: unsigned short rn_length; /* length of resource data */
423: unsigned short rn_flags; /* resource flags */
424: unsigned short rn_id; /* resource name id */
425: unsigned short rn_handle; /* If loaded, then global handle */
426: unsigned short rn_usage; /* Initially zero. Number of times */
427: /* the handle for this resource has */
428: /* been given out */
429: };
430:
431: #define RN_OFFSET( x ) (x).rn_offset
432: #define RN_LENGTH( x ) (x).rn_length
433: #define RN_FLAGS( x ) (x).rn_flags
434: #define RN_ID( x ) (x).rn_id
435: #define RN_HANDLE( x ) (x).rn_handle
436: #define RN_USAGE( x ) (x).rn_usage
437:
438: #define RSORDID 0x8000 /* if high bit of ID set then integer id */
439: /* otherwise ID is offset of string from
440: the beginning of the resource table */
441:
442: /* Ideally these are the same as the */
443: /* corresponding segment flags */
444: #define RNMOVE 0x0010 /* Moveable resource */
445: #define RNPURE 0x0020 /* Pure (read-only) resource */
446: #define RNPRELOAD 0x0040 /* Preloaded resource */
447: #define RNDISCARD 0xF000 /* Discard priority level for resource */
448:
449: /* Resource table */
450: struct new_rsrc
451: {
452: unsigned short rs_align; /* alignment shift count for resources */
453: struct rsrc_typeinfo rs_typeinfo;
454: };
455:
456: #define RS_ALIGN( x ) (x).rs_align
457:
458:
459: #endif /* NOT EXE386 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.