source: trunk/include/helpers/debug.h@ 23

Last change on this file since 23 was 14, checked in by umoeller, 25 years ago

Major updates; timers, LVM, miscellaneous.

  • Property svn:eol-style set to CRLF
  • Property svn:keywords set to Author Date Id Revision
File size: 80.2 KB
Line 
1/* $Id: debug.h 14 2000-12-09 19:19:42Z umoeller $ */
2
3
4/*
5 *@@sourcefile debug.h:
6 * header file for debug.c (exception handling and debugging).
7 * See remarks there.
8 *
9 * Note: Version numbering in this file relates to XWorkplace version
10 * numbering.
11 *
12 *@@changed V0.9.0: included contents of newexe.h
13 *
14 *@@include #define INCL_BASE
15 *@@include #include <os2.h>
16 *@@include #include <stdio.h>
17 *@@include #include "debug.h"
18 */
19
20/*
21 * This file incorporates code from the following:
22 * -- Marc Fiammante, John Currier, Kim Rasmussen,
23 * Anthony Cruise (EXCEPT3.ZIP package for a generic
24 * exception handling DLL, available at Hobbes).
25 *
26 * This file Copyright (C) 1992-99 Ulrich M”ller,
27 * Kim Rasmussen,
28 * Marc Fiammante,
29 * John Currier,
30 * Anthony Cruise.
31 * This program is free software; you can redistribute it and/or modify
32 * it under the terms of the GNU General Public License as published by
33 * the Free Software Foundation, in version 2 as it comes in the COPYING
34 * file of the XFolder main distribution.
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 */
40
41#ifndef DEBUG_HEADER_INCLUDED
42 #define DEBUG_HEADER_INCLUDED
43
44 /********************************************************************
45 *
46 * SYM file declarations
47 *
48 ********************************************************************/
49
50 // Pointer means offset from beginning of file or beginning of struct
51 #pragma pack(1)
52
53 typedef struct
54 {
55 unsigned short int ppNextMap; // paragraph pointer to next map
56 unsigned char bFlags; // symbol types
57 unsigned char bReserved1; // reserved
58 unsigned short int pSegEntry; // segment entry point value
59 unsigned short int cConsts; // count of constants in map
60 unsigned short int pConstDef; // pointer to constant chain
61 unsigned short int cSegs; // count of segments in map
62 unsigned short int ppSegDef; // paragraph pointer to first segment
63 unsigned char cbMaxSym; // maximum symbol-name length
64 unsigned char cbModName; // length of module name
65 char achModName[1]; // cbModName Bytes of module-name member
66 } MAPDEF;
67
68 typedef struct
69 {
70 unsigned short int ppNextMap; // always zero
71 unsigned char release; // release number (minor version number)
72 unsigned char version; // major version number
73 } LAST_MAPDEF;
74
75 typedef struct
76 {
77 unsigned short int ppNextSeg; // paragraph pointer to next segment
78 unsigned short int cSymbols; // count of symbols in list
79 unsigned short int pSymDef; // offset of symbol chain
80 unsigned short int wReserved1; // reserved
81 unsigned short int wReserved2; // reserved
82 unsigned short int wReserved3; // reserved
83 unsigned short int wReserved4; // reserved
84 unsigned char bFlags; // symbol types; bit 0 signals 32-bit (*UM)
85 unsigned char bReserved1; // reserved
86 unsigned short int ppLineDef; // offset of line number record
87 unsigned char bReserved2; // reserved
88 unsigned char bReserved3; // reserved
89 unsigned char cbSegName; // length of segment name
90 char achSegName[1]; /* cbSegName Bytes of segment-name member*/
91 } SEGDEF;
92
93 typedef struct
94 {
95 unsigned short int wSymVal; // symbol address or constant
96 unsigned char cbSymName; // length of symbol name
97 char achSymName[1]; // cbSymName Bytes of symbol-name member
98 } SYMDEF16;
99
100 typedef struct
101 {
102 unsigned int wSymVal; // symbol address or constant
103 unsigned char cbSymName; // length of symbol name
104 char achSymName[1]; // cbSymName Bytes of symbol-name member
105 } SYMDEF32;
106
107 typedef struct
108 {
109 unsigned short int ppNextLine; // ptr to next linedef (0 if last)
110 unsigned short int wReserved1; // reserved
111 unsigned short int pLines; // pointer to line numbers
112 unsigned short int cLines; // reserved
113 unsigned char cbFileName; // length of filename
114 char achFileName[1];// cbFileName Bytes of filename
115 } LINEDEF;
116
117 typedef struct
118 {
119 unsigned short int wCodeOffset; // executable offset
120 unsigned short int dwFileOffset; // source offset
121 } LINEINF;
122
123 #define SEGDEFOFFSET(MapDef) (MapDef.ppSegDef*16)
124 #define NEXTSEGDEFOFFSET(SegDef) (SegDef.ppNextSeg*16)
125
126 #define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef)
127 #define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int)))
128
129 #define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef)
130 #define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int)))
131
132 #define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16)
133 #define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16)
134 #define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines)
135
136 /********************************************************************
137 *
138 * EXE declarations taken from exe.h
139 *
140 ********************************************************************/
141
142 #ifndef WORD
143 typedef unsigned short WORD;
144 #endif
145
146 typedef WORD bbmask;
147
148 struct exe {
149 WORD eid; // contains EXEID, below
150 WORD elast; // # of bytes in last page
151 WORD epagsiz; // # of pages in whole file
152 WORD erelcnt; // # of relocation entrys
153 WORD ehdrsiz; // size of header, in paragraphs
154 WORD eminfre; // min # of free paragraphs needed
155 WORD emaxfre; // max # of free paragraphs needed
156 WORD eiSS; // initial SS value
157 WORD eiSP; // initial SP value
158 WORD enegsum; // negative sum of entire file
159 WORD eiIP; // initial IP value
160 WORD eiCS; // initial CS value
161 WORD ereloff; // offset in file of relocation table
162 WORD eovlnum; // number of the overlay
163
164 /* the following fields may not be present.
165 * ereloff = 28 not present
166 * = 30 exe.ever present and valid
167 * = 32 exe.ever field contains garbage
168 * ereloff > 32 exe.ever present and valid
169 * = 0 if "don't know"
170 */
171
172 WORD ever; // version # of producing linker
173 WORD dumy; // unused
174
175 /* the following fields may not be present - if the exe.ereloff
176 * value encompasses the fields then they are present and valid.
177 */
178
179 bbmask ebb; // behavior bits
180 WORD dumy2[7]; // must be 0 until defined
181 };
182
183
184 #define EXEID 0x5a4d // magic ID value
185
186 /********************************************************************
187 *
188 * Object Module Format (OMF) declarations
189 *
190 ********************************************************************/
191
192 struct exehdr_rec
193 {
194 BYTE signature[2]; // Must be "MZ"
195 USHORT image_len; // Image Length
196 USHORT pages; // Pages
197 USHORT reloc_items; // Relocation table items
198 USHORT min_paragraphs; // Mininum 16-bytes paragraphs
199 USHORT max_paragraphs; // Maximum 16-bytes paragraphs
200 USHORT stack_pos; // Stack position
201 USHORT offset_in_sp; // Offset in SP
202 USHORT checksum; // Checksum
203 USHORT offset_in_ip; // Offset in IP
204 USHORT code_pos; // Code segment pos.
205 USHORT reloc_item_pos; // Position of first relocation item
206 USHORT overlay_number; // Overlay number
207 BYTE unused[8]; // Unused bytes
208 USHORT oem_id; // OEM Identifier
209 BYTE oem_info[24]; // OEM Info
210 ULONG lexe_offset; // Offset to linear header
211 };
212
213 struct lexehdr_rec
214 {
215 BYTE signature[2]; // Must be "LX"
216 BYTE b_ord; // Byte ordering
217 BYTE w_ord; // Word ordering
218 ULONG format_level; // Format level
219 USHORT cpu_type; // CPU Type
220 USHORT os_type; // Operating system
221 ULONG module_version; // Module version
222 ULONG mod_flags; // Module flags
223 ULONG mod_pages; // Module pages
224 ULONG EIP_object; // EIP Object no.
225 ULONG EIP; // EIP Value
226 ULONG ESP_object; // ESP Object no
227 ULONG ESP; // ESP Value
228 ULONG page_size; // Page size
229 ULONG page_ofs_shift; // Page offset shift
230 ULONG fixup_sect_size; // Fixup section size
231 ULONG fixup_sect_checksum; // Fixup section checksum
232 ULONG loader_sect_size; // Loader section size
233 ULONG loader_sect_checksum; // Loader section checksum
234 ULONG obj_table_ofs; // Object table offset
235 ULONG obj_count; // Object count
236 ULONG obj_page_tab_ofs; // Object page table offset
237 ULONG obj_iter_page_ofs; // Object iteration pages offset
238 ULONG res_tab_ofs; // Resource table offset
239 ULONG res_table_entries; // Resource table entries
240 ULONG res_name_tab_ofs; // Resident name table offset;
241 ULONG ent_tab_ofs; // Entry table offset
242 ULONG mod_dir_ofs; // Module directives offset
243 ULONG mod_dir_count; // Number of module directives
244 ULONG fixup_page_tab_ofs; // Fixup page table offset
245 ULONG fixup_rec_tab_ofs; // Fixup record table offset
246 ULONG imp_tab_ofs; // Import module table offset
247 ULONG imp_mod_entries; // Import module entries
248 ULONG imp_proc_tab_ofs; // Import proc table offset
249 ULONG per_page_check_ofs; // Per page checksum offset
250 ULONG data_page_offset; // Data pages offset
251 ULONG preload_page_count; // Preload pages count
252 ULONG nonres_tab_ofs; // Nonresident name table offset
253 ULONG nonres_tab_len; // Nonresident name table len
254 ULONG nonres_tab_check; // Nonresident tables checksum
255 ULONG auto_ds_objectno; // Auto DS object number
256 ULONG debug_info_ofs; // Debug info offset
257 ULONG debug_info_len; // Debug info length
258 ULONG inst_preload_count; // Instance preload count
259 ULONG inst_demand_count; // Instance demand count
260 ULONG heapsize; // Heap size
261 ULONG stacksize; // Stack size
262 };
263
264 struct debug_head_rec
265 {
266 BYTE signature[3]; // Debug signature
267 BYTE type; // Debug info type
268 };
269
270 struct dir_inf_rec
271 {
272 USHORT dirstruct_size; // Size of directory structure
273 USHORT number_of_entries; // Number of dnt_rec's in the array
274 USHORT unknown; // Unknown data
275 // Followed by an array of dnt_rec structures
276 };
277
278 struct dnt_rec
279 {
280 USHORT subsect_type; // sst Subsection type
281 USHORT mod_index; // Module index (1-based)
282 ULONG offset; // Offset of start of section
283 ULONG size; // Size of section
284 };
285
286 // Modules subsection
287 struct modules_rec
288 {
289 USHORT code_seg_base; // Code segment base
290 ULONG code_seg_offset; // Code segment offset
291 ULONG code_seg_len; // Code segment length
292 USHORT overlay_no; // Overlay number
293 USHORT lib_idx; // Index into library section or 0
294 BYTE segments; // Number of segments
295 BYTE reserved;
296 BYTE debug_style[2]; // "HL" for HLL, "CV" or 0 for CodeView
297 BYTE debug_version[2]; // 00 01 or 00 03 for HLL, 00 00 for CV
298 BYTE name_len; // Length of name (which follows)
299 };
300
301 // Publics subsection
302 struct publics_rec
303 {
304 ULONG offset; // Offset
305 USHORT segment; // Segment
306 USHORT type; // Type index
307 BYTE name_len; // Length of name (wich follows)
308 };
309
310 #if 0
311 // Linenumbers header
312 struct linhead_rec
313 {
314 BYTE id; // 0x95 for flat mem, 32 bit progs
315 USHORT length; // Record length
316 USHORT base_group; // Base group
317 USHORT base_segment; // Base segment
318 };
319 #endif
320
321 // First linenumber record
322 struct linfirst_rec
323 {
324 USHORT lineno; // Line number (0)
325 BYTE entry_type; // Entry type
326 BYTE reserved; // Reserved
327 USHORT entries_count; // Number of table entries
328 USHORT segment_no; // Segment number
329 ULONG filename_tabsize; // File names table size
330 };
331
332 // Source line numbers
333 struct linsource_rec
334 {
335 USHORT source_line; // Source file line number
336 USHORT source_idx; // Source file index
337 ULONG offset; // Offset into segment
338 };
339
340 // Listing statement numbers
341 struct linlist_rec
342 {
343 ULONG list_line; // Listing file linenumber
344 ULONG statement; // Listing file statement number
345 ULONG offset; // Offset into segment
346 };
347
348 // Source and Listing statement numbers
349 struct linsourcelist_rec
350 {
351 USHORT source_line; // Source file line number
352 USHORT source_idx; // Source file index
353 ULONG list_line; // Listing file linenumber
354 ULONG statement; // Listing file statement number
355 ULONG offset; // Offset into segment
356 };
357
358 // Path table
359 struct pathtab_rec
360 {
361 ULONG offset; // Offset into segment
362 USHORT path_code; // Path code
363 USHORT source_idx; // Source file index
364 };
365
366 // File names table
367 struct filenam_rec
368 {
369 ULONG first_char; // First displayable char in list file
370 ULONG disp_chars; // Number of displayable chars in list line
371 ULONG filecount; // Number of source/listing files
372 };
373
374 // Symbol types
375 #define SYM_BEGIN 0x00 // Begin block
376 #define SYM_PROC 0x01 // Function
377 #define SYM_END 0x02 // End block of function
378 #define SYM_AUTO 0x04 // Auto variable
379 #define SYM_STATIC 0x05 // Static variable
380 #define SYM_LABEL 0x0B // Label
381 #define SYM_WITH 0x0C // With start symbol (not used)
382 #define SYM_REG 0x0D // Register variable
383 #define SYM_CONST 0x0E // Constant
384 #define SYM_ENTRY 0x0F // Secondary entry (not in C)
385 #define SYM_SKIP 0x10 // For incremental linking (not used)
386 #define SYM_CHANGESEG 0x11 // Change segment (#pragma alloc_text)
387 #define SYM_TYPEDEF 0x12 // Typedef variable
388 #define SYM_PUBLIC 0x13 // Public reference
389 #define SYM_MEMBER 0x14 // Member of minor or major structure
390 #define SYM_BASED 0x15 // Based variable
391 #define SYM_TAG 0x16 // Tag in struct, union, enum ...
392 #define SYM_TABLE 0x17 // Table (used in RPG - not C)
393 #define SYM_MAP 0x18 // Map variable (extern in C)
394 #define SYM_CLASS 0x19 // Class symbol (C++)
395 #define SYM_MEMFUNC 0x1A // Member function
396 #define SYM_AUTOSCOPE 0x1B // Scoped auto for C++ (not used)
397 #define SYM_STATICSCOPE 0x1C // scoped static for C++ (not used)
398 #define SYM_CPPPROC 0x1D // C++ Proc
399 #define SYM_CPPSTAT 0x1E // C++ Static var
400 #define SYM_COMP 0x40 // Compiler information
401
402 // Symbolic begin record
403 struct symbegin_rec
404 {
405 ULONG offset; // Segment offset
406 ULONG length; // Length of block
407 BYTE name_len; // Length of block name
408 // Block name follows
409 };
410
411 // Symbolic auto var record
412 struct symauto_rec
413 {
414 ULONG stack_offset; // Stack offset
415 USHORT type_idx; // Type index
416 BYTE name_len; // Length of name
417 // Var name follows
418 };
419
420 // Symbolic procedure record
421 struct symproc_rec
422 {
423 ULONG offset; // Segment offset
424 USHORT type_idx; // Type index
425 ULONG length; // Length of procedure
426 USHORT pro_len; // Length of prologue
427 ULONG pro_bodylen; // Length of prologue + body
428 USHORT class_type; // Class type
429 BYTE near_far; // Near or far
430 BYTE name_len; // Length of name
431 // Function name follows
432 };
433
434 // Symbolic static var record
435 struct symstatic_rec
436 {
437 ULONG offset; // Segment offset
438 USHORT segaddr; // Segment address
439 USHORT type_idx; // Type index
440 BYTE name_len; // Length of name
441 // Var name follows
442 };
443
444 // Symbolic label var record
445 struct symlabel_rec
446 {
447 ULONG offset; // Segment offset
448 BYTE near_far; // Near or far
449 BYTE name_len; // Length of name
450 // Var name follows
451 };
452
453 // Symbolic register var record
454 struct symreg_rec
455 {
456 USHORT type_idx; // Type index
457 BYTE reg_no; // Register number
458 BYTE name_len; // Length of name
459 // Var name follows
460 };
461
462 // Symbolic change-segment record
463 struct symseg_rec
464 {
465 USHORT seg_no; // Segment number
466 };
467
468 // Symbolic typedef record
469 struct symtypedef_rec
470 {
471 USHORT type_idx; // Type index
472 BYTE name_len; // Length of name
473 // Name follows
474 };
475
476 // Symbolic public record
477 struct sympublic_rec
478 {
479 ULONG offset; // Segment offset
480 USHORT segaddr; // Segment address
481 USHORT type_idx; // Type index
482 BYTE name_len; // Length of name
483 // Name follows
484 };
485
486 // Symbolic member record
487 struct symmember_rec
488 {
489 ULONG offset; // Offset to subrecord
490 BYTE name_len; // Length of name
491 // Name follows
492 };
493
494 // Symbolic based record
495 struct symbased_rec
496 {
497 ULONG offset; // Offset to subrecord
498 USHORT type_idx; // Type index
499 BYTE name_len; // Length of name
500 // Name follows
501 };
502
503 // Symbolic tag record
504 struct symtag_rec
505 {
506 USHORT type_idx; // Type index
507 BYTE name_len; // Length of name
508 // Name follows
509 };
510
511 // Symbolic table record
512 struct symtable_rec
513 {
514 ULONG offset; // Segment offset
515 USHORT segaddr; // Segment address
516 USHORT type_idx; // Type index
517 ULONG idx_ofs; // Index offset to subrecord
518 BYTE name_len; // Length of name
519 // Name follows
520 };
521
522 // Type record
523 struct type_rec
524 {
525 USHORT length; // Length of sub-record
526 BYTE type; // Sub-record type
527 BYTE type_qual; // Type qualifier
528 };
529
530 // Types
531 #define TYPE_CLASS 0x40 // Class
532 #define TYPE_BASECLASS 0x41 // Base class
533 #define TYPE_FRIEND 0x42 // Friend
534 #define TYPE_CLASSDEF 0x43 // Class definition
535 #define TYPE_MEMBERFUNC 0x45 // Member function
536 #define TYPE_CLASSMEMBER 0x46 // Class member
537 #define TYPE_REF 0x48 // Reference
538 #define TYPE_MEMBERPTR 0x49 // Member pointer
539 #define TYPE_SCALARS 0x51 // Scalars
540 #define TYPE_SET 0x52 // Set
541 #define TYPE_ENTRY 0x53 // Entry
542 #define TYPE_FUNCTION 0x54 // Function
543 #define TYPE_AREA 0x55 // Area
544 #define TYPE_LOGICAL 0x56 // Logical
545 #define TYPE_STACK 0x57 // Stack
546 #define TYPE_MACRO 0x59 // Macro
547 #define TYPE_BITSTRING 0x5C // Bit string
548 #define TYPE_USERDEF 0x5D // User defined
549 #define TYPE_CHARSTR 0x60 // Character string
550 #define TYPE_PICTURE 0x61 // Picture
551 #define TYPE_GRAPHIC 0x62 // Graphic
552 #define TYPE_FORMATLAB 0x65 // Format label
553 #define TYPE_FILE 0x67 // File
554 #define TYPE_SUBRANGE 0x6F // Subrange
555 #define TYPE_CODELABEL 0x72 // Code label
556 #define TYPE_PROCEDURE 0x75 // Procedure
557 #define TYPE_ARRAY 0x78 // Array
558 #define TYPE_STRUCT 0x79 // Structure / Union / Record
559 #define TYPE_POINTER 0x7A // Pointer
560 #define TYPE_ENUM 0x7B // Enum
561 #define TYPE_LIST 0x7F // List
562
563 // Type userdef
564 struct type_userdefrec
565 {
566 BYTE FID_index; // Field ID
567 USHORT type_index; // Type index
568 BYTE FID_string; // String ID
569 BYTE name_len; // Length of name which follows
570 };
571
572 // Type function
573 struct type_funcrec
574 {
575 USHORT params;
576 USHORT max_params;
577 BYTE FID_index; // Field ID
578 USHORT type_index; // Type index of return value
579 BYTE FID_index1; // String ID
580 USHORT typelist_index; // Index of list of params
581 };
582
583 // Type struct
584 struct type_structrec
585 {
586 ULONG size; // Size of structure
587 USHORT field_count; // Number of fields in structure
588 BYTE FID_index; // Field ID
589 USHORT type_list_idx; // Index to type list
590 BYTE FID_index1; // Field ID
591 USHORT type_name_idx; // Index to names / offsets
592 BYTE dont_know; // Haven't a clue, but it seems to be needed
593 BYTE name_len; // Length of structure name which follows
594 };
595
596 // Type list, type qualifier 1: contains types for structures
597 // This record is repeated for the number of items in the structure definition
598 struct type_list1
599 {
600 BYTE FID_index; // Field identifier for index
601 USHORT type_index; // Type index.
602 };
603
604 // Type list, type qualifier 2: contains names and offsets for structure items
605 // This record is repeated for the number of items in the structure definition
606 struct type_list2
607 {
608 BYTE FID_string; // String identifier
609 BYTE name_len; // Length of name which follows
610 };
611
612 // Type list, subrecord to the above, contains offset of variable in the structure
613 struct type_list2_1
614 {
615 BYTE FID_span; // Defines what type of variable follows
616 union {
617 BYTE b_len;
618 USHORT s_len;
619 ULONG l_len;
620 } u;
621 };
622
623 // Type pointer
624 struct type_pointerrec
625 {
626 BYTE FID_index; // Index identifier
627 USHORT type_index; // Type index
628 BYTE FID_string; // String identifier
629 BYTE name_len; // Length of name which follows
630 };
631
632 /********************************************************************
633 *
634 * Prototypes
635 *
636 ********************************************************************/
637
638 BOOL dbgPrintStackFrame(FILE *LogFile,
639 PSZ pszModuleName, // in: module name (fully q'fied)
640 ULONG ulObject,
641 ULONG ulOffset);
642
643 VOID dbgPrintStack(FILE *file,
644 PUSHORT StackBottom,
645 PUSHORT StackTop,
646 PUSHORT Ebp,
647 PUSHORT ExceptionAddress);
648
649 APIRET APIENTRY DosQueryModFromEIP(HMODULE *phMod, // out: trapping module
650 ULONG *pulObjNum, // out: object/segment number
651 ULONG ulBuffLen, // in: sizeof(*pszBuff)
652 CHAR *pszBuff, // out: module name
653 ULONG *pulOffset, // out: offset in module
654 ULONG ulAddress); // in: address to be analyzed
655
656 APIRET APIENTRY DOSQUERYMODFROMEIP(HMODULE * phMod,
657 ULONG * pObjNum,
658 ULONG BuffLen,
659 PCHAR pBuff,
660 ULONG * pOffset,
661 PVOID Address);
662
663 typedef ULONG *_Seg16 PULONG16;
664 APIRET16 APIENTRY16 DOS16SIZESEG(USHORT Seg, PULONG16 Size);
665 typedef APIRET16(APIENTRY16 _PFN16) (VOID);
666 ULONG APIENTRY DosSelToFlat(ULONG);
667
668 APIRET16 APIENTRY16 DOSQPROCSTATUS(ULONG * _Seg16 pBuf, USHORT cbBuf);
669
670 #define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp))
671
672 #pragma pack() // added V0.9.0
673
674
675 /********************************************************************
676 *
677 * Executable definitions
678 *
679 ********************************************************************/
680
681 #define EXE386 1
682
683 #ifndef __NEWEXE__
684 #define __NEWEXE__
685
686 #pragma pack(1)
687
688 /*_________________________________________________________________*
689 | |
690 | |
691 | DOS3 .EXE FILE HEADER DEFINITION |
692 | |
693 |_________________________________________________________________|
694 * */
695
696
697 #define EMAGIC 0x5A4D // Old magic number
698 #define ENEWEXE sizeof(struct exe_hdr)
699 // Value of E_LFARLC for new .EXEs
700 #define ENEWHDR 0x003C // Offset in old hdr. of ptr. to new
701 #define ERESWDS 0x0010 // No. of reserved words (OLD)
702 #define ERES1WDS 0x0004 // No. of reserved words in e_res
703 #define ERES2WDS 0x000A // No. of reserved words in e_res2
704 #define ECP 0x0004 // Offset in struct of E_CP
705 #define ECBLP 0x0002 // Offset in struct of E_CBLP
706 #define EMINALLOC 0x000A // Offset in struct of E_MINALLOC
707
708 /*
709 *@@ exe_hdr:
710 * DOS 1, 2, 3 .EXE header.
711 */
712
713 struct exe_hdr
714 {
715 unsigned short e_magic; // Magic number
716 unsigned short e_cblp; // Bytes on last page of file
717 unsigned short e_cp; // Pages in file
718 unsigned short e_crlc; // Relocations
719 unsigned short e_cparhdr; // Size of header in paragraphs
720 unsigned short e_minalloc; // Minimum extra paragraphs needed
721 unsigned short e_maxalloc; // Maximum extra paragraphs needed
722 unsigned short e_ss; // Initial (relative) SS value
723 unsigned short e_sp; // Initial SP value
724 unsigned short e_csum; // Checksum
725 unsigned short e_ip; // Initial IP value
726 unsigned short e_cs; // Initial (relative) CS value
727 unsigned short e_lfarlc; // File address of relocation table
728 unsigned short e_ovno; // Overlay number
729 unsigned short e_res[ERES1WDS];// Reserved words
730 unsigned short e_oemid; // OEM identifier (for e_oeminfo)
731 unsigned short e_oeminfo; // OEM information; e_oemid specific
732 unsigned short e_res2[ERES2WDS];// Reserved words
733 long e_lfanew; // File address of new exe header
734 };
735
736 #define E_MAGIC(x) (x).e_magic
737 #define E_CBLP(x) (x).e_cblp
738 #define E_CP(x) (x).e_cp
739 #define E_CRLC(x) (x).e_crlc
740 #define E_CPARHDR(x) (x).e_cparhdr
741 #define E_MINALLOC(x) (x).e_minalloc
742 #define E_MAXALLOC(x) (x).e_maxalloc
743 #define E_SS(x) (x).e_ss
744 #define E_SP(x) (x).e_sp
745 #define E_CSUM(x) (x).e_csum
746 #define E_IP(x) (x).e_ip
747 #define E_CS(x) (x).e_cs
748 #define E_LFARLC(x) (x).e_lfarlc
749 #define E_OVNO(x) (x).e_ovno
750 #define E_RES(x) (x).e_res
751 #define E_OEMID(x) (x).e_oemid
752 #define E_OEMINFO(x) (x).e_oeminfo
753 #define E_RES2(x) (x).e_res2
754 #define E_LFANEW(x) (x).e_lfanew
755
756
757 /*_________________________________________________________________*
758 | |
759 | |
760 | OS/2 & WINDOWS .EXE FILE HEADER DEFINITION - 286 version |
761 | |
762 |_________________________________________________________________|
763 * */
764
765 #define NEMAGIC 0x454E // New magic number
766 #define NERESBYTES 8 // Eight bytes reserved (now)
767 #define NECRC 8 // Offset into new header of NE_CRC
768
769 /*
770 *@@ new_exe:
771 * New Executable (NE) header.
772 * Follows DOS header in the executable file.
773 */
774
775 struct new_exe
776 {
777 unsigned short ne_magic; // Magic number NE_MAGIC
778 unsigned char ne_ver; // Version number
779 unsigned char ne_rev; // Revision number
780 unsigned short ne_enttab; // Offset of Entry Table
781 unsigned short ne_cbenttab; // Number of bytes in Entry Table
782 long ne_crc; // Checksum of whole file
783 unsigned short ne_flags; // Flag word
784 unsigned short ne_autodata; // Automatic data segment number
785 unsigned short ne_heap; // Initial heap allocation
786 unsigned short ne_stack; // Initial stack allocation
787 long ne_csip; // Initial CS:IP setting
788 long ne_sssp; // Initial SS:SP setting
789 unsigned short ne_cseg; // Count of file segments
790 unsigned short ne_cmod; // Entries in Module Reference Table
791 unsigned short ne_cbnrestab; // Size of non-resident name table
792 unsigned short ne_segtab; // Offset of Segment Table
793 unsigned short ne_rsrctab; // Offset of Resource Table
794 unsigned short ne_restab; // Offset of resident name table
795 unsigned short ne_modtab; // Offset of Module Reference Table
796 unsigned short ne_imptab; // Offset of Imported Names Table
797 long ne_nrestab; // Offset of Non-resident Names Table
798 unsigned short ne_cmovent; // Count of movable entries
799 unsigned short ne_align; // Segment alignment shift count
800 unsigned short ne_cres; // Count of resource entries
801 unsigned char ne_exetyp; // Target operating system
802 unsigned char ne_flagsothers; // Other .EXE flags
803 char ne_res[NERESBYTES]; // Pad structure to 64 bytes
804 };
805
806 #pragma pack()
807
808 #define NE_MAGIC(x) (x).ne_magic
809 #define NE_VER(x) (x).ne_ver
810 #define NE_REV(x) (x).ne_rev
811 #define NE_ENTTAB(x) (x).ne_enttab
812 #define NE_CBENTTAB(x) (x).ne_cbenttab
813 #define NE_CRC(x) (x).ne_crc
814 #define NE_FLAGS(x) (x).ne_flags
815 #define NE_AUTODATA(x) (x).ne_autodata
816 #define NE_HEAP(x) (x).ne_heap
817 #define NE_STACK(x) (x).ne_stack
818 #define NE_CSIP(x) (x).ne_csip
819 #define NE_SSSP(x) (x).ne_sssp
820 #define NE_CSEG(x) (x).ne_cseg
821 #define NE_CMOD(x) (x).ne_cmod
822 #define NE_CBNRESTAB(x) (x).ne_cbnrestab
823 #define NE_SEGTAB(x) (x).ne_segtab
824 #define NE_RSRCTAB(x) (x).ne_rsrctab
825 #define NE_RESTAB(x) (x).ne_restab
826 #define NE_MODTAB(x) (x).ne_modtab
827 #define NE_IMPTAB(x) (x).ne_imptab
828 #define NE_NRESTAB(x) (x).ne_nrestab
829 #define NE_CMOVENT(x) (x).ne_cmovent
830 #define NE_ALIGN(x) (x).ne_align
831 #define NE_CRES(x) (x).ne_cres
832 #define NE_RES(x) (x).ne_res
833 #define NE_EXETYP(x) (x).ne_exetyp
834 #define NE_FLAGSOTHERS(x) (x).ne_flagsothers
835
836 #define NE_USAGE(x) (WORD)*((WORD *)(x)+1)
837 #define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab
838 #define NE_ONEWEXE(x) (WORD)(x).ne_crc
839 #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)
840
841
842 /*
843 * Target operating systems
844 */
845
846 #define NE_UNKNOWN 0x0 /* Unknown (any "new-format" OS) */
847 #define NE_OS2 0x1 /* OS/2 (default) */
848 #define NE_WINDOWS 0x2 /* Windows */
849 #define NE_DOS4 0x3 /* DOS 4.x */
850 #define NE_DEV386 0x4 /* Windows 386 */
851
852
853 /*
854 * Format of NE_FLAGS(x):
855 *
856 * p Not-a-process
857 * x Unused
858 * e Errors in image
859 * x Unused
860 * b Bound Family/API
861 * ttt Application type
862 * f Floating-point instructions
863 * 3 386 instructions
864 * 2 286 instructions
865 * 0 8086 instructions
866 * P Protected mode only
867 * p Per-process library initialization
868 * i Instance data
869 * s Solo data
870 */
871 #define NENOTP 0x8000 /* Not a process */
872 #define NEIERR 0x2000 /* Errors in image */
873 #define NEBOUND 0x0800 /* Bound Family/API */
874 #define NEAPPTYP 0x0700 /* Application type mask */
875 #define NENOTWINCOMPAT 0x0100 /* Not compatible with P.M. Windowing */
876 #define NEWINCOMPAT 0x0200 /* Compatible with P.M. Windowing */
877 #define NEWINAPI 0x0300 /* Uses P.M. Windowing API */
878 #define NEFLTP 0x0080 /* Floating-point instructions */
879 #define NEI386 0x0040 /* 386 instructions */
880 #define NEI286 0x0020 /* 286 instructions */
881 #define NEI086 0x0010 /* 8086 instructions */
882 #define NEPROT 0x0008 /* Runs in protected mode only */
883 #define NEPPLI 0x0004 /* Per-Process Library Initialization */
884 #define NEINST 0x0002 /* Instance data */
885 #define NESOLO 0x0001 /* Solo data */
886
887 /*
888 * Format of NE_FLAGSOTHERS(x):
889 *
890 * 7 6 5 4 3 2 1 0 - bit no
891 * | | | |
892 * | | | +---------------- Support for long file names
893 * | | +------------------ Windows 2.x app runs in prot mode
894 * | +-------------------- Windows 2.x app gets prop. font
895 * +------------------------------ WLO appl on OS/2 (markwlo.exe)
896 *
897 */
898
899 #define NELONGNAMES 0x01
900 #define NEWINISPROT 0x02
901 #define NEWINGETPROPFON 0x04
902 #define NEWLOAPPL 0x80
903
904
905
906 struct new_seg /* New .EXE segment table entry */
907 {
908 unsigned short ns_sector; /* File sector of start of segment */
909 unsigned short ns_cbseg; /* Number of bytes in file */
910 unsigned short ns_flags; /* Attribute flags */
911 unsigned short ns_minalloc; /* Minimum allocation in bytes */
912 };
913
914 #define NS_SECTOR(x) (x).ns_sector
915 #define NS_CBSEG(x) (x).ns_cbseg
916 #define NS_FLAGS(x) (x).ns_flags
917 #define NS_MINALLOC(x) (x).ns_minalloc
918
919
920 /*
921 * Format of NS_FLAGS(x)
922 *
923 * Flag word has the following format:
924 *
925 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
926 * | | | | | | | | | | | | | | |
927 * | | | | | | | | | | | | +-+-+--- Segment type DATA/CODE
928 * | | | | | | | | | | | +--------- Iterated segment
929 * | | | | | | | | | | +----------- Movable segment
930 * | | | | | | | | | +------------- Segment can be shared
931 * | | | | | | | | +--------------- Preload segment
932 * | | | | | | | +----------------- Execute/read-only for code/data segment
933 * | | | | | | +------------------- Segment has relocations
934 * | | | | | +--------------------- Code conforming/Data is expand down
935 * | | | +--+----------------------- I/O privilege level
936 * | | +----------------------------- Discardable segment
937 * | +-------------------------------- 32-bit code segment
938 * +----------------------------------- Huge segment/GDT allocation requested
939 *
940 */
941
942 #define NSTYPE 0x0007 /* Segment type mask */
943
944 #ifdef EXE386
945 #define NSCODE 0x0000 /* Code segment */
946 #define NSDATA 0x0001 /* Data segment */
947 #define NSITER 0x0008 /* Iterated segment flag */
948 #define NSMOVE 0x0010 /* Movable segment flag */
949 #define NSSHARED 0x0020 /* Shared segment flag */
950 #define NSPRELOAD 0x0040 /* Preload segment flag */
951 #define NSEXRD 0x0080 /* Execute-only (code segment), or
952 * read-only (data segment)
953 */
954 #define NSRELOC 0x0100 /* Segment has relocations */
955 #define NSCONFORM 0x0200 /* Conforming segment */
956 #define NSEXPDOWN 0x0200 /* Data segment is expand down */
957 #define NSDPL 0x0C00 /* I/O privilege level (286 DPL bits) */
958 #define SHIFTDPL 10 /* Left shift count for SEGDPL field */
959 #define NSDISCARD 0x1000 /* Segment is discardable */
960 #define NS32BIT 0x2000 /* 32-bit code segment */
961 #define NSHUGE 0x4000 /* Huge memory segment, length of
962 * segment and minimum allocation
963 * size are in segment sector units
964 */
965 #define NSGDT 0x8000 /* GDT allocation requested */
966
967 #define NSPURE NSSHARED /* For compatibility */
968
969 #define NSALIGN 9 /* Segment data aligned on 512 byte boundaries */
970
971 #define NSLOADED 0x0004 /* ns_sector field contains memory addr */
972 #endif
973
974
975 struct new_segdata /* Segment data */
976 {
977 union
978 {
979 struct
980 {
981 unsigned short ns_niter; /* number of iterations */
982 unsigned short ns_nbytes; /* number of bytes */
983 char ns_iterdata; /* iterated data bytes */
984 } ns_iter;
985 struct
986 {
987 char ns_data; /* data bytes */
988 } ns_noniter;
989 } ns_union;
990 };
991
992 struct new_rlcinfo /* Relocation info */
993 {
994 unsigned short nr_nreloc; /* number of relocation items that */
995 }; /* follow */
996
997 #pragma pack(1)
998
999
1000 struct new_rlc /* Relocation item */
1001 {
1002 char nr_stype; /* Source type */
1003 char nr_flags; /* Flag byte */
1004 unsigned short nr_soff; /* Source offset */
1005 union
1006 {
1007 struct
1008 {
1009 char nr_segno; /* Target segment number */
1010 char nr_res; /* Reserved */
1011 unsigned short nr_entry; /* Target Entry Table offset */
1012 } nr_intref; /* Internal reference */
1013 struct
1014 {
1015 unsigned short nr_mod; /* Index into Module Reference Table */
1016 unsigned short nr_proc; /* Procedure ordinal or name offset */
1017 } nr_import; /* Import */
1018 struct
1019 {
1020 unsigned short nr_ostype; /* OSFIXUP type */
1021 unsigned short nr_osres; /* reserved */
1022 } nr_osfix; /* Operating system fixup */
1023 } nr_union; /* Union */
1024 };
1025
1026 #pragma pack()
1027
1028
1029 #define NR_STYPE(x) (x).nr_stype
1030 #define NR_FLAGS(x) (x).nr_flags
1031 #define NR_SOFF(x) (x).nr_soff
1032 #define NR_SEGNO(x) (x).nr_union.nr_intref.nr_segno
1033 #define NR_RES(x) (x).nr_union.nr_intref.nr_res
1034 #define NR_ENTRY(x) (x).nr_union.nr_intref.nr_entry
1035 #define NR_MOD(x) (x).nr_union.nr_import.nr_mod
1036 #define NR_PROC(x) (x).nr_union.nr_import.nr_proc
1037 #define NR_OSTYPE(x) (x).nr_union.nr_osfix.nr_ostype
1038 #define NR_OSRES(x) (x).nr_union.nr_osfix.nr_osres
1039
1040
1041
1042 /*
1043 * Format of NR_STYPE(x) and R32_STYPE(x):
1044 *
1045 * 7 6 5 4 3 2 1 0 - bit no
1046 * | | | |
1047 * +-+-+-+--- source type
1048 *
1049 */
1050
1051 #define NRSTYP 0x0f /* Source type mask */
1052 #define NRSBYT 0x00 /* lo byte (8-bits)*/
1053 #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
1054 #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
1055 #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
1056 #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
1057 #define NROFF32 0x07 /* 32-bit offset (32-bits) */
1058 #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
1059
1060
1061 /*
1062 * Format of NR_FLAGS(x) and R32_FLAGS(x):
1063 *
1064 * 7 6 5 4 3 2 1 0 - bit no
1065 * | | |
1066 * | +-+--- Reference type
1067 * +------- Additive fixup
1068 */
1069
1070 #define NRADD 0x04 /* Additive fixup */
1071 #define NRRTYP 0x03 /* Reference type mask */
1072 #define NRRINT 0x00 /* Internal reference */
1073 #define NRRORD 0x01 /* Import by ordinal */
1074 #define NRRNAM 0x02 /* Import by name */
1075 #define NRROSF 0x03 /* Operating system fixup */
1076
1077
1078 #if (EXE386 == 0)
1079
1080 /* Resource type or name string */
1081 struct rsrc_string
1082 {
1083 char rs_len; /* number of bytes in string */
1084 char rs_string[ 1 ]; /* text of string */
1085 };
1086
1087 #define RS_LEN( x ) (x).rs_len
1088 #define RS_STRING( x ) (x).rs_string
1089
1090 /* Resource type information block */
1091 struct rsrc_typeinfo
1092 {
1093 unsigned short rt_id;
1094 unsigned short rt_nres;
1095 long rt_proc;
1096 };
1097
1098 #define RT_ID( x ) (x).rt_id
1099 #define RT_NRES( x ) (x).rt_nres
1100 #define RT_PROC( x ) (x).rt_proc
1101
1102 /* Resource name information block */
1103 struct rsrc_nameinfo
1104 {
1105 /* The following two fields must be shifted left by the value of */
1106 /* the rs_align field to compute their actual value. This allows */
1107 /* resources to be larger than 64k, but they do not need to be */
1108 /* aligned on 512 byte boundaries, the way segments are */
1109 unsigned short rn_offset; /* file offset to resource data */
1110 unsigned short rn_length; /* length of resource data */
1111 unsigned short rn_flags; /* resource flags */
1112 unsigned short rn_id; /* resource name id */
1113 unsigned short rn_handle; /* If loaded, then global handle */
1114 unsigned short rn_usage; /* Initially zero. Number of times */
1115 /* the handle for this resource has */
1116 /* been given out */
1117 };
1118
1119 #define RN_OFFSET( x ) (x).rn_offset
1120 #define RN_LENGTH( x ) (x).rn_length
1121 #define RN_FLAGS( x ) (x).rn_flags
1122 #define RN_ID( x ) (x).rn_id
1123 #define RN_HANDLE( x ) (x).rn_handle
1124 #define RN_USAGE( x ) (x).rn_usage
1125
1126 #define RSORDID 0x8000 /* if high bit of ID set then integer id */
1127 /* otherwise ID is offset of string from
1128 the beginning of the resource table */
1129
1130 /* Ideally these are the same as the */
1131 /* corresponding segment flags */
1132 #define RNMOVE 0x0010 /* Moveable resource */
1133 #define RNPURE 0x0020 /* Pure (read-only) resource */
1134 #define RNPRELOAD 0x0040 /* Preloaded resource */
1135 #define RNDISCARD 0xF000 /* Discard priority level for resource */
1136
1137 /* Resource table */
1138 struct new_rsrc
1139 {
1140 unsigned short rs_align; /* alignment shift count for resources */
1141 struct rsrc_typeinfo rs_typeinfo;
1142 };
1143
1144 #define RS_ALIGN( x ) (x).rs_align
1145
1146
1147 #endif /* NOT EXE386 */
1148
1149 #endif /* __NEWEXE__ */
1150
1151 #ifndef DWORD
1152 #define DWORD long int
1153 #endif
1154
1155 #ifndef WORD
1156 #define WORD short int
1157 #endif
1158
1159 #ifndef __EXE386__
1160 #define __EXE386__
1161
1162 #pragma pack(1) /* Force byte alignment */
1163
1164 /*_________________________________________________________________*
1165 | |
1166 | |
1167 | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 |
1168 | |
1169 |_________________________________________________________________|
1170 * */
1171
1172 #define BITPERWORD 16
1173 #define BITPERBYTE 8
1174 #define OBJPAGELEN 4096
1175 #define E32MAGIC1 'L' /* New magic number "LX" */
1176 #define E32MAGIC2 'X' /* New magic number "LX" */
1177 #define E32MAGIC 0x584c /* New magic number "LX" */
1178 #define E32RESBYTES1 0 /* First bytes reserved */
1179 #define E32RESBYTES2 0 /* Second bytes reserved */
1180 #define E32RESBYTES3 20 /* Third bytes reserved */
1181 #define E32LEBO 0x00 /* Little Endian Byte Order */
1182 #define E32BEBO 0x01 /* Big Endian Byte Order */
1183 #define E32LEWO 0x00 /* Little Endian Word Order */
1184 #define E32BEWO 0x01 /* Big Endian Word Order */
1185 #define E32LEVEL 0L /* 32-bit EXE format level */
1186 #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */
1187 #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */
1188 #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */
1189
1190
1191
1192 struct e32_exe /* New 32-bit .EXE header */
1193 {
1194 unsigned char e32_magic[2]; /* Magic number E32_MAGIC */
1195 unsigned char e32_border; /* The byte ordering for the .EXE */
1196 unsigned char e32_worder; /* The word ordering for the .EXE */
1197 unsigned long e32_level; /* The EXE format level for now = 0 */
1198 unsigned short e32_cpu; /* The CPU type */
1199 unsigned short e32_os; /* The OS type */
1200 unsigned long e32_ver; /* Module version */
1201 unsigned long e32_mflags; /* Module flags */
1202 unsigned long e32_mpages; /* Module # pages */
1203 unsigned long e32_startobj; /* Object # for instruction pointer */
1204 unsigned long e32_eip; /* Extended instruction pointer */
1205 unsigned long e32_stackobj; /* Object # for stack pointer */
1206 unsigned long e32_esp; /* Extended stack pointer */
1207 unsigned long e32_pagesize; /* .EXE page size */
1208 unsigned long e32_pageshift; /* Page alignment shift in .EXE */
1209 unsigned long e32_fixupsize; /* Fixup section size */
1210 unsigned long e32_fixupsum; /* Fixup section checksum */
1211 unsigned long e32_ldrsize; /* Loader section size */
1212 unsigned long e32_ldrsum; /* Loader section checksum */
1213 unsigned long e32_objtab; /* Object table offset */
1214 unsigned long e32_objcnt; /* Number of objects in module */
1215 unsigned long e32_objmap; /* Object page map offset */
1216 unsigned long e32_itermap; /* Object iterated data map offset */
1217 unsigned long e32_rsrctab; /* Offset of Resource Table */
1218 unsigned long e32_rsrccnt; /* Number of resource entries */
1219 unsigned long e32_restab; /* Offset of resident name table */
1220 unsigned long e32_enttab; /* Offset of Entry Table */
1221 unsigned long e32_dirtab; /* Offset of Module Directive Table */
1222 unsigned long e32_dircnt; /* Number of module directives */
1223 unsigned long e32_fpagetab; /* Offset of Fixup Page Table */
1224 unsigned long e32_frectab; /* Offset of Fixup Record Table */
1225 unsigned long e32_impmod; /* Offset of Import Module Name Table */
1226 unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */
1227 unsigned long e32_impproc; /* Offset of Import Procedure Name Table */
1228 unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */
1229 unsigned long e32_datapage; /* Offset of Enumerated Data Pages */
1230 unsigned long e32_preload; /* Number of preload pages */
1231 unsigned long e32_nrestab; /* Offset of Non-resident Names Table */
1232 unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */
1233 unsigned long e32_nressum; /* Non-resident Name Table Checksum */
1234 unsigned long e32_autodata; /* Object # for automatic data object */
1235 unsigned long e32_debuginfo; /* Offset of the debugging information */
1236 unsigned long e32_debuglen; /* The length of the debugging info. in bytes */
1237 unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */
1238 unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */
1239 unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */
1240 unsigned long e32_stacksize; /* Size of stack */
1241 unsigned char e32_res3[E32RESBYTES3];
1242 /* Pad structure to 196 bytes */
1243 };
1244
1245
1246
1247 #define E32_MAGIC1(x) (x).e32_magic[0]
1248 #define E32_MAGIC2(x) (x).e32_magic[1]
1249 #define E32_BORDER(x) (x).e32_border
1250 #define E32_WORDER(x) (x).e32_worder
1251 #define E32_LEVEL(x) (x).e32_level
1252 #define E32_CPU(x) (x).e32_cpu
1253 #define E32_OS(x) (x).e32_os
1254 #define E32_VER(x) (x).e32_ver
1255 #define E32_MFLAGS(x) (x).e32_mflags
1256 #define E32_MPAGES(x) (x).e32_mpages
1257 #define E32_STARTOBJ(x) (x).e32_startobj
1258 #define E32_EIP(x) (x).e32_eip
1259 #define E32_STACKOBJ(x) (x).e32_stackobj
1260 #define E32_ESP(x) (x).e32_esp
1261 #define E32_PAGESIZE(x) (x).e32_pagesize
1262 #define E32_PAGESHIFT(x) (x).e32_pageshift
1263 #define E32_FIXUPSIZE(x) (x).e32_fixupsize
1264 #define E32_FIXUPSUM(x) (x).e32_fixupsum
1265 #define E32_LDRSIZE(x) (x).e32_ldrsize
1266 #define E32_LDRSUM(x) (x).e32_ldrsum
1267 #define E32_OBJTAB(x) (x).e32_objtab
1268 #define E32_OBJCNT(x) (x).e32_objcnt
1269 #define E32_OBJMAP(x) (x).e32_objmap
1270 #define E32_ITERMAP(x) (x).e32_itermap
1271 #define E32_RSRCTAB(x) (x).e32_rsrctab
1272 #define E32_RSRCCNT(x) (x).e32_rsrccnt
1273 #define E32_RESTAB(x) (x).e32_restab
1274 #define E32_ENTTAB(x) (x).e32_enttab
1275 #define E32_DIRTAB(x) (x).e32_dirtab
1276 #define E32_DIRCNT(x) (x).e32_dircnt
1277 #define E32_FPAGETAB(x) (x).e32_fpagetab
1278 #define E32_FRECTAB(x) (x).e32_frectab
1279 #define E32_IMPMOD(x) (x).e32_impmod
1280 #define E32_IMPMODCNT(x) (x).e32_impmodcnt
1281 #define E32_IMPPROC(x) (x).e32_impproc
1282 #define E32_PAGESUM(x) (x).e32_pagesum
1283 #define E32_DATAPAGE(x) (x).e32_datapage
1284 #define E32_PRELOAD(x) (x).e32_preload
1285 #define E32_NRESTAB(x) (x).e32_nrestab
1286 #define E32_CBNRESTAB(x) (x).e32_cbnrestab
1287 #define E32_NRESSUM(x) (x).e32_nressum
1288 #define E32_AUTODATA(x) (x).e32_autodata
1289 #define E32_DEBUGINFO(x) (x).e32_debuginfo
1290 #define E32_DEBUGLEN(x) (x).e32_debuglen
1291 #define E32_INSTPRELOAD(x) (x).e32_instpreload
1292 #define E32_INSTDEMAND(x) (x).e32_instdemand
1293 #define E32_HEAPSIZE(x) (x).e32_heapsize
1294 #define E32_STACKSIZE(x) (x).e32_stacksize
1295
1296
1297
1298 /*
1299 * Format of E32_MFLAGS(x):
1300 *
1301 * Low word has the following format:
1302 *
1303 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
1304 * | | | | | | | |
1305 * | | | | | | | +------- Per-Process Library Initialization
1306 * | | | | | | +--------- SystemDLL (internal fixups discarded)
1307 * | | | | | +----------- No Internal Fixups for Module in .EXE
1308 * | | | | +------------- No External Fixups for Module in .EXE
1309 * | | | +------------------- Incompatible with PM Windowing
1310 * | | +--------------------- Compatible with PM Windowing
1311 * | | Uses PM Windowing API
1312 * | +-------------------------------- Module not Loadable
1313 * +-------------------------------------- Library Module
1314 */
1315
1316
1317 #define E32NOTP 0x8000L /* Library Module - used as NENOTP */
1318 #define E32NOLOAD 0x2000L /* Module not Loadable */
1319 #define E32PMAPI 0x0300L /* Uses PM Windowing API */
1320 #define E32PMW 0x0200L /* Compatible with PM Windowing */
1321 #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */
1322 #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */
1323 #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */
1324 #define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/
1325 #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */
1326 #define E32LIBTERM 0x40000000L /* Per-Process Library Termination */
1327 #define E32APPMASK 0x0300L /* Application Type Mask */
1328
1329
1330 /*
1331 * Format of E32_MFLAGS(x):
1332 *
1333 * High word has the following format:
1334 *
1335 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
1336 * | |
1337 * | +--- Protected memory library module
1338 * +----- Device driver
1339 */
1340
1341 #define E32PROTDLL 0x10000L /* Protected memory library module */
1342 #define E32DEVICE 0x20000L /* Device driver */
1343 #define E32MODEXE 0x00000L /* .EXE module */
1344 #define E32MODDLL 0x08000L /* .DLL module */
1345 #define E32MODPROTDLL 0x18000L /* Protected memory library module */
1346 #define E32MODPDEV 0x20000L /* Physical device driver */
1347 #define E32MODVDEV 0x28000L /* Virtual device driver */
1348 #define E32MODMASK 0x38000L /* Module type mask */
1349
1350 /*
1351 * RELOCATION DEFINITIONS - RUN-TIME FIXUPS
1352 */
1353
1354 typedef union _RELOC_OFS
1355 {
1356 unsigned short offset16;
1357 unsigned long offset32;
1358 } RELOC_OFS; /* 16-bit or 32-bit offset */
1359
1360
1361 /***ET+ r32_rlc - Relocation item */
1362
1363 struct r32_rlc /* Relocation item */
1364 {
1365 unsigned char nr_stype; /* Source type - field shared with new_rlc */
1366 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
1367 short r32_soff; /* Source offset */
1368 unsigned short r32_objmod; /* Target object number or Module ordinal */
1369
1370 union targetid
1371 {
1372 RELOC_OFS intref; /* Internal fixup */
1373
1374 union extfixup
1375 {
1376 RELOC_OFS proc; /* Procedure name offset */
1377 unsigned long ord; /* Procedure odrinal */
1378 } extref; /* External fixup */
1379
1380 struct addfixup
1381 {
1382 unsigned short entry; /* Entry ordinal */
1383 RELOC_OFS addval; /* Value added to the address */
1384 } addfix; /* Additive fixup */
1385 }
1386 r32_target; /* Target data */
1387 unsigned short r32_srccount; /* Number of chained fixup records */
1388 unsigned short r32_chain; /* Chain head */
1389 };
1390
1391 /*
1392 * In 32-bit .EXE file run-time relocations are written as varying size
1393 * records, so we need many size definitions.
1394 */
1395
1396 #define RINTSIZE16 8
1397 #define RINTSIZE32 10
1398 #define RORDSIZE 8
1399 #define RNAMSIZE16 8
1400 #define RNAMSIZE32 10
1401 #define RADDSIZE16 10
1402 #define RADDSIZE32 12
1403
1404 #if FALSE
1405 /*
1406 * Access macros defined in NEWEXE.H !!!
1407 */
1408 #define NR_STYPE(x) (x).nr_stype
1409 #define NR_FLAGS(x) (x).nr_flags
1410 #endif
1411
1412 #define R32_SOFF(x) (x).r32_soff
1413 #define R32_OBJNO(x) (x).r32_objmod
1414 #define R32_MODORD(x) (x).r32_objmod
1415 #define R32_OFFSET16(x) (x).r32_target.intref.offset16
1416 #define R32_OFFSET32(x) (x).r32_target.intref.offset32
1417 #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16
1418 #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32
1419 #define R32_PROCORD(x) (x).r32_target.extref.ord
1420 #define R32_ENTRY(x) (x).r32_target.addfix.entry
1421 #define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16
1422 #define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32
1423 #define R32_SRCCNT(x) (x).r32_srccount
1424 #define R32_CHAIN(x) (x).r32_chain
1425
1426
1427
1428 /*
1429 * Format of NR_STYPE(x)
1430 *
1431 * 7 6 5 4 3 2 1 0 - bit no
1432 * | | | | | |
1433 * | | +-+-+-+--- Source type
1434 * | +----------- Fixup to 16:16 alias
1435 * +------------- List of source offset follows fixup record
1436 */
1437
1438 #if FALSE
1439
1440 /* DEFINED in newexe.h !!! */
1441
1442 #define NRSTYP 0x0f /* Source type mask */
1443 #define NRSBYT 0x00 /* lo byte (8-bits)*/
1444 #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
1445 #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
1446 #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
1447 #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
1448 #define NROFF32 0x07 /* 32-bit offset (32-bits) */
1449 #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
1450 #endif
1451
1452
1453 #define NRSRCMASK 0x0f /* Source type mask */
1454 #define NRALIAS 0x10 /* Fixup to alias */
1455 #define NRCHAIN 0x20 /* List of source offset follows */
1456 /* fixup record, source offset field */
1457 /* in fixup record contains number */
1458 /* of elements in list */
1459
1460 /*
1461 * Format of NR_FLAGS(x) and R32_FLAGS(x):
1462 *
1463 * 7 6 5 4 3 2 1 0 - bit no
1464 * | | | | | | |
1465 * | | | | | +-+--- Reference type
1466 * | | | | +------- Additive fixup
1467 * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit)
1468 * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit)
1469 * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit)
1470 * +----------------- 8-bit import ordinal (1 - 8-bit;
1471 * 0 - NR32BITOFF toggles
1472 * between 16 and 32 bit
1473 * ordinal)
1474 */
1475
1476 #ifdef NEVER_INCLUDE_THE_FOLLWING
1477 /* DEFINED in newexe.h !!! */
1478 #define NRRTYP 0x03 /* Reference type mask */
1479 #define NRRINT 0x00 /* Internal reference */
1480 #define NRRORD 0x01 /* Import by ordinal */
1481 #define NRRNAM 0x02 /* Import by name */
1482 #define NRADD 0x04 /* Additive fixup */
1483 #endif
1484
1485 #define NRRENT 0x03 /* Internal entry table fixup */
1486
1487 #define NR32BITOFF 0x10 /* 32-bit Target Offset */
1488 #define NR32BITADD 0x20 /* 32-bit Additive fixup */
1489 #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */
1490 #define NR8BITORD 0x80 /* 8-bit import ordinal */
1491 /*end*/
1492
1493 /*
1494 * Data structures for storing run-time fixups in linker virtual memory.
1495 *
1496 * Each object has a list of Object Page Directories which specify
1497 * fixups for given page. Each page has its own hash table which is
1498 * used to detect fixups to the same target.
1499 */
1500
1501 #define PAGEPERDIR 62
1502 #define LG2DIR 7
1503
1504
1505 typedef struct _OBJPAGEDIR
1506 {
1507 DWORD next; /* Virtual pointer to next dir on list */
1508 WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */
1509 }
1510 OBJPAGEDIR;
1511
1512 /*
1513 * OBJECT TABLE
1514 */
1515
1516 /***ET+ o32_obj Object Table Entry */
1517
1518 struct o32_obj /* Flat .EXE object table entry */
1519 {
1520 unsigned long o32_size; /* Object virtual size */
1521 unsigned long o32_base; /* Object base virtual address */
1522 unsigned long o32_flags; /* Attribute flags */
1523 unsigned long o32_pagemap; /* Object page map index */
1524 unsigned long o32_mapsize; /* Number of entries in object page map */
1525 unsigned long o32_reserved; /* Reserved */
1526 };
1527
1528
1529 #define O32_SIZE(x) (x).o32_size
1530 #define O32_BASE(x) (x).o32_base
1531 #define O32_FLAGS(x) (x).o32_flags
1532 #define O32_PAGEMAP(x) (x).o32_pagemap
1533 #define O32_MAPSIZE(x) (x).o32_mapsize
1534 #define O32_RESERVED(x) (x).o32_reserved
1535
1536 /*
1537 * Format of O32_FLAGS(x)
1538 *
1539 * High word of dword flag field is not used for now.
1540 * Low word has the following format:
1541 *
1542 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
1543 * | | | | | | | | | | | | | | |
1544 * | | | | | | | | | | | | | | +--- Readable Object
1545 * | | | | | | | | | | | | | +----- Writeable Object
1546 * | | | | | | | | | | | | +------- Executable Object
1547 * | | | | | | | | | | | +--------- Resource Object
1548 * | | | | | | | | | | +----------- Object is Discardable
1549 * | | | | | | | | | +------------- Object is Shared
1550 * | | | | | | | | +--------------- Object has preload pages
1551 * | | | | | | | +----------------- Object has invalid pages
1552 * | | | | | | +------------------- Object is permanent and swappable
1553 * | | | | | +--------------------- Object is permanent and resident
1554 * | | | | +----------------------- Object is permanent and long lockable
1555 * | | | +----------------------------- 16:16 alias required (80x86 specific)
1556 * | | +-------------------------------- Big/Default bit setting (80x86 specific)
1557 * | +----------------------------------- Object is conforming for code (80x86 specific)
1558 * +-------------------------------------- Object I/O privilege level (80x86 specific)
1559 *
1560 */
1561
1562 #define OBJREAD 0x0001L /* Readable Object */
1563 #define OBJWRITE 0x0002L /* Writeable Object */
1564 #define OBJRSRC 0x0008L /* Resource Object */
1565 #define OBJINVALID 0x0080L /* Object has invalid pages */
1566 #define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */
1567 #define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */
1568 #define OBJPERM 0x0100L /* Object is permanent and swappable */
1569 #define OBJRESIDENT 0x0200L /* Object is permanent and resident */
1570 #define OBJCONTIG 0x0300L /* Object is resident and contiguous */
1571 #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */
1572 #define OBJTYPEMASK 0x0700L /* Object type mask */
1573 #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */
1574 #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */
1575 #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */
1576 #if FOR_EXEHDR
1577 /*
1578 * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version
1579 */
1580 #define OBJDISCARD 0x0010L /* Object is Discardable */
1581 #define OBJSHARED 0x0020L /* Object is Shared */
1582 #define OBJPRELOAD 0x0040L /* Object has preload pages */
1583 #define OBJEXEC 0x0004L /* Executable Object */
1584 #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
1585 #else
1586 /*
1587 * Life will be easier, if we keep the same names for the following flags:
1588 */
1589 #ifndef NSDISCARD
1590 #define NSDISCARD 0x0010L /* Object is Discardable */
1591 #endif
1592 #ifndef NSMOVE
1593 #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */
1594 #endif
1595 #ifndef NSSHARED
1596 #define NSSHARED 0x0020L /* Object is Shared */
1597 #endif
1598 #ifndef NSPRELOAD
1599 #define NSPRELOAD 0x0040L /* Object has preload pages */
1600 #endif
1601 #ifndef NSEXRD
1602 #define NSEXRD 0x0004L /* Executable Object */
1603 #endif
1604 #ifndef NSCONFORM
1605 #define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
1606 #endif
1607 #endif
1608 /*end*/
1609
1610 /***ET+ o32_map - Object Page Map entry */
1611
1612 struct o32_map /* Object Page Table entry */
1613 {
1614 unsigned long o32_pagedataoffset; /* file offset of page */
1615 unsigned short o32_pagesize; /* # bytes of page data */
1616 unsigned short o32_pageflags; /* Per-Page attributes */
1617 };
1618
1619
1620 #define GETPAGEIDX(x) ((x).o32_pagedataoffset)
1621
1622 #define PUTPAGEIDX(x,i) ((x).o32_pagedataoffset = ((unsigned long)(i)))
1623
1624 #define PUTPAGESIZ(x,i) ((x).o32_pagesize = ((unsigned int)(i)))
1625
1626 #define GETPAGESIZ(x) ((x).o32_pagesize)
1627
1628 #define PAGEFLAGS(x) (x).o32_pageflags
1629
1630
1631 #define VALID 0x0000 /* Valid Physical Page in .EXE */
1632 #define ITERDATA 0x0001 /* Iterated Data Page */
1633 #define INVALID 0x0002 /* Invalid Page */
1634 #define ZEROED 0x0003 /* Zero Filled Page */
1635 #define RANGE 0x0004 /* Range of pages */
1636 #define ITERDATA2 0x0005 /* Iterated Data Page Type II */
1637 /*end*/
1638
1639 /*
1640 * RESOURCE TABLE
1641 */
1642
1643 /***ET+ rsrc32 - Resource Table Entry */
1644
1645 struct rsrc32 /* Resource Table Entry */
1646 {
1647 unsigned short type; /* Resource type */
1648 unsigned short name; /* Resource name */
1649 unsigned long cb; /* Resource size */
1650 unsigned short obj; /* Object number */
1651 unsigned long offset; /* Offset within object */
1652 };
1653 /*end*/
1654
1655
1656 /*
1657 * Iteration Record format for 'EXEPACK'ed pages.
1658 */
1659 struct LX_Iter
1660 {
1661 unsigned short LX_nIter; /* number of iterations */
1662 unsigned short LX_nBytes; /* number of bytes */
1663 unsigned char LX_Iterdata; /* iterated data byte(s) */
1664 };
1665
1666
1667 /*
1668 * ENTRY TABLE DEFINITIONS
1669 */
1670
1671 /***ET+ b32_bundle - Entry Table */
1672
1673 struct b32_bundle
1674 {
1675 unsigned char b32_cnt; /* Number of entries in this bundle */
1676 unsigned char b32_type; /* Bundle type */
1677 unsigned short b32_obj; /* Object number */
1678 }; /* Follows entry types */
1679
1680 struct e32_entry
1681 {
1682 unsigned char e32_flags; /* Entry point flags */
1683 union entrykind
1684 {
1685 RELOC_OFS e32_offset; /* 16-bit/32-bit offset entry */
1686 struct callgate
1687 {
1688 unsigned short offset; /* Offset in segment */
1689 unsigned short callgate; /* Callgate selector */
1690 }
1691 e32_callgate; /* 286 (16-bit) call gate */
1692 struct fwd
1693 {
1694 unsigned short modord; /* Module ordinal number */
1695 unsigned long value; /* Proc name offset or ordinal */
1696 }
1697 e32_fwd; /* Forwarder */
1698 }
1699 e32_variant; /* Entry variant */
1700 };
1701
1702
1703
1704 #define B32_CNT(x) (x).b32_cnt
1705 #define B32_TYPE(x) (x).b32_type
1706 #define B32_OBJ(x) (x).b32_obj
1707
1708 #define E32_EFLAGS(x) (x).e32_flags
1709 #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16
1710 #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32
1711 #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset
1712 #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate
1713 #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord
1714 #define E32_VALUE(x) (x).e32_variant.e32_fwd.value
1715
1716 #define FIXENT16 3
1717 #define FIXENT32 5
1718 #define GATEENT16 5
1719 #define FWDENT 7
1720
1721 /*
1722 * BUNDLE TYPES
1723 */
1724
1725 #define EMPTY 0x00 /* Empty bundle */
1726 #define ENTRY16 0x01 /* 16-bit offset entry point */
1727 #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */
1728 #define ENTRY32 0x03 /* 32-bit offset entry point */
1729 #define ENTRYFWD 0x04 /* Forwarder entry point */
1730 #define TYPEINFO 0x80 /* Typing information present flag */
1731
1732
1733 /*
1734 * Format for E32_EFLAGS(x)
1735 *
1736 * 7 6 5 4 3 2 1 0 - bit no
1737 * | | | | | | | |
1738 * | | | | | | | +--- exported entry
1739 * | | | | | | +----- uses shared data
1740 * +-+-+-+-+-+------- parameter word count
1741 */
1742
1743 #define E32EXPORT 0x01 /* Exported entry */
1744 #define E32SHARED 0x02 /* Uses shared data */
1745 #define E32PARAMS 0xf8 /* Parameter word count mask */
1746
1747 /*
1748 * Flags for forwarders only:
1749 */
1750
1751 #define FWD_ORDINAL 0x01 /* Imported by ordinal */
1752
1753
1754 #pragma pack() /* Restore default alignment */
1755
1756 /*end*/
1757
1758 #endif /* __EXE386__ */
1759
1760#endif
Note: See TracBrowser for help on using the repository browser.