DEALINGS IN THE SOFTWARE.
*/
+#define _NTSYSTEM_
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
} \
}
#else
-#error Unsupported platform.
+#define _SEH_TRACE_CONTEXT(FRAME_, CONTEXT_)
#endif
#define _SEH_TRACE_UNWIND(FRAME_, ARGS_) \
{ \
if((FRAME_)->SPF_Tracing & _SEH_DO_TRACE_TRYLEVEL) \
{ \
- _SEH_TRACE_LINE_((FRAME_), ("trylevel %p, filter %p", (TRYLEVEL_), (TRYLEVEL_)->SPT_Handlers->SH_Filter)); \
+ _SEH_TRACE_LINE_((FRAME_), ("trylevel %p, filter %p", (TRYLEVEL_), (TRYLEVEL_)->SPT_Handlers.SH_Filter)); \
} \
}
( \
"trylevel %p, calling filter %p, ExceptionCode %08X", \
(TRYLEVEL_), \
- (TRYLEVEL_)->SPT_Handlers->SH_Filter, \
+ (TRYLEVEL_)->SPT_Handlers.SH_Filter, \
(ER_)->ExceptionCode \
) \
); \
( \
"trylevel %p, filter %p => %s", \
(TRYLEVEL_), \
- (TRYLEVEL_)->SPT_Handlers->SH_Filter, \
+ (TRYLEVEL_)->SPT_Handlers.SH_Filter, \
_SEH_FILTER_RET_STRING_(RET_) \
) \
); \
( \
"trylevel %p, calling exit routine %p", \
(TRYLEVEL_), \
- (TRYLEVEL_)->SPT_Handlers->SH_Finally \
+ (TRYLEVEL_)->SPT_Handlers.SH_Finally \
) \
); \
} \
( \
"trylevel %p, exit routine %p returned", \
(TRYLEVEL_), \
- (TRYLEVEL_)->SPT_Handlers->SH_Finally \
+ (TRYLEVEL_)->SPT_Handlers.SH_Finally \
) \
); \
} \
extern _SEHRegistration_t * __cdecl _SEHCurrentRegistration(void);
/* Borland C++ uses a different decoration (i.e. none) for stdcall functions */
-extern void __stdcall RtlUnwind(void *, void *, void *, void *);
+extern void __stdcall RtlUnwind(void *, void *, PEXCEPTION_RECORD, void *);
void const * _SEHRtlUnwind = RtlUnwind;
static void __stdcall _SEHLocalUnwind
/* ASSERT(trylevel); */
- pfnFinally = trylevel->SPT_Handlers->SH_Finally;
+ pfnFinally = trylevel->SPT_Handlers.SH_Finally;
if(pfnFinally)
{
trylevel = trylevel->SPT_Next
)
{
- _SEHFilter_t pfnFilter = trylevel->SPT_Handlers->SH_Filter;
+ _SEHFilter_t pfnFilter = trylevel->SPT_Handlers.SH_Filter;
_SEH_TRACE_TRYLEVEL(frame, trylevel);
default:
{
- if(trylevel->SPT_Handlers->SH_Filter)
+ if(trylevel->SPT_Handlers.SH_Filter)
{
EXCEPTION_POINTERS ep;
return ExceptionContinueSearch;
}
-void __stdcall _SEHEnterFrame_s
-(
- _SEHPortableFrame_t * frame,
- _SEHPortableTryLevel_t * trylevel
-)
+void __stdcall _SEHEnterFrame_s(_SEHPortableFrame_t * frame)
{
- _SEHEnterFrame_f(frame, trylevel);
+ _SEHEnterFrame_f(frame);
}
-void __stdcall _SEHEnterTry_s(_SEHPortableTryLevel_t * trylevel)
+void __stdcall _SEHLeaveFrame_s(void)
{
- _SEHEnterTry_f(trylevel);
+ _SEHLeaveFrame_f();
}
-void __stdcall _SEHLeave_s(void)
+void __stdcall _SEHReturn_s(void)
{
- _SEHLeave_f();
+ _SEHReturn_f();
}
-void _SEH_FASTCALL _SEHEnterFrame_f
-(
- _SEHPortableFrame_t * frame,
- _SEHPortableTryLevel_t * trylevel
-)
+void _SEH_FASTCALL _SEHEnterFrame_f(_SEHPortableFrame_t * frame)
{
/* ASSERT(frame); */
/* ASSERT(trylevel); */
frame->SPF_Registration.SER_Handler = _SEHFrameHandler;
frame->SPF_Code = 0;
- frame->SPF_TopTryLevel = trylevel;
- trylevel->SPT_Next = NULL;
_SEHRegisterFrame(&frame->SPF_Registration);
}
-void _SEH_FASTCALL _SEHEnterTry_f(_SEHPortableTryLevel_t * trylevel)
+void _SEH_FASTCALL _SEHLeaveFrame_f(void)
{
_SEHPortableFrame_t * frame;
SPF_Registration
);
- trylevel->SPT_Next = frame->SPF_TopTryLevel;
- frame->SPF_TopTryLevel = trylevel;
+ /* ASSERT(frame); */
+ /* ASSERT(frame->SPF_TopTryLevel == NULL) */
+
+ _SEHUnregisterFrame();
}
-void _SEH_FASTCALL _SEHLeave_f(void)
+void _SEH_FASTCALL _SEHReturn_f(void)
{
_SEHPortableFrame_t * frame;
- _SEHPortableTryLevel_t * trylevel;
frame = _SEH_CONTAINING_RECORD
(
SPF_Registration
);
- /* ASSERT(frame); */
-
- trylevel = frame->SPF_TopTryLevel;
-
- /* ASSERT(trylevel); */
-
- if(trylevel->SPT_Next)
- frame->SPF_TopTryLevel = trylevel->SPT_Next;
- else
- _SEHUnregisterFrame();
+ _SEHLocalUnwind(frame, NULL);
+ _SEHUnregisterFrame();
}
/* EOF */