// // Created by TiborL 06/01/97 // #include "windows.h" #include "ehassert.h" #include "ehdata.h" // Declarations of all types used for EH #include "ehstate.h" #include "eh.h" #include "ehhooks.h" #include "trnsctrl.h" #pragma hdrstop __ehstate_t __StateFromIp( FuncInfo *pFuncInfo, DispatcherContext *pDC, __int64 Ip ) { unsigned int index; // loop control variable unsigned int nIPMapEntry; // # of IpMapEntry; must be > 0 DASSERT(pFuncInfo != NULL); nIPMapEntry = FUNC_NIPMAPENT(*pFuncInfo); DASSERT(FUNC_IPMAP(*pFuncInfo, pDC->ImageBase) != NULL); for (index = 0; index < nIPMapEntry; index++) { IptoStateMapEntry *pIPtoStateMap = FUNC_PIPTOSTATE(*pFuncInfo, index, pDC->ImageBase); if( Ip < (pDC->ImageBase + pIPtoStateMap->Ip) ) { break; } } if (index == 0) { // We are at the first entry, could be an error return EH_EMPTY_STATE; } // We over-shot one iteration; return state from the previous slot return FUNC_IPTOSTATE(*pFuncInfo, index - 1, pDC->ImageBase).State; } __ehstate_t __StateFromControlPc( FuncInfo *pFuncInfo, DispatcherContext *pDC ) { return __StateFromIp(pFuncInfo, pDC, pDC->ControlPc); } // // This routine is a replacement for the corresponding macro in 'ehdata.h' // __ehstate_t __GetCurrentState( EHRegistrationNode *pFrame, DispatcherContext *pDC, FuncInfo *pFuncInfo ) { if( UNWINDSTATE(pFrame->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) == -2 ) { return __StateFromControlPc(pFuncInfo, pDC); } else { return UNWINDSTATE(pFrame->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)); } } VOID __SetState( EHRegistrationNode *pRN, DispatcherContext *pDC, FuncInfo *pFuncInfo, __ehstate_t newState ){ UNWINDSTATE(pRN->MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) = newState; } VOID __SetUnwindTryBlock( EHRegistrationNode *pRN, DispatcherContext *pDC, FuncInfo *pFuncInfo, INT curState ){ EHRegistrationNode EstablisherFramePointers; _GetEstablisherFrame(pRN, pDC, pFuncInfo, &EstablisherFramePointers); if( curState > UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) ) { UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)) = curState; } } INT __GetUnwindTryBlock( EHRegistrationNode *pRN, DispatcherContext *pDC, FuncInfo *pFuncInfo ){ EHRegistrationNode EstablisherFramePointers; _GetEstablisherFrame(pRN, pDC, pFuncInfo, &EstablisherFramePointers); return UNWINDTRYBLOCK(EstablisherFramePointers.MemoryStackFp, FUNC_DISPUNWINDHELP(*pFuncInfo)); }