mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 02:43:48 +00:00
Allow pseh.h and pseh2.h to be included in the same compilation unit. Mixing PSEH and PSEH 2.0 macros in the same function isn't safe yet, though
svn path=/trunk/; revision=37601
This commit is contained in:
parent
eba975aff9
commit
0d89ee1b23
|
@ -31,7 +31,7 @@ struct _EXCEPTION_RECORD;
|
||||||
struct _EXCEPTION_POINTERS;
|
struct _EXCEPTION_POINTERS;
|
||||||
struct _CONTEXT;
|
struct _CONTEXT;
|
||||||
|
|
||||||
typedef int (__cdecl * _SEHFrameHandler_t)
|
typedef int (__cdecl * _SEH2FrameHandler_t)
|
||||||
(
|
(
|
||||||
struct _EXCEPTION_RECORD *,
|
struct _EXCEPTION_RECORD *,
|
||||||
void *,
|
void *,
|
||||||
|
@ -94,12 +94,12 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
/* Soft memory barrier */
|
/* Soft memory barrier */
|
||||||
#define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
|
#define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
|
||||||
|
|
||||||
typedef struct __SEHRegistration
|
typedef struct __SEH2Registration
|
||||||
{
|
{
|
||||||
struct __SEHRegistration * SER_Prev;
|
struct __SEH2Registration * SER_Prev;
|
||||||
_SEHFrameHandler_t SER_Handler;
|
_SEH2FrameHandler_t SER_Handler;
|
||||||
}
|
}
|
||||||
_SEHRegistration_t;
|
_SEH2Registration_t;
|
||||||
|
|
||||||
#define __SEH_FORCE_NEST \
|
#define __SEH_FORCE_NEST \
|
||||||
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
|
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
|
||||||
|
@ -118,24 +118,24 @@ _SEHRegistration_t;
|
||||||
#define __SEH_RETURN_EXCEPT(R_) return (int)(R_)
|
#define __SEH_RETURN_EXCEPT(R_) return (int)(R_)
|
||||||
#define __SEH_RETURN_FINALLY() return
|
#define __SEH_RETURN_FINALLY() return
|
||||||
|
|
||||||
typedef struct __SEHFrame
|
typedef struct __SEH2Frame
|
||||||
{
|
{
|
||||||
_SEHRegistration_t SF_Registration;
|
_SEH2Registration_t SF_Registration;
|
||||||
volatile struct __SEHTryLevel * volatile SF_TopTryLevel;
|
volatile struct __SEH2TryLevel * volatile SF_TopTryLevel;
|
||||||
void * volatile SF_FramePointer;
|
void * volatile SF_FramePointer;
|
||||||
void * volatile SF_StackPointer;
|
void * volatile SF_StackPointer;
|
||||||
volatile unsigned long SF_Code;
|
volatile unsigned long SF_Code;
|
||||||
}
|
}
|
||||||
_SEHFrame_t;
|
_SEH2Frame_t;
|
||||||
|
|
||||||
typedef struct __SEHTryLevel
|
typedef struct __SEH2TryLevel
|
||||||
{
|
{
|
||||||
volatile struct __SEHTryLevel * ST_Next;
|
volatile struct __SEH2TryLevel * ST_Next;
|
||||||
void * ST_FramePointer;
|
void * ST_FramePointer;
|
||||||
void * ST_Filter;
|
void * ST_Filter;
|
||||||
void * ST_Body;
|
void * ST_Body;
|
||||||
}
|
}
|
||||||
_SEHTryLevel_t;
|
_SEH2TryLevel_t;
|
||||||
|
|
||||||
#define __SEH_BEGIN_TRY \
|
#define __SEH_BEGIN_TRY \
|
||||||
{ \
|
{ \
|
||||||
|
@ -157,16 +157,16 @@ _SEHTryLevel_t;
|
||||||
|
|
||||||
#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
|
#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
|
||||||
{ \
|
{ \
|
||||||
__SEH_BARRIER; _SEHFrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
|
__SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __SEH_ENTER_TRYLEVEL() __SEH_SET_TRYLEVEL(&_SEHTryLevel)
|
#define __SEH_ENTER_TRYLEVEL() __SEH_SET_TRYLEVEL(&_SEHTryLevel)
|
||||||
#define __SEH_LEAVE_TRYLEVEL() __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP)
|
#define __SEH_LEAVE_TRYLEVEL() __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP)
|
||||||
|
|
||||||
#define __SEH_END_SCOPE_CHAIN \
|
#define __SEH_END_SCOPE_CHAIN \
|
||||||
static const int _SEHScopeKind = 1; \
|
static const int _SEH2ScopeKind = 1; \
|
||||||
static _SEHFrame_t * const _SEHFrameP = 0; \
|
static _SEH2Frame_t * const _SEH2FrameP = 0; \
|
||||||
static _SEHTryLevel_t * const _SEHTryLevelP = 0;
|
static _SEH2TryLevel_t * const _SEH2TryLevelP = 0;
|
||||||
|
|
||||||
#define __SEH_BEGIN_SCOPE \
|
#define __SEH_BEGIN_SCOPE \
|
||||||
for(;;) \
|
for(;;) \
|
||||||
|
@ -176,9 +176,9 @@ _SEHTryLevel_t;
|
||||||
\
|
\
|
||||||
_SEHBeginScope: __SEH_SIDE_EFFECT; \
|
_SEHBeginScope: __SEH_SIDE_EFFECT; \
|
||||||
\
|
\
|
||||||
const int _SEHTopTryLevel = (_SEHScopeKind != 0); \
|
const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
|
||||||
_SEHFrame_t * const _SEHCurFrameP = _SEHFrameP; \
|
_SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
|
||||||
volatile _SEHTryLevel_t * const _SEHPrevTryLevelP = _SEHTryLevelP; \
|
volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
|
||||||
\
|
\
|
||||||
(void)_SEHTopTryLevel; \
|
(void)_SEHTopTryLevel; \
|
||||||
(void)_SEHCurFrameP; \
|
(void)_SEHCurFrameP; \
|
||||||
|
@ -191,17 +191,17 @@ _SEHTryLevel_t;
|
||||||
__label__ _SEHBeforeTry; \
|
__label__ _SEHBeforeTry; \
|
||||||
__label__ _SEHDoTry; \
|
__label__ _SEHDoTry; \
|
||||||
__label__ _SEHAfterTry; \
|
__label__ _SEHAfterTry; \
|
||||||
static const int _SEHScopeKind = 0; \
|
static const int _SEH2ScopeKind = 0; \
|
||||||
_SEHFrame_t _SEHFrame; \
|
_SEH2Frame_t _SEHFrame; \
|
||||||
volatile _SEHTryLevel_t _SEHTryLevel; \
|
volatile _SEH2TryLevel_t _SEHTryLevel; \
|
||||||
_SEHFrame_t * const _SEHFrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
|
_SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
|
||||||
volatile _SEHTryLevel_t * const _SEHTryLevelP = &_SEHTryLevel; \
|
volatile _SEH2TryLevel_t * const _SEH2TryLevelP = &_SEHTryLevel; \
|
||||||
\
|
\
|
||||||
(void)_SEHScopeKind; \
|
(void)_SEH2ScopeKind; \
|
||||||
(void)_SEHFrame; \
|
(void)_SEHFrame; \
|
||||||
(void)_SEHTryLevel; \
|
(void)_SEHTryLevel; \
|
||||||
(void)_SEHFrameP; \
|
(void)_SEH2FrameP; \
|
||||||
(void)_SEHTryLevelP; \
|
(void)_SEH2TryLevelP; \
|
||||||
\
|
\
|
||||||
_SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
|
_SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
|
||||||
goto _SEHBeforeTry; \
|
goto _SEHBeforeTry; \
|
||||||
|
@ -274,9 +274,9 @@ _SEHTryLevel_t;
|
||||||
{ \
|
{ \
|
||||||
__SEH_END_SCOPE_CHAIN; \
|
__SEH_END_SCOPE_CHAIN; \
|
||||||
\
|
\
|
||||||
(void)_SEHScopeKind; \
|
(void)_SEH2ScopeKind; \
|
||||||
(void)_SEHFrameP; \
|
(void)_SEH2FrameP; \
|
||||||
(void)_SEHTryLevelP; \
|
(void)_SEH2TryLevelP; \
|
||||||
\
|
\
|
||||||
__SEH_NESTED_PROLOG; \
|
__SEH_NESTED_PROLOG; \
|
||||||
\
|
\
|
||||||
|
@ -299,7 +299,7 @@ _SEHTryLevel_t;
|
||||||
_SEHTryLevel.ST_FramePointer = _SEHClosureFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
|
_SEHTryLevel.ST_FramePointer = _SEHClosureFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
|
||||||
_SEHTryLevel.ST_Filter = _SEHFunctionFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
|
_SEHTryLevel.ST_Filter = _SEHFunctionFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
|
||||||
_SEHTryLevel.ST_Body = &&_SEHBeginExcept; \
|
_SEHTryLevel.ST_Body = &&_SEHBeginExcept; \
|
||||||
__SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" (_SEHFrameP->SF_StackPointer)); __SEH_BARRIER; \
|
__SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" (_SEH2FrameP->SF_StackPointer)); __SEH_BARRIER; \
|
||||||
\
|
\
|
||||||
goto _SEHDoTry; \
|
goto _SEHDoTry; \
|
||||||
\
|
\
|
||||||
|
@ -324,8 +324,8 @@ _SEHTryLevel_t;
|
||||||
_SEHBeginExcept: __SEH_SIDE_EFFECT; \
|
_SEHBeginExcept: __SEH_SIDE_EFFECT; \
|
||||||
{ \
|
{ \
|
||||||
{ \
|
{ \
|
||||||
_SEHFrame_t * const _SEHFrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
|
_SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
|
||||||
(void)_SEHFrameP; \
|
(void)_SEH2FrameP; \
|
||||||
__SEH_BARRIER;
|
__SEH_BARRIER;
|
||||||
|
|
||||||
#define _SEH2_END \
|
#define _SEH2_END \
|
||||||
|
@ -337,12 +337,12 @@ _SEHTryLevel_t;
|
||||||
__SEH_END_SCOPE;
|
__SEH_END_SCOPE;
|
||||||
|
|
||||||
#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
|
#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
|
||||||
#define _SEH2_GetExceptionCode() ((_SEHFrameP)->SF_Code)
|
#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
|
||||||
|
|
||||||
#define _SEH2_YIELD(STMT_) \
|
#define _SEH2_YIELD(STMT_) \
|
||||||
for(;;) \
|
for(;;) \
|
||||||
{ \
|
{ \
|
||||||
if(!_SEHScopeKind) \
|
if(!_SEH2ScopeKind) \
|
||||||
_SEH2Return(); \
|
_SEH2Return(); \
|
||||||
\
|
\
|
||||||
STMT_; \
|
STMT_; \
|
||||||
|
@ -357,7 +357,7 @@ extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void __cdecl _SEH2EnterFrame(_SEHFrame_t *);
|
extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
|
||||||
extern void __cdecl _SEH2LeaveFrame(void);
|
extern void __cdecl _SEH2LeaveFrame(void);
|
||||||
extern void __cdecl _SEH2Return(void);
|
extern void __cdecl _SEH2Return(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue