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