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