source: trunk/tools/common/LXexe.h@ 10367

Last change on this file since 10367 was 8003, checked in by bird, 24 years ago

New kFile* classes; now in sync with os2tools.

File size: 20.1 KB
Line 
1/* $Id: LXexe.h,v 1.1 2002-02-24 02:47:22 bird Exp $
2 *
3 * LX DEFINITIONS AND DECLARATIONS.
4 * --------------------------------
5 *
6 * Copyright (c) IBM Corporation 1987, 1991
7 * Copyright (c) Microsoft Corp 1988, 1991
8 *
9 * And knut st. osmundsen has been messing it up a little...
10 *
11 */
12
13#if !defined(__EXE386__) && !defined(_LXexe_h_)
14#define _LXexe_h_
15
16
17#define IMAGE_OS2_SIGNATURE_LX 0x584C /* LX */
18
19
20#pragma pack(1) /* Force byte alignment */
21
22 /*_________________________________________________________________*
23 | |
24 | |
25 | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 |
26 | |
27 |_________________________________________________________________|
28 * */
29
30/*
31 * Misc stuff in the header.
32 */
33#define BITPERWORD 16
34#define BITPERBYTE 8
35#define OBJPAGELEN 4096
36#define E32MAGIC1 'L' /* New magic number "LX" */
37#define E32MAGIC2 'X' /* New magic number "LX" */
38#define E32MAGIC 0x584c /* New magic number "LX" */
39#define E32RESBYTES1 0 /* First bytes reserved */
40#define E32RESBYTES2 0 /* Second bytes reserved */
41#define E32RESBYTES3 20 /* Third bytes reserved */
42#define E32LEBO 0x00 /* Little Endian Byte Order */
43#define E32BEBO 0x01 /* Big Endian Byte Order */
44#define E32LEWO 0x00 /* Little Endian Word Order */
45#define E32BEWO 0x01 /* Big Endian Word Order */
46#define E32LEVEL 0L /* 32-bit EXE format level */
47#define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */
48#define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */
49#define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */
50
51
52/**
53 * New 32-bit .EXE header for OS/2 version 2.0 and above.
54 */
55struct e32_exe
56{
57 unsigned char e32_magic[2]; /* Magic number E32_MAGIC */
58 unsigned char e32_border; /* The byte ordering for the .EXE */
59 unsigned char e32_worder; /* The word ordering for the .EXE */
60 unsigned long e32_level; /* The EXE format level for now = 0 */
61 unsigned short e32_cpu; /* The CPU type */
62 unsigned short e32_os; /* The OS type */
63 unsigned long e32_ver; /* Module version */
64 unsigned long e32_mflags; /* Module flags */
65 unsigned long e32_mpages; /* Module # pages */
66 unsigned long e32_startobj; /* Object # for instruction pointer */
67 unsigned long e32_eip; /* Extended instruction pointer */
68 unsigned long e32_stackobj; /* Object # for stack pointer */
69 unsigned long e32_esp; /* Extended stack pointer */
70 unsigned long e32_pagesize; /* .EXE page size */
71 unsigned long e32_pageshift; /* Page alignment shift in .EXE */
72 unsigned long e32_fixupsize; /* Fixup section size */
73 unsigned long e32_fixupsum; /* Fixup section checksum */
74 unsigned long e32_ldrsize; /* Loader section size */
75 unsigned long e32_ldrsum; /* Loader section checksum */
76 unsigned long e32_objtab; /* Object table offset */
77 unsigned long e32_objcnt; /* Number of objects in module */
78 unsigned long e32_objmap; /* Object page map offset */
79 unsigned long e32_itermap; /* Object iterated data map offset */
80 unsigned long e32_rsrctab; /* Offset of Resource Table */
81 unsigned long e32_rsrccnt; /* Number of resource entries */
82 unsigned long e32_restab; /* Offset of resident name table */
83 unsigned long e32_enttab; /* Offset of Entry Table */
84 unsigned long e32_dirtab; /* Offset of Module Directive Table */
85 unsigned long e32_dircnt; /* Number of module directives */
86 unsigned long e32_fpagetab; /* Offset of Fixup Page Table */
87 unsigned long e32_frectab; /* Offset of Fixup Record Table */
88 unsigned long e32_impmod; /* Offset of Import Module Name Table */
89 unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */
90 unsigned long e32_impproc; /* Offset of Import Procedure Name Table */
91 unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */
92 unsigned long e32_datapage; /* Offset of Enumerated Data Pages */
93 unsigned long e32_preload; /* Number of preload pages */
94 unsigned long e32_nrestab; /* Offset of Non-resident Names Table */
95 unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */
96 unsigned long e32_nressum; /* Non-resident Name Table Checksum */
97 unsigned long e32_autodata; /* Object # for automatic data object */
98 unsigned long e32_debuginfo; /* Offset of the debugging information */
99 unsigned long e32_debuglen; /* The length of the debugging info. in bytes */
100 unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */
101 unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */
102 unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */
103 unsigned long e32_stacksize; /* Size of stack */
104 unsigned char e32_res3[E32RESBYTES3];
105 /* Pad structure to 196 bytes */
106};
107
108/*
109 * Format of E32_MFLAGS(x):
110 *
111 * Low word has the following format:
112 *
113 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
114 * | | | | | | | |
115 * | | | | | | | +------- Per-Process Library Initialization
116 * | | | | | | +--------- SystemDLL (internal fixups discarded)
117 * | | | | | +----------- No Internal Fixups for Module in .EXE
118 * | | | | +------------- No External Fixups for Module in .EXE
119 * | | | +------------------- Incompatible with PM Windowing
120 * | | +--------------------- Compatible with PM Windowing
121 * | | Uses PM Windowing API
122 * | +-------------------------------- Module not Loadable
123 * +-------------------------------------- Library Module
124 */
125#define E32NOTP 0x8000L /* Library Module - used as NENOTP */
126#define E32NOLOAD 0x2000L /* Module not Loadable */
127#define E32PMAPI 0x0300L /* Uses PM Windowing API */
128#define E32PMW 0x0200L /* Compatible with PM Windowing */
129#define E32NOPMW 0x0100L /* Incompatible with PM Windowing */
130#define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */
131#define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */
132#define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/
133#define E32LIBINIT 0x0004L /* Per-Process Library Initialization */
134#define E32LIBTERM 0x40000000L /* Per-Process Library Termination */
135#define E32APPMASK 0x0300L /* Application Type Mask */
136
137/*
138 * Format of E32_MFLAGS(x):
139 *
140 * High word has the following format:
141 *
142 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
143 * | |
144 * | +--- Protected memory library module
145 * +----- Device driver
146 */
147#define E32PROTDLL 0x10000L /* Protected memory library module */
148#define E32DEVICE 0x20000L /* Device driver */
149#define E32MODEXE 0x00000L /* .EXE module */
150#define E32MODDLL 0x08000L /* .DLL module */
151#define E32MODPROTDLL 0x18000L /* Protected memory library module */
152#define E32MODPDEV 0x20000L /* Physical device driver */
153#define E32MODVDEV 0x28000L /* Virtual device driver */
154#define E32MODMASK 0x38000L /* Module type mask */
155#define E32NOTMPSAFE 0x80000L /* Process is multi-processor unsafe */
156
157
158
159/*
160 * RELOCATION DEFINITIONS - RUN-TIME FIXUPS
161 */
162
163typedef union _offset
164{
165 unsigned short offset16;
166 unsigned long offset32;
167} offset; /* 16-bit or 32-bit offset */
168
169/***ET+ r32_rlc - Relocation item */
170struct r32_rlc /* Relocation item */
171{
172 unsigned char nr_stype; /* Source type - field shared with new_rlc */
173 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
174 short r32_soff; /* Source offset */
175 unsigned short r32_objmod; /* Target object number or Module ordinal */
176
177 union targetid
178 {
179 offset intref; /* Internal fixup */
180 union extfixup
181 {
182 offset proc; /* Procedure name offset */
183 unsigned long ord; /* Procedure odrinal */
184 } extref; /* External fixup */
185 struct addfixup
186 {
187 unsigned short entry; /* Entry ordinal */
188 offset addval; /* Value added to the address */
189 } addfix; /* Additive fixup */
190 } r32_target; /* Target data */
191
192 unsigned short r32_srccount; /* Number of chained fixup records */
193 unsigned short r32_chain; /* Chain head */
194};
195
196/*
197 * In 32-bit .EXE file run-time relocations are written as varying size
198 * records, so we need many size definitions.
199 */
200#define RINTSIZE16 8
201#define RINTSIZE32 10
202#define RORDSIZE 8
203#define RNAMSIZE16 8
204#define RNAMSIZE32 10
205#define RADDSIZE16 10
206#define RADDSIZE32 12
207
208/*
209 * Format of NR_STYPE(x)
210 *
211 * 7 6 5 4 3 2 1 0 - bit no
212 * | | | | | |
213 * | | +-+-+-+--- Source type
214 * | +----------- Fixup to 16:16 alias
215 * +------------- List of source offset follows fixup record
216 */
217
218#define NRSTYP 0x0f /* Source type mask */
219#define NRSBYT 0x00 /* lo byte (8-bits)*/
220#define NRSSEG 0x02 /* 16-bit segment (16-bits) */
221#define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
222#define NRSOFF 0x05 /* 16-bit offset (16-bits) */
223#define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
224#define NROFF32 0x07 /* 32-bit offset (32-bits) */
225#define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
226#define NRSRCMASK 0x0f /* Source type mask */
227#define NRALIAS 0x10 /* Fixup to alias */
228#define NRCHAIN 0x20 /* List of source offset follows */
229 /* fixup record, source offset field */
230 /* in fixup record contains number */
231 /* of elements in list */
232/*
233 * Format of NR_FLAGS(x) and R32_FLAGS(x):
234 *
235 * 7 6 5 4 3 2 1 0 - bit no
236 * | | | | | | |
237 * | | | | | +-+--- Reference type
238 * | | | | +------- Additive fixup
239 * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit)
240 * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit)
241 * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit)
242 * +----------------- 8-bit import ordinal (1 - 8-bit;
243 * 0 - NR32BITOFF toggles
244 * between 16 and 32 bit
245 * ordinal)
246 */
247#define NRRTYP 0x03 /* Reference type mask */
248#define NRRINT 0x00 /* Internal reference */
249#define NRRORD 0x01 /* Import by ordinal */
250#define NRRNAM 0x02 /* Import by name */
251#define NRADD 0x04 /* Additive fixup */
252#define NRICHAIN 0x08 /* Internal Chaining Fixup */
253#define NRRENT 0x03 /* Internal entry table fixup */
254#define NR32BITOFF 0x10 /* 32-bit Target Offset */
255#define NR32BITADD 0x20 /* 32-bit Additive fixup */
256#define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */
257#define NR8BITORD 0x80 /* 8-bit import ordinal */
258
259/*
260 * Data structures for storing run-time fixups in linker virtual memory.
261 *
262 * Each object has a list of Object Page Directories which specify
263 * fixups for given page. Each page has its own hash table which is
264 * used to detect fixups to the same target.
265 */
266#define PAGEPERDIR 62
267#define LG2DIR 7
268typedef struct _OBJPAGEDIR
269{
270 unsigned long next; /* Virtual pointer to next dir on list */
271 unsigned short ht[PAGEPERDIR]; /* Pointers to individual hash tables */
272} OBJPAGEDIR;
273
274
275
276/*
277 * OBJECT TABLE
278 */
279
280/***ET+ o32_obj Object Table Entry */
281struct o32_obj /* Flat .EXE object table entry */
282{
283 unsigned long o32_size; /* Object virtual size */
284 unsigned long o32_base; /* Object base virtual address */
285 unsigned long o32_flags; /* Attribute flags */
286 unsigned long o32_pagemap; /* Object page map index */
287 unsigned long o32_mapsize; /* Number of entries in object page map */
288 unsigned long o32_reserved; /* Reserved */
289};
290
291/*
292 * Format of O32_FLAGS(x)
293 *
294 * High word of dword flag field is not used for now.
295 * Low word has the following format:
296 *
297 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
298 * | | | | | | | | | | | | | | |
299 * | | | | | | | | | | | | | | +--- Readable Object
300 * | | | | | | | | | | | | | +----- Writeable Object
301 * | | | | | | | | | | | | +------- Executable Object
302 * | | | | | | | | | | | +--------- Resource Object
303 * | | | | | | | | | | +----------- Object is Discardable
304 * | | | | | | | | | +------------- Object is Shared
305 * | | | | | | | | +--------------- Object has preload pages
306 * | | | | | | | +----------------- Object has invalid pages
307 * | | | | | | +------------------- Object is permanent and swappable
308 * | | | | | +--------------------- Object is permanent and resident
309 * | | | | +----------------------- Object is permanent and long lockable
310 * | | | +----------------------------- 16:16 alias required (80x86 specific)
311 * | | +-------------------------------- Big/Default bit setting (80x86 specific)
312 * | +----------------------------------- Object is conforming for code (80x86 specific)
313 * +-------------------------------------- Object I/O privilege level (80x86 specific)
314 *
315 */
316#define OBJREAD 0x0001L /* Readable Object */
317#define OBJWRITE 0x0002L /* Writeable Object */
318#define OBJRSRC 0x0008L /* Resource Object */
319#define OBJINVALID 0x0080L /* Object has invalid pages */
320#define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */
321#define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */
322#define OBJPERM 0x0100L /* Object is permanent and swappable */
323#define OBJRESIDENT 0x0200L /* Object is permanent and resident */
324#define OBJCONTIG 0x0300L /* Object is resident and contiguous */
325#define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */
326#define OBJTYPEMASK 0x0700L /* Object type mask */
327#define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */
328#define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */
329#define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */
330
331/*
332 * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version
333 */
334#define OBJDISCARD 0x0010L /* Object is Discardable */
335#define OBJSHARED 0x0020L /* Object is Shared */
336#define OBJPRELOAD 0x0040L /* Object has preload pages */
337#define OBJEXEC 0x0004L /* Executable Object */
338#define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
339
340/***ET+ o32_map - Object Page Map entry */
341struct o32_map /* Object Page Table entry */
342{
343 unsigned long o32_pagedataoffset; /* file offset of page */
344 unsigned short o32_pagesize; /* # bytes of page data */
345 unsigned short o32_pageflags; /* Per-Page attributes */
346};
347
348/*
349 * Page flags
350 */
351#define VALID 0x0000 /* Valid Physical Page in .EXE */
352#define ITERDATA 0x0001 /* Iterated Data Page */
353#define INVALID 0x0002 /* Invalid Page */
354#define ZEROED 0x0003 /* Zero Filled Page */
355#define RANGE 0x0004 /* Range of pages */
356#define ITERDATA2 0x0005 /* Iterated Data Page Type II */
357
358
359
360/*
361 * RESOURCE TABLE
362 */
363
364/***ET+ rsrc32 - Resource Table Entry */
365struct rsrc32 /* Resource Table Entry */
366{
367 unsigned short type; /* Resource type */
368 unsigned short name; /* Resource name */
369 unsigned long cb; /* Resource size */
370 unsigned short obj; /* Object number */
371 unsigned long offset; /* Offset within object */
372};
373
374/*
375 * Iteration Record format for 'EXEPACK'ed pages.
376 */
377struct LX_Iter
378{
379 unsigned short LX_nIter; /* number of iterations */
380 unsigned short LX_nBytes; /* number of bytes */
381 unsigned char LX_Iterdata; /* iterated data byte(s) */
382};
383
384
385
386/*
387 * ENTRY TABLE DEFINITIONS
388 */
389
390/***ET+ b32_bundle - Entry Table */
391struct b32_bundle
392{
393 unsigned char b32_cnt; /* Number of entries in this bundle */
394 unsigned char b32_type; /* Bundle type */
395 unsigned short b32_obj; /* Object number */
396}; /* Follows entry types */
397
398/*
399 * Bundle types.
400 */
401#define EMPTY 0x00 /* Empty bundle */
402#define ENTRY16 0x01 /* 16-bit offset entry point */
403#define GATE16 0x02 /* 286 call gate (16-bit IOPL) */
404#define ENTRY32 0x03 /* 32-bit offset entry point */
405#define ENTRYFWD 0x04 /* Forwarder entry point */
406#define TYPEINFO 0x80 /* Typing information present flag */
407
408struct e32_entry
409{
410 unsigned char e32_flags; /* Entry point flags */
411 union entrykind
412 {
413 offset e32_offset; /* 16-bit/32-bit offset entry */
414 struct callgate
415 {
416 unsigned short offset; /* Offset in segment */
417 unsigned short callgate; /* Callgate selector */
418 } e32_callgate; /* 286 (16-bit) call gate */
419 struct fwd
420 {
421 unsigned short modord; /* Module ordinal number */
422 unsigned long value; /* Proc name offset or ordinal */
423 } e32_fwd; /* Forwarder */
424 } e32_variant; /* Entry variant */
425};
426
427/*
428 * Entry flags.
429 */
430#define FIXENT16 3
431#define FIXENT32 5
432#define GATEENT16 5
433#define FWDENT 7
434
435/*
436 * Format for E32_EFLAGS(x)
437 *
438 * 7 6 5 4 3 2 1 0 - bit no
439 * | | | | | | | |
440 * | | | | | | | +--- exported entry
441 * | | | | | | +----- uses shared data
442 * +-+-+-+-+-+------- parameter word count
443 */
444#define E32EXPORT 0x01 /* Exported entry */
445#define E32SHARED 0x02 /* Uses shared data */
446#define E32PARAMS 0xf8 /* Parameter word count mask */
447
448/*
449 * Flags for forwarders only:
450 */
451#define FWD_ORDINAL 0x01 /* Imported by ordinal */
452
453
454#pragma pack() /* Restore default alignment */
455
456
457#endif
Note: See TracBrowser for help on using the repository browser.