113 lines
2.6 KiB
C++
113 lines
2.6 KiB
C++
//
|
|
// Created by TiborL 06/01/97
|
|
//
|
|
|
|
#ifdef WIN32_LEAN_AND_MEAN
|
|
#undef WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
|
|
#pragma warning(disable:4102 4700)
|
|
|
|
extern "C" {
|
|
#include <windows.h>
|
|
};
|
|
|
|
#include <mtdll.h>
|
|
|
|
#include <ehassert.h>
|
|
#include <ehdata.h>
|
|
#include <trnsctrl.h>
|
|
#include <eh.h>
|
|
#include <ehhooks.h>
|
|
|
|
#pragma hdrstop
|
|
|
|
extern "C" void RtlCaptureContext(CONTEXT*);
|
|
|
|
extern "C" void _UnwindNestedFrames(
|
|
EHRegistrationNode *pFrame, // Unwind up to (but not including) this frame
|
|
EHExceptionRecord *pExcept, // The exception that initiated this unwind
|
|
CONTEXT *pContext // Context info for current exception
|
|
) {
|
|
void *pReturnPoint; // The address we want to return from RtlUnwind
|
|
CONTEXT LocalContext; // Create context for this routine to return from RtlUnwind
|
|
CONTEXT OriginalContext; // Restore pContext from this
|
|
CONTEXT ScratchContext; // Context record to pass to RtlUnwind2 to be used as scratch
|
|
|
|
//
|
|
// set up the return label
|
|
//
|
|
BASE:
|
|
/*
|
|
// **** manually added to handlers.s
|
|
{ .mii
|
|
nop.m 0
|
|
mov r2=ip
|
|
adds r2=$LABEL - $BASE, r2
|
|
}
|
|
{ .mmi
|
|
adds r30=pReturnPoint$, sp
|
|
st4 [r30]=r2
|
|
nop.i 0
|
|
}
|
|
// ****
|
|
*/
|
|
_MoveContext(&OriginalContext,pContext);
|
|
RtlCaptureContext(&LocalContext);
|
|
LocalContext.StIIP = (ULONGLONG)pReturnPoint;
|
|
_MoveContext(&ScratchContext,&LocalContext);
|
|
_SaveUnwindContext(&LocalContext);
|
|
RtlUnwind2(*pFrame, pReturnPoint, (PEXCEPTION_RECORD)pExcept, NULL, &ScratchContext);
|
|
LABEL:
|
|
_MoveContext(pContext,&OriginalContext);
|
|
_SaveUnwindContext(0);
|
|
PER_FLAGS(pExcept) &= ~EXCEPTION_UNWINDING;
|
|
}
|
|
|
|
/*
|
|
//++
|
|
//
|
|
//extern "C"
|
|
//PVOID
|
|
//__Cxx_ExecuteHandler (
|
|
// ULONGLONG MemoryStack,
|
|
// ULONGLONG BackingStore,
|
|
// ULONGLONG Handler,
|
|
// ULONGLONG GlobalPointer
|
|
// );
|
|
//
|
|
//Routine Description:
|
|
//
|
|
// This function scans the scope tables associated with the specified
|
|
// procedure and calls exception and termination handlers as necessary.
|
|
//
|
|
//Arguments:
|
|
//
|
|
// MemoryStack (r32) - memory stack pointer of establisher frame
|
|
//
|
|
// BackingStore (r33) - backing store pointer of establisher frame
|
|
//
|
|
// Handler (r34) - Entry point of handler
|
|
//
|
|
// GlobalPointer (r35) - GP of termination handler
|
|
//
|
|
//Return Value:
|
|
//
|
|
// Returns the continuation point
|
|
//
|
|
//--
|
|
|
|
.global __Cxx_ExecuteHandler#
|
|
|
|
.proc __Cxx_ExecuteHandler#
|
|
.align 32
|
|
__Cxx_ExecuteHandler:
|
|
alloc r2=0, 0, 2, 0
|
|
mov gp = r35 // set new GP
|
|
mov b6 = r34 // handler address
|
|
br b6 // branch to handler
|
|
nop.b 0
|
|
nop.b 0
|
|
.endp __Cxx_ExecuteHandler#
|
|
*/
|