diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2007-09-20 14:16:48 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2007-09-20 14:16:48 +0000 |
commit | 590b1e78b8b45a09e6990d053910812642efd7a6 (patch) | |
tree | 957e5b57b951b704768657352065ad56d8d2e6f4 /sal | |
parent | 0ddb1490d20156f80ad44ca86347f733b092e569 (diff) |
INTEGRATION: CWS os2port01 (1.1.2); FILE ADDED
2006/11/29 14:31:17 ydario 1.1.2.1: Forgot some files.
Diffstat (limited to 'sal')
-rw-r--r-- | sal/osl/os2/helpers/debug.h | 1758 |
1 files changed, 1758 insertions, 0 deletions
diff --git a/sal/osl/os2/helpers/debug.h b/sal/osl/os2/helpers/debug.h new file mode 100644 index 000000000000..be35be3d3326 --- /dev/null +++ b/sal/osl/os2/helpers/debug.h @@ -0,0 +1,1758 @@ + +/* + *@@sourcefile debug.h: + * header file for debug.c (exception handling and debugging). + * See remarks there. + * + * Note: Version numbering in this file relates to XWorkplace version + * numbering. + * + *@@changed V0.9.0: included contents of newexe.h + * + *@@include #define INCL_BASE + *@@include #include <os2.h> + *@@include #include <stdio.h> + *@@include #include "helpers\debug.h" + */ + +/* + * This file incorporates code from the following: + * -- Marc Fiammante, John Currier, Kim Rasmussen, + * Anthony Cruise (EXCEPT3.ZIP package for a generic + * exception handling DLL, available at Hobbes). + * + * This file Copyright (C) 1992-99 Ulrich Mller, + * Kim Rasmussen, + * Marc Fiammante, + * John Currier, + * Anthony Cruise. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, in version 2 as it comes in the COPYING + * file of the XFolder main distribution. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef DEBUG_HEADER_INCLUDED + #define DEBUG_HEADER_INCLUDED + + /******************************************************************** + * + * SYM file declarations + * + ********************************************************************/ + + // Pointer means offset from beginning of file or beginning of struct + #pragma pack(1) + + typedef struct + { + unsigned short int ppNextMap; // paragraph pointer to next map + unsigned char bFlags; // symbol types + unsigned char bReserved1; // reserved + unsigned short int pSegEntry; // segment entry point value + unsigned short int cConsts; // count of constants in map + unsigned short int pConstDef; // pointer to constant chain + unsigned short int cSegs; // count of segments in map + unsigned short int ppSegDef; // paragraph pointer to first segment + unsigned char cbMaxSym; // maximum symbol-name length + unsigned char cbModName; // length of module name + char achModName[1]; // cbModName Bytes of module-name member + } MAPDEF; + + typedef struct + { + unsigned short int ppNextMap; // always zero + unsigned char release; // release number (minor version number) + unsigned char version; // major version number + } LAST_MAPDEF; + + typedef struct + { + unsigned short int ppNextSeg; // paragraph pointer to next segment + unsigned short int cSymbols; // count of symbols in list + unsigned short int pSymDef; // offset of symbol chain + unsigned short int wReserved1; // reserved + unsigned short int wReserved2; // reserved + unsigned short int wReserved3; // reserved + unsigned short int wReserved4; // reserved + unsigned char bFlags; // symbol types; bit 0 signals 32-bit (*UM) + unsigned char bReserved1; // reserved + unsigned short int ppLineDef; // offset of line number record + unsigned char bReserved2; // reserved + unsigned char bReserved3; // reserved + unsigned char cbSegName; // length of segment name + char achSegName[1]; /* cbSegName Bytes of segment-name member*/ + } SEGDEF; + + typedef struct + { + unsigned short int wSymVal; // symbol address or constant + unsigned char cbSymName; // length of symbol name + char achSymName[1]; // cbSymName Bytes of symbol-name member + } SYMDEF16; + + typedef struct + { + unsigned int wSymVal; // symbol address or constant + unsigned char cbSymName; // length of symbol name + char achSymName[1]; // cbSymName Bytes of symbol-name member + } SYMDEF32; + + typedef struct + { + unsigned short int ppNextLine; // ptr to next linedef (0 if last) + unsigned short int wReserved1; // reserved + unsigned short int pLines; // pointer to line numbers + unsigned short int cLines; // reserved + unsigned char cbFileName; // length of filename + char achFileName[1];// cbFileName Bytes of filename + } LINEDEF; + + typedef struct + { + unsigned short int wCodeOffset; // executable offset + unsigned short int dwFileOffset; // source offset + } LINEINF; + + #define SEGDEFOFFSET(MapDef) (MapDef.ppSegDef*16) + #define NEXTSEGDEFOFFSET(SegDef) (SegDef.ppNextSeg*16) + + #define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef) + #define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int))) + + #define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef) + #define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int))) + + #define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16) + #define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16) + #define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines) + + /******************************************************************** + * + * EXE declarations taken from exe.h + * + ********************************************************************/ + + #ifndef WORD + typedef unsigned short WORD; + #endif + + typedef WORD bbmask; + + struct exe { + WORD eid; // contains EXEID, below + WORD elast; // # of bytes in last page + WORD epagsiz; // # of pages in whole file + WORD erelcnt; // # of relocation entrys + WORD ehdrsiz; // size of header, in paragraphs + WORD eminfre; // min # of free paragraphs needed + WORD emaxfre; // max # of free paragraphs needed + WORD eiSS; // initial SS value + WORD eiSP; // initial SP value + WORD enegsum; // negative sum of entire file + WORD eiIP; // initial IP value + WORD eiCS; // initial CS value + WORD ereloff; // offset in file of relocation table + WORD eovlnum; // number of the overlay + + /* the following fields may not be present. + * ereloff = 28 not present + * = 30 exe.ever present and valid + * = 32 exe.ever field contains garbage + * ereloff > 32 exe.ever present and valid + * = 0 if "don't know" + */ + + WORD ever; // version # of producing linker + WORD dumy; // unused + + /* the following fields may not be present - if the exe.ereloff + * value encompasses the fields then they are present and valid. + */ + + bbmask ebb; // behavior bits + WORD dumy2[7]; // must be 0 until defined + }; + + + #define EXEID 0x5a4d // magic ID value + + /******************************************************************** + * + * Object Module Format (OMF) declarations + * + ********************************************************************/ + + struct exehdr_rec + { + BYTE signature[2]; // Must be "MZ" + USHORT image_len; // Image Length + USHORT pages; // Pages + USHORT reloc_items; // Relocation table items + USHORT min_paragraphs; // Mininum 16-bytes paragraphs + USHORT max_paragraphs; // Maximum 16-bytes paragraphs + USHORT stack_pos; // Stack position + USHORT offset_in_sp; // Offset in SP + USHORT checksum; // Checksum + USHORT offset_in_ip; // Offset in IP + USHORT code_pos; // Code segment pos. + USHORT reloc_item_pos; // Position of first relocation item + USHORT overlay_number; // Overlay number + BYTE unused[8]; // Unused bytes + USHORT oem_id; // OEM Identifier + BYTE oem_info[24]; // OEM Info + ULONG lexe_offset; // Offset to linear header + }; + + struct lexehdr_rec + { + BYTE signature[2]; // Must be "LX" + BYTE b_ord; // Byte ordering + BYTE w_ord; // Word ordering + ULONG format_level; // Format level + USHORT cpu_type; // CPU Type + USHORT os_type; // Operating system + ULONG module_version; // Module version + ULONG mod_flags; // Module flags + ULONG mod_pages; // Module pages + ULONG EIP_object; // EIP Object no. + ULONG EIP; // EIP Value + ULONG ESP_object; // ESP Object no + ULONG ESP; // ESP Value + ULONG page_size; // Page size + ULONG page_ofs_shift; // Page offset shift + ULONG fixup_sect_size; // Fixup section size + ULONG fixup_sect_checksum; // Fixup section checksum + ULONG loader_sect_size; // Loader section size + ULONG loader_sect_checksum; // Loader section checksum + ULONG obj_table_ofs; // Object table offset + ULONG obj_count; // Object count + ULONG obj_page_tab_ofs; // Object page table offset + ULONG obj_iter_page_ofs; // Object iteration pages offset + ULONG res_tab_ofs; // Resource table offset + ULONG res_table_entries; // Resource table entries + ULONG res_name_tab_ofs; // Resident name table offset; + ULONG ent_tab_ofs; // Entry table offset + ULONG mod_dir_ofs; // Module directives offset + ULONG mod_dir_count; // Number of module directives + ULONG fixup_page_tab_ofs; // Fixup page table offset + ULONG fixup_rec_tab_ofs; // Fixup record table offset + ULONG imp_tab_ofs; // Import module table offset + ULONG imp_mod_entries; // Import module entries + ULONG imp_proc_tab_ofs; // Import proc table offset + ULONG per_page_check_ofs; // Per page checksum offset + ULONG data_page_offset; // Data pages offset + ULONG preload_page_count; // Preload pages count + ULONG nonres_tab_ofs; // Nonresident name table offset + ULONG nonres_tab_len; // Nonresident name table len + ULONG nonres_tab_check; // Nonresident tables checksum + ULONG auto_ds_objectno; // Auto DS object number + ULONG debug_info_ofs; // Debug info offset + ULONG debug_info_len; // Debug info length + ULONG inst_preload_count; // Instance preload count + ULONG inst_demand_count; // Instance demand count + ULONG heapsize; // Heap size + ULONG stacksize; // Stack size + }; + + struct debug_head_rec + { + BYTE signature[3]; // Debug signature + BYTE type; // Debug info type + }; + + struct dir_inf_rec + { + USHORT dirstruct_size; // Size of directory structure + USHORT number_of_entries; // Number of dnt_rec's in the array + USHORT unknown; // Unknown data + // Followed by an array of dnt_rec structures + }; + + struct dnt_rec + { + USHORT subsect_type; // sst Subsection type + USHORT mod_index; // Module index (1-based) + ULONG offset; // Offset of start of section + ULONG size; // Size of section + }; + + // Modules subsection + struct modules_rec + { + USHORT code_seg_base; // Code segment base + ULONG code_seg_offset; // Code segment offset + ULONG code_seg_len; // Code segment length + USHORT overlay_no; // Overlay number + USHORT lib_idx; // Index into library section or 0 + BYTE segments; // Number of segments + BYTE reserved; + BYTE debug_style[2]; // "HL" for HLL, "CV" or 0 for CodeView + BYTE debug_version[2]; // 00 01 or 00 03 for HLL, 00 00 for CV + BYTE name_len; // Length of name (which follows) + }; + + // Publics subsection + struct publics_rec + { + ULONG offset; // Offset + USHORT segment; // Segment + USHORT type; // Type index + BYTE name_len; // Length of name (wich follows) + }; + + #if 0 + // Linenumbers header + struct linhead_rec + { + BYTE id; // 0x95 for flat mem, 32 bit progs + USHORT length; // Record length + USHORT base_group; // Base group + USHORT base_segment; // Base segment + }; + #endif + + // First linenumber record + struct linfirst_rec + { + USHORT lineno; // Line number (0) + BYTE entry_type; // Entry type + BYTE reserved; // Reserved + USHORT entries_count; // Number of table entries + USHORT segment_no; // Segment number + ULONG filename_tabsize; // File names table size + }; + + // Source line numbers + struct linsource_rec + { + USHORT source_line; // Source file line number + USHORT source_idx; // Source file index + ULONG offset; // Offset into segment + }; + + // Listing statement numbers + struct linlist_rec + { + ULONG list_line; // Listing file linenumber + ULONG statement; // Listing file statement number + ULONG offset; // Offset into segment + }; + + // Source and Listing statement numbers + struct linsourcelist_rec + { + USHORT source_line; // Source file line number + USHORT source_idx; // Source file index + ULONG list_line; // Listing file linenumber + ULONG statement; // Listing file statement number + ULONG offset; // Offset into segment + }; + + // Path table + struct pathtab_rec + { + ULONG offset; // Offset into segment + USHORT path_code; // Path code + USHORT source_idx; // Source file index + }; + + // File names table + struct filenam_rec + { + ULONG first_char; // First displayable char in list file + ULONG disp_chars; // Number of displayable chars in list line + ULONG filecount; // Number of source/listing files + }; + + // Symbol types + #define SYM_BEGIN 0x00 // Begin block + #define SYM_PROC 0x01 // Function + #define SYM_END 0x02 // End block of function + #define SYM_AUTO 0x04 // Auto variable + #define SYM_STATIC 0x05 // Static variable + #define SYM_LABEL 0x0B // Label + #define SYM_WITH 0x0C // With start symbol (not used) + #define SYM_REG 0x0D // Register variable + #define SYM_CONST 0x0E // Constant + #define SYM_ENTRY 0x0F // Secondary entry (not in C) + #define SYM_SKIP 0x10 // For incremental linking (not used) + #define SYM_CHANGESEG 0x11 // Change segment (#pragma alloc_text) + #define SYM_TYPEDEF 0x12 // Typedef variable + #define SYM_PUBLIC 0x13 // Public reference + #define SYM_MEMBER 0x14 // Member of minor or major structure + #define SYM_BASED 0x15 // Based variable + #define SYM_TAG 0x16 // Tag in struct, union, enum ... + #define SYM_TABLE 0x17 // Table (used in RPG - not C) + #define SYM_MAP 0x18 // Map variable (extern in C) + #define SYM_CLASS 0x19 // Class symbol (C++) + #define SYM_MEMFUNC 0x1A // Member function + #define SYM_AUTOSCOPE 0x1B // Scoped auto for C++ (not used) + #define SYM_STATICSCOPE 0x1C // scoped static for C++ (not used) + #define SYM_CPPPROC 0x1D // C++ Proc + #define SYM_CPPSTAT 0x1E // C++ Static var + #define SYM_COMP 0x40 // Compiler information + + // Symbolic begin record + struct symbegin_rec + { + ULONG offset; // Segment offset + ULONG length; // Length of block + BYTE name_len; // Length of block name + // Block name follows + }; + + // Symbolic auto var record + struct symauto_rec + { + ULONG stack_offset; // Stack offset + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Var name follows + }; + + // Symbolic procedure record + struct symproc_rec + { + ULONG offset; // Segment offset + USHORT type_idx; // Type index + ULONG length; // Length of procedure + USHORT pro_len; // Length of prologue + ULONG pro_bodylen; // Length of prologue + body + USHORT class_type; // Class type + BYTE near_far; // Near or far + BYTE name_len; // Length of name + // Function name follows + }; + + // Symbolic static var record + struct symstatic_rec + { + ULONG offset; // Segment offset + USHORT segaddr; // Segment address + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Var name follows + }; + + // Symbolic label var record + struct symlabel_rec + { + ULONG offset; // Segment offset + BYTE near_far; // Near or far + BYTE name_len; // Length of name + // Var name follows + }; + + // Symbolic register var record + struct symreg_rec + { + USHORT type_idx; // Type index + BYTE reg_no; // Register number + BYTE name_len; // Length of name + // Var name follows + }; + + // Symbolic change-segment record + struct symseg_rec + { + USHORT seg_no; // Segment number + }; + + // Symbolic typedef record + struct symtypedef_rec + { + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Name follows + }; + + // Symbolic public record + struct sympublic_rec + { + ULONG offset; // Segment offset + USHORT segaddr; // Segment address + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Name follows + }; + + // Symbolic member record + struct symmember_rec + { + ULONG offset; // Offset to subrecord + BYTE name_len; // Length of name + // Name follows + }; + + // Symbolic based record + struct symbased_rec + { + ULONG offset; // Offset to subrecord + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Name follows + }; + + // Symbolic tag record + struct symtag_rec + { + USHORT type_idx; // Type index + BYTE name_len; // Length of name + // Name follows + }; + + // Symbolic table record + struct symtable_rec + { + ULONG offset; // Segment offset + USHORT segaddr; // Segment address + USHORT type_idx; // Type index + ULONG idx_ofs; // Index offset to subrecord + BYTE name_len; // Length of name + // Name follows + }; + + // Type record + struct type_rec + { + USHORT length; // Length of sub-record + BYTE type; // Sub-record type + BYTE type_qual; // Type qualifier + }; + + // Types + #define TYPE_CLASS 0x40 // Class + #define TYPE_BASECLASS 0x41 // Base class + #define TYPE_FRIEND 0x42 // Friend + #define TYPE_CLASSDEF 0x43 // Class definition + #define TYPE_MEMBERFUNC 0x45 // Member function + #define TYPE_CLASSMEMBER 0x46 // Class member + #define TYPE_REF 0x48 // Reference + #define TYPE_MEMBERPTR 0x49 // Member pointer + #define TYPE_SCALARS 0x51 // Scalars + #define TYPE_SET 0x52 // Set + #define TYPE_ENTRY 0x53 // Entry + #define TYPE_FUNCTION 0x54 // Function + #define TYPE_AREA 0x55 // Area + #define TYPE_LOGICAL 0x56 // Logical + #define TYPE_STACK 0x57 // Stack + #define TYPE_MACRO 0x59 // Macro + #define TYPE_BITSTRING 0x5C // Bit string + #define TYPE_USERDEF 0x5D // User defined + #define TYPE_CHARSTR 0x60 // Character string + #define TYPE_PICTURE 0x61 // Picture + #define TYPE_GRAPHIC 0x62 // Graphic + #define TYPE_FORMATLAB 0x65 // Format label + #define TYPE_FILE 0x67 // File + #define TYPE_SUBRANGE 0x6F // Subrange + #define TYPE_CODELABEL 0x72 // Code label + #define TYPE_PROCEDURE 0x75 // Procedure + #define TYPE_ARRAY 0x78 // Array + #define TYPE_STRUCT 0x79 // Structure / Union / Record + #define TYPE_POINTER 0x7A // Pointer + #define TYPE_ENUM 0x7B // Enum + #define TYPE_LIST 0x7F // List + + // Type userdef + struct type_userdefrec + { + BYTE FID_index; // Field ID + USHORT type_index; // Type index + BYTE FID_string; // String ID + BYTE name_len; // Length of name which follows + }; + + // Type function + struct type_funcrec + { + USHORT params; + USHORT max_params; + BYTE FID_index; // Field ID + USHORT type_index; // Type index of return value + BYTE FID_index1; // String ID + USHORT typelist_index; // Index of list of params + }; + + // Type struct + struct type_structrec + { + ULONG size; // Size of structure + USHORT field_count; // Number of fields in structure + BYTE FID_index; // Field ID + USHORT type_list_idx; // Index to type list + BYTE FID_index1; // Field ID + USHORT type_name_idx; // Index to names / offsets + BYTE dont_know; // Haven't a clue, but it seems to be needed + BYTE name_len; // Length of structure name which follows + }; + + // Type list, type qualifier 1: contains types for structures + // This record is repeated for the number of items in the structure definition + struct type_list1 + { + BYTE FID_index; // Field identifier for index + USHORT type_index; // Type index. + }; + + // Type list, type qualifier 2: contains names and offsets for structure items + // This record is repeated for the number of items in the structure definition + struct type_list2 + { + BYTE FID_string; // String identifier + BYTE name_len; // Length of name which follows + }; + + // Type list, subrecord to the above, contains offset of variable in the structure + struct type_list2_1 + { + BYTE FID_span; // Defines what type of variable follows + union { + BYTE b_len; + USHORT s_len; + ULONG l_len; + } u; + }; + + // Type pointer + struct type_pointerrec + { + BYTE FID_index; // Index identifier + USHORT type_index; // Type index + BYTE FID_string; // String identifier + BYTE name_len; // Length of name which follows + }; + + /******************************************************************** + * + * Prototypes + * + ********************************************************************/ + + BOOL dbgPrintStackFrame(FILE *LogFile, + PSZ pszModuleName, // in: module name (fully q'fied) + ULONG ulObject, + ULONG ulOffset); + + VOID dbgPrintStack(FILE *file, + PUSHORT StackBottom, + PUSHORT StackTop, + PUSHORT Ebp, + PUSHORT ExceptionAddress); + + APIRET APIENTRY DosQueryModFromEIP(HMODULE *phMod, // out: trapping module + ULONG *pulObjNum, // out: object/segment number + ULONG ulBuffLen, // in: sizeof(*pszBuff) + CHAR *pszBuff, // out: module name + ULONG *pulOffset, // out: offset in module + ULONG ulAddress); // in: address to be analyzed + + APIRET APIENTRY DOSQUERYMODFROMEIP(HMODULE * phMod, + ULONG * pObjNum, + ULONG BuffLen, + PCHAR pBuff, + ULONG * pOffset, + PVOID Address); + + typedef ULONG *_Seg16 PULONG16; + APIRET16 APIENTRY16 DOS16SIZESEG(USHORT Seg, PULONG16 Size); + typedef APIRET16(APIENTRY16 _PFN16) (VOID); + ULONG APIENTRY DosSelToFlat(ULONG); + + APIRET16 APIENTRY16 DOSQPROCSTATUS(ULONG * _Seg16 pBuf, USHORT cbBuf); + + #define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp)) + + #pragma pack() // added V0.9.0 + + + /******************************************************************** + * + * Executable definitions + * + ********************************************************************/ + + #define EXE386 1 + + #ifndef __NEWEXE__ + #define __NEWEXE__ + + #pragma pack(1) + + /*_________________________________________________________________* + | | + | | + | DOS3 .EXE FILE HEADER DEFINITION | + | | + |_________________________________________________________________| + * */ + + + #define EMAGIC 0x5A4D // Old magic number + #define ENEWEXE sizeof(struct exe_hdr) + // Value of E_LFARLC for new .EXEs + #define ENEWHDR 0x003C // Offset in old hdr. of ptr. to new + #define ERESWDS 0x0010 // No. of reserved words (OLD) + #define ERES1WDS 0x0004 // No. of reserved words in e_res + #define ERES2WDS 0x000A // No. of reserved words in e_res2 + #define ECP 0x0004 // Offset in struct of E_CP + #define ECBLP 0x0002 // Offset in struct of E_CBLP + #define EMINALLOC 0x000A // Offset in struct of E_MINALLOC + + /* + *@@ exe_hdr: + * DOS 1, 2, 3 .EXE header. + */ + + struct exe_hdr + { + unsigned short e_magic; // Magic number + unsigned short e_cblp; // Bytes on last page of file + unsigned short e_cp; // Pages in file + unsigned short e_crlc; // Relocations + unsigned short e_cparhdr; // Size of header in paragraphs + unsigned short e_minalloc; // Minimum extra paragraphs needed + unsigned short e_maxalloc; // Maximum extra paragraphs needed + unsigned short e_ss; // Initial (relative) SS value + unsigned short e_sp; // Initial SP value + unsigned short e_csum; // Checksum + unsigned short e_ip; // Initial IP value + unsigned short e_cs; // Initial (relative) CS value + unsigned short e_lfarlc; // File address of relocation table + unsigned short e_ovno; // Overlay number + unsigned short e_res[ERES1WDS];// Reserved words + unsigned short e_oemid; // OEM identifier (for e_oeminfo) + unsigned short e_oeminfo; // OEM information; e_oemid specific + unsigned short e_res2[ERES2WDS];// Reserved words + long e_lfanew; // File address of new exe header + }; + + #define E_MAGIC(x) (x).e_magic + #define E_CBLP(x) (x).e_cblp + #define E_CP(x) (x).e_cp + #define E_CRLC(x) (x).e_crlc + #define E_CPARHDR(x) (x).e_cparhdr + #define E_MINALLOC(x) (x).e_minalloc + #define E_MAXALLOC(x) (x).e_maxalloc + #define E_SS(x) (x).e_ss + #define E_SP(x) (x).e_sp + #define E_CSUM(x) (x).e_csum + #define E_IP(x) (x).e_ip + #define E_CS(x) (x).e_cs + #define E_LFARLC(x) (x).e_lfarlc + #define E_OVNO(x) (x).e_ovno + #define E_RES(x) (x).e_res + #define E_OEMID(x) (x).e_oemid + #define E_OEMINFO(x) (x).e_oeminfo + #define E_RES2(x) (x).e_res2 + #define E_LFANEW(x) (x).e_lfanew + + + /*_________________________________________________________________* + | | + | | + | OS/2 & WINDOWS .EXE FILE HEADER DEFINITION - 286 version | + | | + |_________________________________________________________________| + * */ + + #define NEMAGIC 0x454E // New magic number + #define NERESBYTES 8 // Eight bytes reserved (now) + #define NECRC 8 // Offset into new header of NE_CRC + + /* + *@@ new_exe: + * New Executable (NE) header. + * Follows DOS header in the executable file. + */ + + struct new_exe + { + unsigned short ne_magic; // Magic number NE_MAGIC + unsigned char ne_ver; // Version number + unsigned char ne_rev; // Revision number + unsigned short ne_enttab; // Offset of Entry Table + unsigned short ne_cbenttab; // Number of bytes in Entry Table + long ne_crc; // Checksum of whole file + unsigned short ne_flags; // Flag word + unsigned short ne_autodata; // Automatic data segment number + unsigned short ne_heap; // Initial heap allocation + unsigned short ne_stack; // Initial stack allocation + long ne_csip; // Initial CS:IP setting + long ne_sssp; // Initial SS:SP setting + unsigned short ne_cseg; // Count of file segments + unsigned short ne_cmod; // Entries in Module Reference Table + unsigned short ne_cbnrestab; // Size of non-resident name table + unsigned short ne_segtab; // Offset of Segment Table + unsigned short ne_rsrctab; // Offset of Resource Table + unsigned short ne_restab; // Offset of resident name table + unsigned short ne_modtab; // Offset of Module Reference Table + unsigned short ne_imptab; // Offset of Imported Names Table + long ne_nrestab; // Offset of Non-resident Names Table + unsigned short ne_cmovent; // Count of movable entries + unsigned short ne_align; // Segment alignment shift count + unsigned short ne_cres; // Count of resource entries + unsigned char ne_exetyp; // Target operating system + unsigned char ne_flagsothers; // Other .EXE flags + char ne_res[NERESBYTES]; // Pad structure to 64 bytes + }; + + #pragma pack() + + #define NE_MAGIC(x) (x).ne_magic + #define NE_VER(x) (x).ne_ver + #define NE_REV(x) (x).ne_rev + #define NE_ENTTAB(x) (x).ne_enttab + #define NE_CBENTTAB(x) (x).ne_cbenttab + #define NE_CRC(x) (x).ne_crc + #define NE_FLAGS(x) (x).ne_flags + #define NE_AUTODATA(x) (x).ne_autodata + #define NE_HEAP(x) (x).ne_heap + #define NE_STACK(x) (x).ne_stack + #define NE_CSIP(x) (x).ne_csip + #define NE_SSSP(x) (x).ne_sssp + #define NE_CSEG(x) (x).ne_cseg + #define NE_CMOD(x) (x).ne_cmod + #define NE_CBNRESTAB(x) (x).ne_cbnrestab + #define NE_SEGTAB(x) (x).ne_segtab + #define NE_RSRCTAB(x) (x).ne_rsrctab + #define NE_RESTAB(x) (x).ne_restab + #define NE_MODTAB(x) (x).ne_modtab + #define NE_IMPTAB(x) (x).ne_imptab + #define NE_NRESTAB(x) (x).ne_nrestab + #define NE_CMOVENT(x) (x).ne_cmovent + #define NE_ALIGN(x) (x).ne_align + #define NE_CRES(x) (x).ne_cres + #define NE_RES(x) (x).ne_res + #define NE_EXETYP(x) (x).ne_exetyp + #define NE_FLAGSOTHERS(x) (x).ne_flagsothers + + #define NE_USAGE(x) (WORD)*((WORD *)(x)+1) + #define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab + #define NE_ONEWEXE(x) (WORD)(x).ne_crc + #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16) + + + /* + * Target operating systems + */ + + #define NE_UNKNOWN 0x0 /* Unknown (any "new-format" OS) */ + #define NE_OS2 0x1 /* OS/2 (default) */ + #define NE_WINDOWS 0x2 /* Windows */ + #define NE_DOS4 0x3 /* DOS 4.x */ + #define NE_DEV386 0x4 /* Windows 386 */ + + + /* + * Format of NE_FLAGS(x): + * + * p Not-a-process + * x Unused + * e Errors in image + * x Unused + * b Bound Family/API + * ttt Application type + * f Floating-point instructions + * 3 386 instructions + * 2 286 instructions + * 0 8086 instructions + * P Protected mode only + * p Per-process library initialization + * i Instance data + * s Solo data + */ + #define NENOTP 0x8000 /* Not a process */ + #define NEIERR 0x2000 /* Errors in image */ + #define NEBOUND 0x0800 /* Bound Family/API */ + #define NEAPPTYP 0x0700 /* Application type mask */ + #define NENOTWINCOMPAT 0x0100 /* Not compatible with P.M. Windowing */ + #define NEWINCOMPAT 0x0200 /* Compatible with P.M. Windowing */ + #define NEWINAPI 0x0300 /* Uses P.M. Windowing API */ + #define NEFLTP 0x0080 /* Floating-point instructions */ + #define NEI386 0x0040 /* 386 instructions */ + #define NEI286 0x0020 /* 286 instructions */ + #define NEI086 0x0010 /* 8086 instructions */ + #define NEPROT 0x0008 /* Runs in protected mode only */ + #define NEPPLI 0x0004 /* Per-Process Library Initialization */ + #define NEINST 0x0002 /* Instance data */ + #define NESOLO 0x0001 /* Solo data */ + + /* + * Format of NE_FLAGSOTHERS(x): + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | + * | | | +---------------- Support for long file names + * | | +------------------ Windows 2.x app runs in prot mode + * | +-------------------- Windows 2.x app gets prop. font + * +------------------------------ WLO appl on OS/2 (markwlo.exe) + * + */ + + #define NELONGNAMES 0x01 + #define NEWINISPROT 0x02 + #define NEWINGETPROPFON 0x04 + #define NEWLOAPPL 0x80 + + + + struct new_seg /* New .EXE segment table entry */ + { + unsigned short ns_sector; /* File sector of start of segment */ + unsigned short ns_cbseg; /* Number of bytes in file */ + unsigned short ns_flags; /* Attribute flags */ + unsigned short ns_minalloc; /* Minimum allocation in bytes */ + }; + + #define NS_SECTOR(x) (x).ns_sector + #define NS_CBSEG(x) (x).ns_cbseg + #define NS_FLAGS(x) (x).ns_flags + #define NS_MINALLOC(x) (x).ns_minalloc + + + /* + * Format of NS_FLAGS(x) + * + * Flag word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | | | | | | | | + * | | | | | | | | | | | | +-+-+--- Segment type DATA/CODE + * | | | | | | | | | | | +--------- Iterated segment + * | | | | | | | | | | +----------- Movable segment + * | | | | | | | | | +------------- Segment can be shared + * | | | | | | | | +--------------- Preload segment + * | | | | | | | +----------------- Execute/read-only for code/data segment + * | | | | | | +------------------- Segment has relocations + * | | | | | +--------------------- Code conforming/Data is expand down + * | | | +--+----------------------- I/O privilege level + * | | +----------------------------- Discardable segment + * | +-------------------------------- 32-bit code segment + * +----------------------------------- Huge segment/GDT allocation requested + * + */ + + #define NSTYPE 0x0007 /* Segment type mask */ + + #ifdef EXE386 + #define NSCODE 0x0000 /* Code segment */ + #define NSDATA 0x0001 /* Data segment */ + #define NSITER 0x0008 /* Iterated segment flag */ + #define NSMOVE 0x0010 /* Movable segment flag */ + #define NSSHARED 0x0020 /* Shared segment flag */ + #define NSPRELOAD 0x0040 /* Preload segment flag */ + #define NSEXRD 0x0080 /* Execute-only (code segment), or + * read-only (data segment) + */ + #define NSRELOC 0x0100 /* Segment has relocations */ + #define NSCONFORM 0x0200 /* Conforming segment */ + #define NSEXPDOWN 0x0200 /* Data segment is expand down */ + #define NSDPL 0x0C00 /* I/O privilege level (286 DPL bits) */ + #define SHIFTDPL 10 /* Left shift count for SEGDPL field */ + #define NSDISCARD 0x1000 /* Segment is discardable */ + #define NS32BIT 0x2000 /* 32-bit code segment */ + #define NSHUGE 0x4000 /* Huge memory segment, length of + * segment and minimum allocation + * size are in segment sector units + */ + #define NSGDT 0x8000 /* GDT allocation requested */ + + #define NSPURE NSSHARED /* For compatibility */ + + #define NSALIGN 9 /* Segment data aligned on 512 byte boundaries */ + + #define NSLOADED 0x0004 /* ns_sector field contains memory addr */ + #endif + + + struct new_segdata /* Segment data */ + { + union + { + struct + { + unsigned short ns_niter; /* number of iterations */ + unsigned short ns_nbytes; /* number of bytes */ + char ns_iterdata; /* iterated data bytes */ + } ns_iter; + struct + { + char ns_data; /* data bytes */ + } ns_noniter; + } ns_union; + }; + + struct new_rlcinfo /* Relocation info */ + { + unsigned short nr_nreloc; /* number of relocation items that */ + }; /* follow */ + + #pragma pack(1) + + + struct new_rlc /* Relocation item */ + { + char nr_stype; /* Source type */ + char nr_flags; /* Flag byte */ + unsigned short nr_soff; /* Source offset */ + union + { + struct + { + char nr_segno; /* Target segment number */ + char nr_res; /* Reserved */ + unsigned short nr_entry; /* Target Entry Table offset */ + } nr_intref; /* Internal reference */ + struct + { + unsigned short nr_mod; /* Index into Module Reference Table */ + unsigned short nr_proc; /* Procedure ordinal or name offset */ + } nr_import; /* Import */ + struct + { + unsigned short nr_ostype; /* OSFIXUP type */ + unsigned short nr_osres; /* reserved */ + } nr_osfix; /* Operating system fixup */ + } nr_union; /* Union */ + }; + + #pragma pack() + + + #define NR_STYPE(x) (x).nr_stype + #define NR_FLAGS(x) (x).nr_flags + #define NR_SOFF(x) (x).nr_soff + #define NR_SEGNO(x) (x).nr_union.nr_intref.nr_segno + #define NR_RES(x) (x).nr_union.nr_intref.nr_res + #define NR_ENTRY(x) (x).nr_union.nr_intref.nr_entry + #define NR_MOD(x) (x).nr_union.nr_import.nr_mod + #define NR_PROC(x) (x).nr_union.nr_import.nr_proc + #define NR_OSTYPE(x) (x).nr_union.nr_osfix.nr_ostype + #define NR_OSRES(x) (x).nr_union.nr_osfix.nr_osres + + + + /* + * Format of NR_STYPE(x) and R32_STYPE(x): + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | + * +-+-+-+--- source type + * + */ + + #define NRSTYP 0x0f /* Source type mask */ + #define NRSBYT 0x00 /* lo byte (8-bits)*/ + #define NRSSEG 0x02 /* 16-bit segment (16-bits) */ + #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */ + #define NRSOFF 0x05 /* 16-bit offset (16-bits) */ + #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */ + #define NROFF32 0x07 /* 32-bit offset (32-bits) */ + #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */ + + + /* + * Format of NR_FLAGS(x) and R32_FLAGS(x): + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | + * | +-+--- Reference type + * +------- Additive fixup + */ + + #define NRADD 0x04 /* Additive fixup */ + #define NRRTYP 0x03 /* Reference type mask */ + #define NRRINT 0x00 /* Internal reference */ + #define NRRORD 0x01 /* Import by ordinal */ + #define NRRNAM 0x02 /* Import by name */ + #define NRROSF 0x03 /* Operating system fixup */ + + + #if (EXE386 == 0) + + /* Resource type or name string */ + struct rsrc_string + { + char rs_len; /* number of bytes in string */ + char rs_string[ 1 ]; /* text of string */ + }; + + #define RS_LEN( x ) (x).rs_len + #define RS_STRING( x ) (x).rs_string + + /* Resource type information block */ + struct rsrc_typeinfo + { + unsigned short rt_id; + unsigned short rt_nres; + long rt_proc; + }; + + #define RT_ID( x ) (x).rt_id + #define RT_NRES( x ) (x).rt_nres + #define RT_PROC( x ) (x).rt_proc + + /* Resource name information block */ + struct rsrc_nameinfo + { + /* The following two fields must be shifted left by the value of */ + /* the rs_align field to compute their actual value. This allows */ + /* resources to be larger than 64k, but they do not need to be */ + /* aligned on 512 byte boundaries, the way segments are */ + unsigned short rn_offset; /* file offset to resource data */ + unsigned short rn_length; /* length of resource data */ + unsigned short rn_flags; /* resource flags */ + unsigned short rn_id; /* resource name id */ + unsigned short rn_handle; /* If loaded, then global handle */ + unsigned short rn_usage; /* Initially zero. Number of times */ + /* the handle for this resource has */ + /* been given out */ + }; + + #define RN_OFFSET( x ) (x).rn_offset + #define RN_LENGTH( x ) (x).rn_length + #define RN_FLAGS( x ) (x).rn_flags + #define RN_ID( x ) (x).rn_id + #define RN_HANDLE( x ) (x).rn_handle + #define RN_USAGE( x ) (x).rn_usage + + #define RSORDID 0x8000 /* if high bit of ID set then integer id */ + /* otherwise ID is offset of string from + the beginning of the resource table */ + + /* Ideally these are the same as the */ + /* corresponding segment flags */ + #define RNMOVE 0x0010 /* Moveable resource */ + #define RNPURE 0x0020 /* Pure (read-only) resource */ + #define RNPRELOAD 0x0040 /* Preloaded resource */ + #define RNDISCARD 0xF000 /* Discard priority level for resource */ + + /* Resource table */ + struct new_rsrc + { + unsigned short rs_align; /* alignment shift count for resources */ + struct rsrc_typeinfo rs_typeinfo; + }; + + #define RS_ALIGN( x ) (x).rs_align + + + #endif /* NOT EXE386 */ + + #endif /* __NEWEXE__ */ + + #ifndef DWORD + #define DWORD long int + #endif + + #ifndef WORD + #define WORD short int + #endif + + #ifndef __EXE386__ + #define __EXE386__ + + #pragma pack(1) /* Force byte alignment */ + + /*_________________________________________________________________* + | | + | | + | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 | + | | + |_________________________________________________________________| + * */ + + #define BITPERWORD 16 + #define BITPERBYTE 8 + #define OBJPAGELEN 4096 + #define E32MAGIC1 'L' /* New magic number "LX" */ + #define E32MAGIC2 'X' /* New magic number "LX" */ + #define E32MAGIC 0x584c /* New magic number "LX" */ + #define E32RESBYTES1 0 /* First bytes reserved */ + #define E32RESBYTES2 0 /* Second bytes reserved */ + #define E32RESBYTES3 20 /* Third bytes reserved */ + #define E32LEBO 0x00 /* Little Endian Byte Order */ + #define E32BEBO 0x01 /* Big Endian Byte Order */ + #define E32LEWO 0x00 /* Little Endian Word Order */ + #define E32BEWO 0x01 /* Big Endian Word Order */ + #define E32LEVEL 0L /* 32-bit EXE format level */ + #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */ + #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */ + #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */ + + + + struct e32_exe /* New 32-bit .EXE header */ + { + unsigned char e32_magic[2]; /* Magic number E32_MAGIC */ + unsigned char e32_border; /* The byte ordering for the .EXE */ + unsigned char e32_worder; /* The word ordering for the .EXE */ + unsigned long e32_level; /* The EXE format level for now = 0 */ + unsigned short e32_cpu; /* The CPU type */ + unsigned short e32_os; /* The OS type */ + unsigned long e32_ver; /* Module version */ + unsigned long e32_mflags; /* Module flags */ + unsigned long e32_mpages; /* Module # pages */ + unsigned long e32_startobj; /* Object # for instruction pointer */ + unsigned long e32_eip; /* Extended instruction pointer */ + unsigned long e32_stackobj; /* Object # for stack pointer */ + unsigned long e32_esp; /* Extended stack pointer */ + unsigned long e32_pagesize; /* .EXE page size */ + unsigned long e32_pageshift; /* Page alignment shift in .EXE */ + unsigned long e32_fixupsize; /* Fixup section size */ + unsigned long e32_fixupsum; /* Fixup section checksum */ + unsigned long e32_ldrsize; /* Loader section size */ + unsigned long e32_ldrsum; /* Loader section checksum */ + unsigned long e32_objtab; /* Object table offset */ + unsigned long e32_objcnt; /* Number of objects in module */ + unsigned long e32_objmap; /* Object page map offset */ + unsigned long e32_itermap; /* Object iterated data map offset */ + unsigned long e32_rsrctab; /* Offset of Resource Table */ + unsigned long e32_rsrccnt; /* Number of resource entries */ + unsigned long e32_restab; /* Offset of resident name table */ + unsigned long e32_enttab; /* Offset of Entry Table */ + unsigned long e32_dirtab; /* Offset of Module Directive Table */ + unsigned long e32_dircnt; /* Number of module directives */ + unsigned long e32_fpagetab; /* Offset of Fixup Page Table */ + unsigned long e32_frectab; /* Offset of Fixup Record Table */ + unsigned long e32_impmod; /* Offset of Import Module Name Table */ + unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */ + unsigned long e32_impproc; /* Offset of Import Procedure Name Table */ + unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */ + unsigned long e32_datapage; /* Offset of Enumerated Data Pages */ + unsigned long e32_preload; /* Number of preload pages */ + unsigned long e32_nrestab; /* Offset of Non-resident Names Table */ + unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */ + unsigned long e32_nressum; /* Non-resident Name Table Checksum */ + unsigned long e32_autodata; /* Object # for automatic data object */ + unsigned long e32_debuginfo; /* Offset of the debugging information */ + unsigned long e32_debuglen; /* The length of the debugging info. in bytes */ + unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */ + unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */ + unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */ + unsigned long e32_stacksize; /* Size of stack */ + unsigned char e32_res3[E32RESBYTES3]; + /* Pad structure to 196 bytes */ + }; + + + + #define E32_MAGIC1(x) (x).e32_magic[0] + #define E32_MAGIC2(x) (x).e32_magic[1] + #define E32_BORDER(x) (x).e32_border + #define E32_WORDER(x) (x).e32_worder + #define E32_LEVEL(x) (x).e32_level + #define E32_CPU(x) (x).e32_cpu + #define E32_OS(x) (x).e32_os + #define E32_VER(x) (x).e32_ver + #define E32_MFLAGS(x) (x).e32_mflags + #define E32_MPAGES(x) (x).e32_mpages + #define E32_STARTOBJ(x) (x).e32_startobj + #define E32_EIP(x) (x).e32_eip + #define E32_STACKOBJ(x) (x).e32_stackobj + #define E32_ESP(x) (x).e32_esp + #define E32_PAGESIZE(x) (x).e32_pagesize + #define E32_PAGESHIFT(x) (x).e32_pageshift + #define E32_FIXUPSIZE(x) (x).e32_fixupsize + #define E32_FIXUPSUM(x) (x).e32_fixupsum + #define E32_LDRSIZE(x) (x).e32_ldrsize + #define E32_LDRSUM(x) (x).e32_ldrsum + #define E32_OBJTAB(x) (x).e32_objtab + #define E32_OBJCNT(x) (x).e32_objcnt + #define E32_OBJMAP(x) (x).e32_objmap + #define E32_ITERMAP(x) (x).e32_itermap + #define E32_RSRCTAB(x) (x).e32_rsrctab + #define E32_RSRCCNT(x) (x).e32_rsrccnt + #define E32_RESTAB(x) (x).e32_restab + #define E32_ENTTAB(x) (x).e32_enttab + #define E32_DIRTAB(x) (x).e32_dirtab + #define E32_DIRCNT(x) (x).e32_dircnt + #define E32_FPAGETAB(x) (x).e32_fpagetab + #define E32_FRECTAB(x) (x).e32_frectab + #define E32_IMPMOD(x) (x).e32_impmod + #define E32_IMPMODCNT(x) (x).e32_impmodcnt + #define E32_IMPPROC(x) (x).e32_impproc + #define E32_PAGESUM(x) (x).e32_pagesum + #define E32_DATAPAGE(x) (x).e32_datapage + #define E32_PRELOAD(x) (x).e32_preload + #define E32_NRESTAB(x) (x).e32_nrestab + #define E32_CBNRESTAB(x) (x).e32_cbnrestab + #define E32_NRESSUM(x) (x).e32_nressum + #define E32_AUTODATA(x) (x).e32_autodata + #define E32_DEBUGINFO(x) (x).e32_debuginfo + #define E32_DEBUGLEN(x) (x).e32_debuglen + #define E32_INSTPRELOAD(x) (x).e32_instpreload + #define E32_INSTDEMAND(x) (x).e32_instdemand + #define E32_HEAPSIZE(x) (x).e32_heapsize + #define E32_STACKSIZE(x) (x).e32_stacksize + + + + /* + * Format of E32_MFLAGS(x): + * + * Low word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | + * | | | | | | | +------- Per-Process Library Initialization + * | | | | | | +--------- SystemDLL (internal fixups discarded) + * | | | | | +----------- No Internal Fixups for Module in .EXE + * | | | | +------------- No External Fixups for Module in .EXE + * | | | +------------------- Incompatible with PM Windowing + * | | +--------------------- Compatible with PM Windowing + * | | Uses PM Windowing API + * | +-------------------------------- Module not Loadable + * +-------------------------------------- Library Module + */ + + + #define E32NOTP 0x8000L /* Library Module - used as NENOTP */ + #define E32NOLOAD 0x2000L /* Module not Loadable */ + #define E32PMAPI 0x0300L /* Uses PM Windowing API */ + #define E32PMW 0x0200L /* Compatible with PM Windowing */ + #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */ + #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */ + #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */ + #define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/ + #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */ + #define E32LIBTERM 0x40000000L /* Per-Process Library Termination */ + #define E32APPMASK 0x0300L /* Application Type Mask */ + + + /* + * Format of E32_MFLAGS(x): + * + * High word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | + * | +--- Protected memory library module + * +----- Device driver + */ + + #define E32PROTDLL 0x10000L /* Protected memory library module */ + #define E32DEVICE 0x20000L /* Device driver */ + #define E32MODEXE 0x00000L /* .EXE module */ + #define E32MODDLL 0x08000L /* .DLL module */ + #define E32MODPROTDLL 0x18000L /* Protected memory library module */ + #define E32MODPDEV 0x20000L /* Physical device driver */ + #define E32MODVDEV 0x28000L /* Virtual device driver */ + #define E32MODMASK 0x38000L /* Module type mask */ + + /* + * RELOCATION DEFINITIONS - RUN-TIME FIXUPS + */ + + typedef union _RELOC_OFS + { + unsigned short offset16; + unsigned long offset32; + } RELOC_OFS; /* 16-bit or 32-bit offset */ + + + /***ET+ r32_rlc - Relocation item */ + + struct r32_rlc /* Relocation item */ + { + unsigned char nr_stype; /* Source type - field shared with new_rlc */ + unsigned char nr_flags; /* Flag byte - field shared with new_rlc */ + short r32_soff; /* Source offset */ + unsigned short r32_objmod; /* Target object number or Module ordinal */ + + union targetid + { + RELOC_OFS intref; /* Internal fixup */ + + union extfixup + { + RELOC_OFS proc; /* Procedure name offset */ + unsigned long ord; /* Procedure odrinal */ + } extref; /* External fixup */ + + struct addfixup + { + unsigned short entry; /* Entry ordinal */ + RELOC_OFS addval; /* Value added to the address */ + } addfix; /* Additive fixup */ + } + r32_target; /* Target data */ + unsigned short r32_srccount; /* Number of chained fixup records */ + unsigned short r32_chain; /* Chain head */ + }; + + /* + * In 32-bit .EXE file run-time relocations are written as varying size + * records, so we need many size definitions. + */ + + #define RINTSIZE16 8 + #define RINTSIZE32 10 + #define RORDSIZE 8 + #define RNAMSIZE16 8 + #define RNAMSIZE32 10 + #define RADDSIZE16 10 + #define RADDSIZE32 12 + + #if FALSE + /* + * Access macros defined in NEWEXE.H !!! + */ + #define NR_STYPE(x) (x).nr_stype + #define NR_FLAGS(x) (x).nr_flags + #endif + + #define R32_SOFF(x) (x).r32_soff + #define R32_OBJNO(x) (x).r32_objmod + #define R32_MODORD(x) (x).r32_objmod + #define R32_OFFSET16(x) (x).r32_target.intref.offset16 + #define R32_OFFSET32(x) (x).r32_target.intref.offset32 + #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16 + #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32 + #define R32_PROCORD(x) (x).r32_target.extref.ord + #define R32_ENTRY(x) (x).r32_target.addfix.entry + #define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16 + #define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32 + #define R32_SRCCNT(x) (x).r32_srccount + #define R32_CHAIN(x) (x).r32_chain + + + + /* + * Format of NR_STYPE(x) + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | + * | | +-+-+-+--- Source type + * | +----------- Fixup to 16:16 alias + * +------------- List of source offset follows fixup record + */ + + #if FALSE + + /* DEFINED in newexe.h !!! */ + + #define NRSTYP 0x0f /* Source type mask */ + #define NRSBYT 0x00 /* lo byte (8-bits)*/ + #define NRSSEG 0x02 /* 16-bit segment (16-bits) */ + #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */ + #define NRSOFF 0x05 /* 16-bit offset (16-bits) */ + #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */ + #define NROFF32 0x07 /* 32-bit offset (32-bits) */ + #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */ + #endif + + + #define NRSRCMASK 0x0f /* Source type mask */ + #define NRALIAS 0x10 /* Fixup to alias */ + #define NRCHAIN 0x20 /* List of source offset follows */ + /* fixup record, source offset field */ + /* in fixup record contains number */ + /* of elements in list */ + + /* + * Format of NR_FLAGS(x) and R32_FLAGS(x): + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | + * | | | | | +-+--- Reference type + * | | | | +------- Additive fixup + * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit) + * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit) + * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit) + * +----------------- 8-bit import ordinal (1 - 8-bit; + * 0 - NR32BITOFF toggles + * between 16 and 32 bit + * ordinal) + */ + + #ifdef NEVER_INCLUDE_THE_FOLLWING + /* DEFINED in newexe.h !!! */ + #define NRRTYP 0x03 /* Reference type mask */ + #define NRRINT 0x00 /* Internal reference */ + #define NRRORD 0x01 /* Import by ordinal */ + #define NRRNAM 0x02 /* Import by name */ + #define NRADD 0x04 /* Additive fixup */ + #endif + + #define NRRENT 0x03 /* Internal entry table fixup */ + + #define NR32BITOFF 0x10 /* 32-bit Target Offset */ + #define NR32BITADD 0x20 /* 32-bit Additive fixup */ + #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */ + #define NR8BITORD 0x80 /* 8-bit import ordinal */ + /*end*/ + + /* + * Data structures for storing run-time fixups in linker virtual memory. + * + * Each object has a list of Object Page Directories which specify + * fixups for given page. Each page has its own hash table which is + * used to detect fixups to the same target. + */ + + #define PAGEPERDIR 62 + #define LG2DIR 7 + + + typedef struct _OBJPAGEDIR + { + DWORD next; /* Virtual pointer to next dir on list */ + WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */ + } + OBJPAGEDIR; + + /* + * OBJECT TABLE + */ + + /***ET+ o32_obj Object Table Entry */ + + struct o32_obj /* Flat .EXE object table entry */ + { + unsigned long o32_size; /* Object virtual size */ + unsigned long o32_base; /* Object base virtual address */ + unsigned long o32_flags; /* Attribute flags */ + unsigned long o32_pagemap; /* Object page map index */ + unsigned long o32_mapsize; /* Number of entries in object page map */ + unsigned long o32_reserved; /* Reserved */ + }; + + + #define O32_SIZE(x) (x).o32_size + #define O32_BASE(x) (x).o32_base + #define O32_FLAGS(x) (x).o32_flags + #define O32_PAGEMAP(x) (x).o32_pagemap + #define O32_MAPSIZE(x) (x).o32_mapsize + #define O32_RESERVED(x) (x).o32_reserved + + /* + * Format of O32_FLAGS(x) + * + * High word of dword flag field is not used for now. + * Low word has the following format: + * + * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | | +--- Readable Object + * | | | | | | | | | | | | | +----- Writeable Object + * | | | | | | | | | | | | +------- Executable Object + * | | | | | | | | | | | +--------- Resource Object + * | | | | | | | | | | +----------- Object is Discardable + * | | | | | | | | | +------------- Object is Shared + * | | | | | | | | +--------------- Object has preload pages + * | | | | | | | +----------------- Object has invalid pages + * | | | | | | +------------------- Object is permanent and swappable + * | | | | | +--------------------- Object is permanent and resident + * | | | | +----------------------- Object is permanent and long lockable + * | | | +----------------------------- 16:16 alias required (80x86 specific) + * | | +-------------------------------- Big/Default bit setting (80x86 specific) + * | +----------------------------------- Object is conforming for code (80x86 specific) + * +-------------------------------------- Object I/O privilege level (80x86 specific) + * + */ + + #define OBJREAD 0x0001L /* Readable Object */ + #define OBJWRITE 0x0002L /* Writeable Object */ + #define OBJRSRC 0x0008L /* Resource Object */ + #define OBJINVALID 0x0080L /* Object has invalid pages */ + #define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */ + #define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */ + #define OBJPERM 0x0100L /* Object is permanent and swappable */ + #define OBJRESIDENT 0x0200L /* Object is permanent and resident */ + #define OBJCONTIG 0x0300L /* Object is resident and contiguous */ + #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */ + #define OBJTYPEMASK 0x0700L /* Object type mask */ + #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */ + #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */ + #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */ + #if FOR_EXEHDR + /* + * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version + */ + #define OBJDISCARD 0x0010L /* Object is Discardable */ + #define OBJSHARED 0x0020L /* Object is Shared */ + #define OBJPRELOAD 0x0040L /* Object has preload pages */ + #define OBJEXEC 0x0004L /* Executable Object */ + #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ + #else + /* + * Life will be easier, if we keep the same names for the following flags: + */ + #ifndef NSDISCARD + #define NSDISCARD 0x0010L /* Object is Discardable */ + #endif + #ifndef NSMOVE + #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */ + #endif + #ifndef NSSHARED + #define NSSHARED 0x0020L /* Object is Shared */ + #endif + #ifndef NSPRELOAD + #define NSPRELOAD 0x0040L /* Object has preload pages */ + #endif + #ifndef NSEXRD + #define NSEXRD 0x0004L /* Executable Object */ + #endif + #ifndef NSCONFORM + #define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ + #endif + #endif + /*end*/ + + /***ET+ o32_map - Object Page Map entry */ + + struct o32_map /* Object Page Table entry */ + { + unsigned long o32_pagedataoffset; /* file offset of page */ + unsigned short o32_pagesize; /* # bytes of page data */ + unsigned short o32_pageflags; /* Per-Page attributes */ + }; + + + #define GETPAGEIDX(x) ((x).o32_pagedataoffset) + + #define PUTPAGEIDX(x,i) ((x).o32_pagedataoffset = ((unsigned long)(i))) + + #define PUTPAGESIZ(x,i) ((x).o32_pagesize = ((unsigned int)(i))) + + #define GETPAGESIZ(x) ((x).o32_pagesize) + + #define PAGEFLAGS(x) (x).o32_pageflags + + + #define VALID 0x0000 /* Valid Physical Page in .EXE */ + #define ITERDATA 0x0001 /* Iterated Data Page */ + #define INVALID 0x0002 /* Invalid Page */ + #define ZEROED 0x0003 /* Zero Filled Page */ + #define RANGE 0x0004 /* Range of pages */ + #define ITERDATA2 0x0005 /* Iterated Data Page Type II */ + /*end*/ + + /* + * RESOURCE TABLE + */ + + /***ET+ rsrc32 - Resource Table Entry */ + + struct rsrc32 /* Resource Table Entry */ + { + unsigned short type; /* Resource type */ + unsigned short name; /* Resource name */ + unsigned long cb; /* Resource size */ + unsigned short obj; /* Object number */ + unsigned long offset; /* Offset within object */ + }; + /*end*/ + + + /* + * Iteration Record format for 'EXEPACK'ed pages. + */ + struct LX_Iter + { + unsigned short LX_nIter; /* number of iterations */ + unsigned short LX_nBytes; /* number of bytes */ + unsigned char LX_Iterdata; /* iterated data byte(s) */ + }; + + + /* + * ENTRY TABLE DEFINITIONS + */ + + /***ET+ b32_bundle - Entry Table */ + + struct b32_bundle + { + unsigned char b32_cnt; /* Number of entries in this bundle */ + unsigned char b32_type; /* Bundle type */ + unsigned short b32_obj; /* Object number */ + }; /* Follows entry types */ + + struct e32_entry + { + unsigned char e32_flags; /* Entry point flags */ + union entrykind + { + RELOC_OFS e32_offset; /* 16-bit/32-bit offset entry */ + struct callgate + { + unsigned short offset; /* Offset in segment */ + unsigned short callgate; /* Callgate selector */ + } + e32_callgate; /* 286 (16-bit) call gate */ + struct fwd + { + unsigned short modord; /* Module ordinal number */ + unsigned long value; /* Proc name offset or ordinal */ + } + e32_fwd; /* Forwarder */ + } + e32_variant; /* Entry variant */ + }; + + + + #define B32_CNT(x) (x).b32_cnt + #define B32_TYPE(x) (x).b32_type + #define B32_OBJ(x) (x).b32_obj + + #define E32_EFLAGS(x) (x).e32_flags + #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16 + #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32 + #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset + #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate + #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord + #define E32_VALUE(x) (x).e32_variant.e32_fwd.value + + #define FIXENT16 3 + #define FIXENT32 5 + #define GATEENT16 5 + #define FWDENT 7 + + /* + * BUNDLE TYPES + */ + + #define EMPTY 0x00 /* Empty bundle */ + #define ENTRY16 0x01 /* 16-bit offset entry point */ + #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */ + #define ENTRY32 0x03 /* 32-bit offset entry point */ + #define ENTRYFWD 0x04 /* Forwarder entry point */ + #define TYPEINFO 0x80 /* Typing information present flag */ + + + /* + * Format for E32_EFLAGS(x) + * + * 7 6 5 4 3 2 1 0 - bit no + * | | | | | | | | + * | | | | | | | +--- exported entry + * | | | | | | +----- uses shared data + * +-+-+-+-+-+------- parameter word count + */ + + #define E32EXPORT 0x01 /* Exported entry */ + #define E32SHARED 0x02 /* Uses shared data */ + #define E32PARAMS 0xf8 /* Parameter word count mask */ + + /* + * Flags for forwarders only: + */ + + #define FWD_ORDINAL 0x01 /* Imported by ordinal */ + + + #pragma pack() /* Restore default alignment */ + + /*end*/ + + #endif /* __EXE386__ */ + +#endif |