diff options
Diffstat (limited to 'sal/osl/os2/helpers/debug.h')
-rw-r--r-- | sal/osl/os2/helpers/debug.h | 1771 |
1 files changed, 0 insertions, 1771 deletions
diff --git a/sal/osl/os2/helpers/debug.h b/sal/osl/os2/helpers/debug.h deleted file mode 100644 index a8bcf5686cd7..000000000000 --- a/sal/osl/os2/helpers/debug.h +++ /dev/null @@ -1,1771 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -/* - *@@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 M�ller, - * Kim Rasmussen, - * Marc Fiammante, - * John Currier, - * Anthony Cruise. - * - * 2009-06-15 published under LGPL3 with Ulrich M�ller permission. - * - */ - -#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) - }; - - // 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 - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |