- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
408 lines
12 KiB
C++
408 lines
12 KiB
C++
/***
|
|
*excpt.h - defines exception values, types and routines
|
|
*
|
|
*Purpose:
|
|
* This file contains the definitions and prototypes for the compiler-
|
|
* dependent intrinsics, support functions and keywords which implement
|
|
* the structured exception handling extensions.
|
|
*
|
|
****/
|
|
|
|
/*
|
|
* C/C++ Run Time Library - Version 6.5
|
|
*
|
|
* Copyright (c) 1990, 1994 by Borland International
|
|
* All Rights Reserved.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __EXCPT_H
|
|
#define __EXCPT_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if defined(__BORLANDC__) && !defined(__FLAT__)
|
|
|
|
#if !defined(__WINDOWS_H)
|
|
typedef unsigned char BYTE;
|
|
typedef unsigned long DWORD;
|
|
typedef void __far * LPVOID;
|
|
typedef unsigned int UINT;
|
|
typedef DWORD __far * LPDWORD;
|
|
#define WINAPI _far _pascal
|
|
#endif
|
|
|
|
/* From WINNT.H */
|
|
|
|
//
|
|
// Define the size of the 80387 save area, which is in the context frame.
|
|
//
|
|
|
|
#define SIZE_OF_80387_REGISTERS 80
|
|
|
|
typedef struct _FLOATING_SAVE_AREA {
|
|
DWORD ControlWord;
|
|
DWORD StatusWord;
|
|
DWORD TagWord;
|
|
DWORD ErrorOffset;
|
|
DWORD ErrorSelector;
|
|
DWORD DataOffset;
|
|
DWORD DataSelector;
|
|
BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
|
|
DWORD Cr0NpxState;
|
|
} FLOATING_SAVE_AREA;
|
|
|
|
//
|
|
// Context Frame
|
|
//
|
|
// This frame has a several purposes: 1) it is used as an argument to
|
|
// NtContinue, 2) is is used to constuct a call frame for APC delivery,
|
|
// and 3) it is used in the user level thread creation routines.
|
|
//
|
|
// The layout of the record conforms to a standard call frame.
|
|
//
|
|
|
|
typedef struct _CONTEXT {
|
|
|
|
//
|
|
// The flags values within this flag control the contents of
|
|
// a CONTEXT record.
|
|
//
|
|
// If the context record is used as an input parameter, then
|
|
// for each portion of the context record controlled by a flag
|
|
// whose value is set, it is assumed that that portion of the
|
|
// context record contains valid context. If the context record
|
|
// is being used to modify a threads context, then only that
|
|
// portion of the threads context will be modified.
|
|
//
|
|
// If the context record is used as an IN OUT parameter to capture
|
|
// the context of a thread, then only those portions of the thread's
|
|
// context corresponding to set flags will be returned.
|
|
//
|
|
// The context record is never used as an OUT only parameter.
|
|
//
|
|
|
|
DWORD ContextFlags;
|
|
|
|
//
|
|
// This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
|
|
// set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
|
|
// included in CONTEXT_FULL.
|
|
//
|
|
|
|
DWORD Dr0;
|
|
DWORD Dr1;
|
|
DWORD Dr2;
|
|
DWORD Dr3;
|
|
DWORD Dr6;
|
|
DWORD Dr7;
|
|
|
|
//
|
|
// This section is specified/returned if the
|
|
// ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
|
|
//
|
|
|
|
FLOATING_SAVE_AREA FloatSave;
|
|
|
|
//
|
|
// This section is specified/returned if the
|
|
// ContextFlags word contians the flag CONTEXT_SEGMENTS.
|
|
//
|
|
|
|
DWORD SegGs;
|
|
DWORD SegFs;
|
|
DWORD SegEs;
|
|
DWORD SegDs;
|
|
|
|
//
|
|
// This section is specified/returned if the
|
|
// ContextFlags word contians the flag CONTEXT_INTEGER.
|
|
//
|
|
|
|
DWORD Edi;
|
|
DWORD Esi;
|
|
DWORD Ebx;
|
|
DWORD Edx;
|
|
DWORD Ecx;
|
|
DWORD Eax;
|
|
|
|
//
|
|
// This section is specified/returned if the
|
|
// ContextFlags word contians the flag CONTEXT_CONTROL.
|
|
//
|
|
|
|
DWORD Ebp;
|
|
DWORD Eip;
|
|
DWORD SegCs; // MUST BE SANITIZED
|
|
DWORD EFlags; // MUST BE SANITIZED
|
|
DWORD Esp;
|
|
DWORD SegSs;
|
|
|
|
} CONTEXT;
|
|
|
|
|
|
typedef CONTEXT *PCONTEXT;
|
|
|
|
/* From WINNT.H */
|
|
#define STATUS_WAIT_0 ((DWORD )0x00000000L)
|
|
#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L)
|
|
#define STATUS_USER_APC ((DWORD )0x000000C0L)
|
|
#define STATUS_TIMEOUT ((DWORD )0x00000102L)
|
|
#define STATUS_PENDING ((DWORD )0x00000103L)
|
|
#define STATUS_DATATYPE_MISALIGNMENT ((DWORD )0x80000002L)
|
|
#define STATUS_BREAKPOINT ((DWORD )0x80000003L)
|
|
#define STATUS_SINGLE_STEP ((DWORD )0x80000004L)
|
|
#define STATUS_ACCESS_VIOLATION ((DWORD )0xC0000005L)
|
|
#define STATUS_IN_PAGE_ERROR ((DWORD )0xC0000006L)
|
|
#define STATUS_NO_MEMORY ((DWORD )0xC0000017L)
|
|
#define STATUS_ILLEGAL_INSTRUCTION ((DWORD )0xC000001DL)
|
|
#define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD )0xC0000025L)
|
|
#define STATUS_INVALID_DISPOSITION ((DWORD )0xC0000026L)
|
|
#define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD )0xC000008CL)
|
|
#define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD )0xC000008DL)
|
|
#define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD )0xC000008EL)
|
|
#define STATUS_FLOAT_INEXACT_RESULT ((DWORD )0xC000008FL)
|
|
#define STATUS_FLOAT_INVALID_OPERATION ((DWORD )0xC0000090L)
|
|
#define STATUS_FLOAT_OVERFLOW ((DWORD )0xC0000091L)
|
|
#define STATUS_FLOAT_STACK_CHECK ((DWORD )0xC0000092L)
|
|
#define STATUS_FLOAT_UNDERFLOW ((DWORD )0xC0000093L)
|
|
#define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD )0xC0000094L)
|
|
#define STATUS_INTEGER_OVERFLOW ((DWORD )0xC0000095L)
|
|
#define STATUS_PRIVILEGED_INSTRUCTION ((DWORD )0xC0000096L)
|
|
#define STATUS_STACK_OVERFLOW ((DWORD )0xC00000FDL)
|
|
#define STATUS_CONTROL_C_EXIT ((DWORD )0xC000013AL)
|
|
|
|
/* From WINNT.H */
|
|
#define EXCEPTION_CONTINUABLE 0 // Continuable exception
|
|
#define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception
|
|
#define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
|
|
|
|
//
|
|
// Exception record definition.
|
|
//
|
|
|
|
typedef struct _EXCEPTION_RECORD {
|
|
DWORD ExceptionCode;
|
|
DWORD ExceptionFlags;
|
|
struct _EXCEPTION_RECORD __ss *ExceptionRecord;
|
|
LPVOID ExceptionAddress;
|
|
UINT NumberParameters;
|
|
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
|
} EXCEPTION_RECORD;
|
|
|
|
typedef EXCEPTION_RECORD __ss *PEXCEPTION_RECORD;
|
|
|
|
//
|
|
// Typedef for pointer returned by exception_info()
|
|
//
|
|
|
|
typedef struct _EXCEPTION_POINTERS {
|
|
PEXCEPTION_RECORD ExceptionRecord;
|
|
PCONTEXT ContextRecord;
|
|
} EXCEPTION_POINTERS, __ss *PEXCEPTION_POINTERS;
|
|
|
|
|
|
/* From WINBASE.H */
|
|
#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
|
|
#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
|
|
#define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT
|
|
#define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP
|
|
#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
|
|
#define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND
|
|
#define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO
|
|
#define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT
|
|
#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
|
|
#define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW
|
|
#define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK
|
|
#define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW
|
|
#define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO
|
|
#define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW
|
|
#define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION
|
|
#define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR
|
|
|
|
void
|
|
__cdecl __far
|
|
RaiseException(
|
|
DWORD dwExceptionCode,
|
|
DWORD dwExceptionFlags,
|
|
DWORD nNumberOfArguments,
|
|
const LPDWORD lpArguments
|
|
);
|
|
|
|
long
|
|
WINAPI
|
|
UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo);
|
|
|
|
typedef long (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
|
|
PEXCEPTION_POINTERS ExceptionInfo
|
|
);
|
|
typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
|
|
|
|
LPTOP_LEVEL_EXCEPTION_FILTER
|
|
WINAPI
|
|
SetUnhandledExceptionFilter(
|
|
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
|
|
);
|
|
|
|
#endif /* __BORLANDC__ && !__FLAT__ */
|
|
|
|
|
|
/*
|
|
* Conditional macro definition for function calling type and variable type
|
|
* qualifiers.
|
|
*/
|
|
#if ( (_MSC_VER >= 800) && (_M_IX86 >= 300) ) || defined(__BORLANDC__)
|
|
|
|
/* From WINNT.H */
|
|
#define EXCEPTION_CONTINUABLE 0 // Continuable exception
|
|
#define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception
|
|
#define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
|
|
|
|
/*
|
|
* Definitions for MS C8-32 (386/486) compiler
|
|
*/
|
|
#define _CRTAPI1 __cdecl
|
|
#define _CRTAPI2 __cdecl
|
|
|
|
#else
|
|
|
|
/*
|
|
* Other compilers (e.g., MIPS)
|
|
*/
|
|
#define _CRTAPI1
|
|
#define _CRTAPI2
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Exception disposition return values.
|
|
*/
|
|
typedef enum _EXCEPTION_DISPOSITION {
|
|
ExceptionContinueExecution,
|
|
ExceptionContinueSearch,
|
|
ExceptionNestedException,
|
|
ExceptionCollidedUnwind
|
|
} EXCEPTION_DISPOSITION;
|
|
|
|
|
|
/*
|
|
* Prototype for SEH support function.
|
|
*/
|
|
|
|
#if defined(_M_IX86)
|
|
|
|
/*
|
|
* Declarations to keep MS C 8 (386/486) compiler happy
|
|
*/
|
|
struct _EXCEPTION_RECORD;
|
|
struct _CONTEXT;
|
|
|
|
EXCEPTION_DISPOSITION _CRTAPI2 _except_handler (
|
|
struct _EXCEPTION_RECORD *ExceptionRecord,
|
|
void *EstablisherFrame,
|
|
struct _CONTEXT *ContextRecord,
|
|
void *DispatcherContext
|
|
);
|
|
|
|
#elif defined(_M_MRX000) || defined(_MIPS_) || defined(_ALPHA_)
|
|
|
|
/*
|
|
* Declarations to keep MIPS and ALPHA compiler happy
|
|
*/
|
|
typedef struct _EXCEPTION_POINTERS *Exception_info_ptr;
|
|
struct _EXCEPTION_RECORD;
|
|
struct _CONTEXT;
|
|
struct _DISPATCHER_CONTEXT;
|
|
|
|
|
|
EXCEPTION_DISPOSITION __C_specific_handler (
|
|
struct _EXCEPTION_RECORD *ExceptionRecord,
|
|
void *EstablisherFrame,
|
|
struct _CONTEXT *ContextRecord,
|
|
struct _DISPATCHER_CONTEXT *DispatcherContext
|
|
);
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Keywords and intrinsics for SEH
|
|
*/
|
|
|
|
#if defined(__BORLANDC__)
|
|
/*
|
|
* Borland C++
|
|
*/
|
|
#ifndef __cplusplus
|
|
# define try __try
|
|
# define finally __finally
|
|
# define AbnormalTermination() __abnormal_termination
|
|
# define abnormal_termination() __abnormal_termination
|
|
#endif
|
|
|
|
# define except __except
|
|
# define GetExceptionCode() __exception_code
|
|
# define exception_code() __exception_code
|
|
# define GetExceptionInformation() ((PEXCEPTION_POINTERS)__exception_info)
|
|
# define exception_info() ((PEXCEPTION_POINTERS)__exception_info)
|
|
|
|
#elif ( _MSC_VER >= 800 )
|
|
/*
|
|
* MS C8-32 (386/486)
|
|
*/
|
|
#define try __try
|
|
#define except __except
|
|
#define finally __finally
|
|
#define leave __leave
|
|
#define GetExceptionCode _exception_code
|
|
#define exception_code _exception_code
|
|
#define GetExceptionInformation (struct _EXCEPTION_POINTERS *)_exception_info
|
|
#define exception_info (struct _EXCEPTION_POINTERS *)_exception_info
|
|
#define AbnormalTermination _abnormal_termination
|
|
#define abnormal_termination _abnormal_termination
|
|
|
|
unsigned long _CRTAPI1 _exception_code(void);
|
|
void * _CRTAPI1 _exception_info(void);
|
|
int _CRTAPI1 _abnormal_termination(void);
|
|
|
|
#elif defined(_M_MRX000) || defined(_MIPS_) || defined(_ALPHA_)
|
|
/*
|
|
* MIPS or ALPHA compiler
|
|
*/
|
|
#define try __builtin_try
|
|
#define except __builtin_except
|
|
#define finally __builtin_finally
|
|
#define leave __builtin_leave
|
|
#define GetExceptionCode() __exception_code
|
|
#define exception_code() __exception_code
|
|
#define GetExceptionInformation() (struct _EXCEPTION_POINTERS *)__exception_info
|
|
#define exception_info() (struct _EXCEPTION_POINTERS *)__exception_info
|
|
#define AbnormalTermination() __abnormal_termination
|
|
#define abnormal_termination() __abnormal_termination
|
|
|
|
extern unsigned long __exception_code;
|
|
extern int __exception_info;
|
|
extern int __abnormal_termination;
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Legal values for expression in except().
|
|
*/
|
|
|
|
#define EXCEPTION_EXECUTE_HANDLER 1
|
|
#define EXCEPTION_CONTINUE_SEARCH 0
|
|
#define EXCEPTION_CONTINUE_EXECUTION -1
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __EXCPT_H */
|