initial comit
[reactos.git] / os2 / utils / EXE386.H
1
2 #ifndef __LX_EXE__
3 #define __LX_EXE__
4
5
6 #pragma pack(1) /* Force byte alignment */
7
8
9
10 /*_________________________________________________________________*
11 | |
12 | |
13 | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 |
14 | |
15 |_________________________________________________________________|
16 * */
17
18
19 #define BITPERWORD 16
20 #define BITPERBYTE 8
21 #define OBJPAGELEN 4096
22 #define E32MAGIC 0x584c /* New magic number "LX" */
23 #define E32RESBYTES1 0 /* First bytes reserved */
24 #define E32RESBYTES2 0 /* Second bytes reserved */
25 #define E32RESBYTES3 20 /* Third bytes reserved */
26 #define E32LEBO 0x00 /* Little Endian Byte Order */
27 #define E32BEBO 0x01 /* Big Endian Byte Order */
28 #define E32LEWO 0x00 /* Little Endian Word Order */
29 #define E32BEWO 0x01 /* Big Endian Word Order */
30 #define E32LEVEL 0L /* 32-bit EXE format level */
31 #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */
32 #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */
33 #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */
34
35
36
37 struct lx_exe /* New 32-bit .EXE header for OS/2 EXEs and DLLs*/
38 {
39 unsigned short magic; /* Magic number E32_MAGIC */
40 unsigned char border; /* The byte ordering for the .EXE */
41 unsigned char worder; /* The word ordering for the .EXE */
42 unsigned long level; /* The EXE format level for now = 0 */
43 unsigned short cpu; /* The CPU type */
44 unsigned short os; /* The OS type */
45 unsigned long ver; /* Module version */
46 unsigned long mflags; /* Module flags */
47 unsigned long mpages; /* Module # pages */
48 unsigned long startobj; /* Object # for instruction pointer */
49 unsigned long eip; /* Extended instruction pointer */
50 unsigned long stackobj; /* Object # for stack pointer */
51 unsigned long esp; /* Extended stack pointer */
52 unsigned long pagesize; /* .EXE page size */
53 unsigned long pageshift; /* Page alignment shift in .EXE */
54 unsigned long fixupsize; /* Fixup section size */
55 unsigned long fixupsum; /* Fixup section checksum */
56 unsigned long ldrsize; /* Loader section size */
57 unsigned long ldrsum; /* Loader section checksum */
58 unsigned long objtab; /* Object table offset */
59 unsigned long objcnt; /* Number of objects in module */
60 unsigned long objmap; /* Object page map offset */
61 unsigned long itermap; /* Object iterated data map offset */
62 unsigned long rsrctab; /* Offset of Resource Table */
63 unsigned long rsrccnt; /* Number of resource entries */
64 unsigned long restab; /* Offset of resident name table */
65 unsigned long enttab; /* Offset of Entry Table */
66 unsigned long dirtab; /* Offset of Module Directive Table */
67 unsigned long dircnt; /* Number of module directives */
68 unsigned long fpagetab; /* Offset of Fixup Page Table */
69 unsigned long frectab; /* Offset of Fixup Record Table */
70 unsigned long impmod; /* Offset of Import Module Name Table */
71 unsigned long impmodcnt; /* Number of entries in Import Module Name Table */
72 unsigned long impproc; /* Offset of Import Procedure Name Table */
73 unsigned long pagesum; /* Offset of Per-Page Checksum Table */
74 unsigned long datapage; /* Offset of Enumerated Data Pages */
75 unsigned long preload; /* Number of preload pages */
76 unsigned long nrestab; /* Offset of Non-resident Names Table */
77 unsigned long cbnrestab; /* Size of Non-resident Name Table */
78 unsigned long nressum; /* Non-resident Name Table Checksum */
79 unsigned long autodata; /* Object # for automatic data object */
80 unsigned long debuginfo; /* Offset of the debugging information */
81 unsigned long debuglen; /* The length of the debugging info. in bytes */
82 unsigned long instpreload;/* Number of instance pages in preload section of .EXE file */
83 unsigned long instdemand; /* Number of instance pages in demand load section of .EXE file */
84 unsigned long heapsize; /* Size of heap - for 16-bit apps */
85 unsigned long stacksize; /* Size of stack */
86 unsigned char res3[E32RESBYTES3];
87 /* Pad structure to 196 bytes */
88 };
89
90
91
92
93 /*
94 * Format of lx_exe.mflags:
95 *
96 * Low word has the following format:
97 *
98 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
99 * | | | | | | | |
100 * | | | | | | | +------- Per-Process Library Initialization
101 * | | | | | | +--------- SystemDLL (internal fixups discarded)
102 * | | | | | +----------- No Internal Fixups for Module in .EXE
103 * | | | | +------------- No External Fixups for Module in .EXE
104 * | | | +------------------- Incompatible with PM Windowing
105 * | | +--------------------- Compatible with PM Windowing
106 * | | Uses PM Windowing API
107 * | +-------------------------------- Module not Loadable
108 * +-------------------------------------- Library Module
109 */
110
111
112 #define E32NOTP 0x8000L /* Library Module - used as NENOTP */
113 #define E32NOLOAD 0x2000L /* Module not Loadable */
114 #define E32PMAPI 0x0300L /* Uses PM Windowing API */
115 #define E32PMW 0x0200L /* Compatible with PM Windowing */
116 #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */
117 #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */
118 #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */
119 #define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/
120 #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */
121 #define E32LIBTERM 0x40000000L /* Per-Process Library Termination */
122 #define E32APPMASK 0x0300L /* Application Type Mask */
123
124
125 /*
126 * Format of E32_MFLAGS(x):
127 *
128 * High word has the following format:
129 *
130 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
131 * | |
132 * | +--- Protected memory library module
133 * +----- Device driver
134 */
135
136 #define E32PROTDLL 0x10000L /* Protected memory library module */
137 #define E32DEVICE 0x20000L /* Device driver */
138 #define E32MODEXE 0x00000L /* .EXE module */
139 #define E32MODDLL 0x08000L /* .DLL module */
140 #define E32MODPROTDLL 0x18000L /* Protected memory library module */
141 #define E32MODPDEV 0x20000L /* Physical device driver */
142 #define E32MODVDEV 0x28000L /* Virtual device driver */
143 #define E32MODMASK 0x38000L /* Module type mask */
144
145 /*
146 * RELOCATION DEFINITIONS - RUN-TIME FIXUPS
147 */
148
149
150
151
152 typedef union _offset
153 {
154 unsigned short offset16;
155 unsigned long offset32;
156 }
157 offset; /* 16-bit or 32-bit offset */
158
159
160 /***ET+ r32_rlc - Relocation item */
161
162 struct r32_rlc /* Relocation item */
163 {
164 unsigned char nr_stype; /* Source type - field shared with new_rlc */
165 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
166 short r32_soff; /* Source offset */
167 unsigned short r32_objmod; /* Target object number or Module ordinal */
168
169 union targetid
170 {
171 offset intref; /* Internal fixup */
172
173 union extfixup
174 {
175 offset proc; /* Procedure name offset */
176 unsigned long ord; /* Procedure odrinal */
177 }
178 extref; /* External fixup */
179
180 struct addfixup
181 {
182 unsigned short entry; /* Entry ordinal */
183 offset addval; /* Value added to the address */
184 }
185 addfix; /* Additive fixup */
186 }
187 r32_target; /* Target data */
188 unsigned short r32_srccount; /* Number of chained fixup records */
189 unsigned short r32_chain; /* Chain head */
190 };
191
192
193
194 /*
195 * In 32-bit .EXE file run-time relocations are written as varying size
196 * records, so we need many size definitions.
197 */
198
199 #define RINTSIZE16 8
200 #define RINTSIZE32 10
201 #define RORDSIZE 8
202 #define RNAMSIZE16 8
203 #define RNAMSIZE32 10
204 #define RADDSIZE16 10
205 #define RADDSIZE32 12
206
207
208
209 #if FALSE
210 /*
211 * Access macros defined in NEWEXE.H !!!
212 */
213 #define NR_STYPE(x) (x).nr_stype
214 #define NR_FLAGS(x) (x).nr_flags
215 #endif
216
217 #define R32_SOFF(x) (x).r32_soff
218 #define R32_OBJNO(x) (x).r32_objmod
219 #define R32_MODORD(x) (x).r32_objmod
220 #define R32_OFFSET16(x) (x).r32_target.intref.offset16
221 #define R32_OFFSET32(x) (x).r32_target.intref.offset32
222 #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16
223 #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32
224 #define R32_PROCORD(x) (x).r32_target.extref.ord
225 #define R32_ENTRY(x) (x).r32_target.addfix.entry
226 #define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16
227 #define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32
228 #define R32_SRCCNT(x) (x).r32_srccount
229 #define R32_CHAIN(x) (x).r32_chain
230
231
232
233 /*
234 * Format of NR_STYPE(x)
235 *
236 * 7 6 5 4 3 2 1 0 - bit no
237 * | | | | | |
238 * | | +-+-+-+--- Source type
239 * | +----------- Fixup to 16:16 alias
240 * +------------- List of source offset follows fixup record
241 */
242
243 #if FALSE
244
245 /* DEFINED in newexe.h !!! */
246
247 #define NRSTYP 0x0f /* Source type mask */
248 #define NRSBYT 0x00 /* lo byte (8-bits)*/
249 #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
250 #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
251 #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
252 #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
253 #define NROFF32 0x07 /* 32-bit offset (32-bits) */
254 #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
255 #endif
256
257
258 #define NRSRCMASK 0x0f /* Source type mask */
259 #define NRALIAS 0x10 /* Fixup to alias */
260 #define NRCHAIN 0x20 /* List of source offset follows */
261 /* fixup record, source offset field */
262 /* in fixup record contains number */
263 /* of elements in list */
264
265 /*
266 * Format of NR_FLAGS(x) and R32_FLAGS(x):
267 *
268 * 7 6 5 4 3 2 1 0 - bit no
269 * | | | | | | |
270 * | | | | | +-+--- Reference type
271 * | | | | +------- Additive fixup
272 * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit)
273 * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit)
274 * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit)
275 * +----------------- 8-bit import ordinal (1 - 8-bit;
276 * 0 - NR32BITOFF toggles
277 * between 16 and 32 bit
278 * ordinal)
279 */
280
281 #if FALSE
282
283 /* DEFINED in newexe.h !!! */
284
285 #define NRRTYP 0x03 /* Reference type mask */
286 #define NRRINT 0x00 /* Internal reference */
287 #define NRRORD 0x01 /* Import by ordinal */
288 #define NRRNAM 0x02 /* Import by name */
289 #define NRADD 0x04 /* Additive fixup */
290 #endif
291
292 #define NRRENT 0x03 /* Internal entry table fixup */
293
294 #define NR32BITOFF 0x10 /* 32-bit Target Offset */
295 #define NR32BITADD 0x20 /* 32-bit Additive fixup */
296 #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */
297 #define NR8BITORD 0x80 /* 8-bit import ordinal */
298 /*end*/
299
300 /*
301 * Data structures for storing run-time fixups in linker virtual memory.
302 *
303 * Each object has a list of Object Page Directories which specify
304 * fixups for given page. Each page has its own hash table which is
305 * used to detect fixups to the same target.
306 */
307
308 #define PAGEPERDIR 62
309 #define LG2DIR 7
310
311
312 typedef struct _OBJPAGEDIR
313 {
314 DWORD next; /* Virtual pointer to next dir on list */
315 WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */
316 }
317 OBJPAGEDIR;
318
319
320
321 /*
322 * OBJECT TABLE
323 */
324
325 /***ET+ o32_obj Object Table Entry */
326
327 struct o32_obj /* Flat .EXE object table entry */
328 {
329 unsigned long o32_size; /* Object virtual size */
330 unsigned long o32_base; /* Object base virtual address */
331 unsigned long o32_flags; /* Attribute flags */
332 unsigned long o32_pagemap; /* Object page map index */
333 unsigned long o32_mapsize; /* Number of entries in object page map */
334 unsigned long o32_reserved; /* Reserved */
335 };
336
337
338 #define O32_SIZE(x) (x).o32_size
339 #define O32_BASE(x) (x).o32_base
340 #define O32_FLAGS(x) (x).o32_flags
341 #define O32_PAGEMAP(x) (x).o32_pagemap
342 #define O32_MAPSIZE(x) (x).o32_mapsize
343 #define O32_RESERVED(x) (x).o32_reserved
344
345
346
347 /*
348 * Format of O32_FLAGS(x)
349 *
350 * High word of dword flag field is not used for now.
351 * Low word has the following format:
352 *
353 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
354 * | | | | | | | | | | | | | | |
355 * | | | | | | | | | | | | | | +--- Readable Object
356 * | | | | | | | | | | | | | +----- Writeable Object
357 * | | | | | | | | | | | | +------- Executable Object
358 * | | | | | | | | | | | +--------- Resource Object
359 * | | | | | | | | | | +----------- Object is Discardable
360 * | | | | | | | | | +------------- Object is Shared
361 * | | | | | | | | +--------------- Object has preload pages
362 * | | | | | | | +----------------- Object has invalid pages
363 * | | | | | | +------------------- Object is permanent and swappable
364 * | | | | | +--------------------- Object is permanent and resident
365 * | | | | +----------------------- Object is permanent and long lockable
366 * | | | +----------------------------- 16:16 alias required (80x86 specific)
367 * | | +-------------------------------- Big/Default bit setting (80x86 specific)
368 * | +----------------------------------- Object is conforming for code (80x86 specific)
369 * +-------------------------------------- Object I/O privilege level (80x86 specific)
370 *
371 */
372
373 #define OBJREAD 0x0001L /* Readable Object */
374 #define OBJWRITE 0x0002L /* Writeable Object */
375 #define OBJRSRC 0x0008L /* Resource Object */
376 #define OBJINVALID 0x0080L /* Object has invalid pages */
377 #define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */
378 #define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */
379 #define OBJPERM 0x0100L /* Object is permanent and swappable */
380 #define OBJRESIDENT 0x0200L /* Object is permanent and resident */
381 #define OBJCONTIG 0x0300L /* Object is resident and contiguous */
382 #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */
383 #define OBJTYPEMASK 0x0700L /* Object type mask */
384 #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */
385 #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */
386 #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */
387 #if FOR_EXEHDR
388 /*
389 * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version
390 */
391 #define OBJDISCARD 0x0010L /* Object is Discardable */
392 #define OBJSHARED 0x0020L /* Object is Shared */
393 #define OBJPRELOAD 0x0040L /* Object has preload pages */
394 #define OBJEXEC 0x0004L /* Executable Object */
395 #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
396 #else
397 /*
398 * Life will be easier, if we keep the same names for the following flags:
399 */
400 #define NSDISCARD 0x0010L /* Object is Discardable */
401 #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */
402 #define NSSHARED 0x0020L /* Object is Shared */
403 #define NSPRELOAD 0x0040L /* Object has preload pages */
404 #define NSEXRD 0x0004L /* Executable Object */
405 #define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
406 #endif
407 /*end*/
408
409 /***ET+ o32_map - Object Page Map entry */
410
411 struct o32_map /* Object Page Table entry */
412 {
413 unsigned long o32_pagedataoffset; /* file offset of page */
414 unsigned short o32_pagesize; /* # bytes of page data */
415 unsigned short o32_pageflags; /* Per-Page attributes */
416 };
417
418
419 #define GETPAGEIDX(x) ((x).o32_pagedataoffset)
420
421 #define PUTPAGEIDX(x,i) ((x).o32_pagedataoffset = ((unsigned long)(i)))
422
423 #define PUTPAGESIZ(x,i) ((x).o32_pagesize = ((unsigned int)(i)))
424
425 #define GETPAGESIZ(x) ((x).o32_pagesize)
426
427 #define PAGEFLAGS(x) (x).o32_pageflags
428
429
430 #define VALID 0x0000 /* Valid Physical Page in .EXE */
431 #define ITERDATA 0x0001 /* Iterated Data Page */
432 #define INVALID 0x0002 /* Invalid Page */
433 #define ZEROED 0x0003 /* Zero Filled Page */
434 #define RANGE 0x0004 /* Range of pages */
435 #define ITERDATA2 0x0005 /* Iterated Data Page Type II */
436 /*end*/
437
438 /*
439 * RESOURCE TABLE
440 */
441
442 /***ET+ rsrc32 - Resource Table Entry */
443
444 struct rsrc32 /* Resource Table Entry */
445 {
446 unsigned short type; /* Resource type */
447 unsigned short name; /* Resource name */
448 unsigned long cb; /* Resource size */
449 unsigned short obj; /* Object number */
450 unsigned long offset; /* Offset within object */
451 };
452 /*end*/
453
454
455 /*
456 * Iteration Record format for 'EXEPACK'ed pages.
457 */
458 struct LX_Iter
459 {
460 unsigned short LX_nIter; /* number of iterations */
461 unsigned short LX_nBytes; /* number of bytes */
462 unsigned char LX_Iterdata; /* iterated data byte(s) */
463 };
464
465
466 /*
467 * ENTRY TABLE DEFINITIONS
468 */
469
470 /***ET+ b32_bundle - Entry Table */
471
472 struct b32_bundle
473 {
474 unsigned char b32_cnt; /* Number of entries in this bundle */
475 unsigned char b32_type; /* Bundle type */
476 unsigned short b32_obj; /* Object number */
477 }; /* Follows entry types */
478
479 struct e32_entry
480 {
481 unsigned char e32_flags; /* Entry point flags */
482 union entrykind
483 {
484 offset e32_offset; /* 16-bit/32-bit offset entry */
485 struct callgate
486 {
487 unsigned short offset; /* Offset in segment */
488 unsigned short callgate; /* Callgate selector */
489 }
490 e32_callgate; /* 286 (16-bit) call gate */
491 struct fwd
492 {
493 unsigned short modord; /* Module ordinal number */
494 unsigned long value; /* Proc name offset or ordinal */
495 }
496 e32_fwd; /* Forwarder */
497 }
498 e32_variant; /* Entry variant */
499 };
500
501
502
503 #define B32_CNT(x) (x).b32_cnt
504 #define B32_TYPE(x) (x).b32_type
505 #define B32_OBJ(x) (x).b32_obj
506
507 #define E32_EFLAGS(x) (x).e32_flags
508 #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16
509 #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32
510 #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset
511 #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate
512 #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord
513 #define E32_VALUE(x) (x).e32_variant.e32_fwd.value
514
515 #define FIXENT16 3
516 #define FIXENT32 5
517 #define GATEENT16 5
518 #define FWDENT 7
519
520 /*
521 * BUNDLE TYPES
522 */
523
524 #define EMPTY 0x00 /* Empty bundle */
525 #define ENTRY16 0x01 /* 16-bit offset entry point */
526 #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */
527 #define ENTRY32 0x03 /* 32-bit offset entry point */
528 #define ENTRYFWD 0x04 /* Forwarder entry point */
529 #define TYPEINFO 0x80 /* Typing information present flag */
530
531
532 /*
533 * Format for E32_EFLAGS(x)
534 *
535 * 7 6 5 4 3 2 1 0 - bit no
536 * | | | | | | | |
537 * | | | | | | | +--- exported entry
538 * | | | | | | +----- uses shared data
539 * +-+-+-+-+-+------- parameter word count
540 */
541
542 #define E32EXPORT 0x01 /* Exported entry */
543 #define E32SHARED 0x02 /* Uses shared data */
544 #define E32PARAMS 0xf8 /* Parameter word count mask */
545
546 /*
547 * Flags for forwarders only:
548 */
549
550 #define FWD_ORDINAL 0x01 /* Imported by ordinal */
551
552
553 #pragma pack() /* Restore default alignment */
554
555 /*end*/
556
557 #endif /* __LX_EXE__ */
558