- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / pseh / framebased.c
index adc2e37..121cb90 100644 (file)
@@ -20,6 +20,7 @@
        DEALINGS IN THE SOFTWARE.
 */
 
+#define _NTSYSTEM_
 #define STRICT
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
@@ -149,7 +150,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
        } \
 }
 #else
-#error Unsupported platform.
+#define _SEH_TRACE_CONTEXT(FRAME_, CONTEXT_)
 #endif
 
 #define _SEH_TRACE_UNWIND(FRAME_, ARGS_) \
@@ -164,7 +165,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
 { \
        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)); \
        } \
 }
 
@@ -178,7 +179,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
                        ( \
                                "trylevel %p, calling filter %p, ExceptionCode %08X", \
                                (TRYLEVEL_), \
-                               (TRYLEVEL_)->SPT_Handlers->SH_Filter, \
+                               (TRYLEVEL_)->SPT_Handlers.SH_Filter, \
                                (ER_)->ExceptionCode \
                        ) \
                ); \
@@ -195,7 +196,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
                        ( \
                                "trylevel %p, filter %p => %s", \
                                (TRYLEVEL_), \
-                               (TRYLEVEL_)->SPT_Handlers->SH_Filter, \
+                               (TRYLEVEL_)->SPT_Handlers.SH_Filter, \
                                _SEH_FILTER_RET_STRING_(RET_) \
                        ) \
                ); \
@@ -236,7 +237,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
                        ( \
                                "trylevel %p, calling exit routine %p", \
                                (TRYLEVEL_), \
-                               (TRYLEVEL_)->SPT_Handlers->SH_Finally \
+                               (TRYLEVEL_)->SPT_Handlers.SH_Finally \
                        ) \
                ); \
        } \
@@ -252,7 +253,7 @@ extern unsigned long __cdecl DbgPrint(const char * format, ...);
                        ( \
                                "trylevel %p, exit routine %p returned", \
                                (TRYLEVEL_), \
-                               (TRYLEVEL_)->SPT_Handlers->SH_Finally \
+                               (TRYLEVEL_)->SPT_Handlers.SH_Finally \
                        ) \
                ); \
        } \
@@ -281,7 +282,7 @@ extern void __cdecl _SEHGlobalUnwind(_SEHPortableFrame_t *);
 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
@@ -305,7 +306,7 @@ static void __stdcall _SEHLocalUnwind
 
                /* ASSERT(trylevel); */
 
-               pfnFinally = trylevel->SPT_Handlers->SH_Finally;
+               pfnFinally = trylevel->SPT_Handlers.SH_Finally;
 
                if(pfnFinally)
                {
@@ -386,7 +387,7 @@ static int __cdecl _SEHFrameHandler
                        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);
 
@@ -402,7 +403,7 @@ static int __cdecl _SEHFrameHandler
 
                                default:
                                {
-                                       if(trylevel->SPT_Handlers->SH_Filter)
+                                       if(trylevel->SPT_Handlers.SH_Filter)
                                        {
                                                EXCEPTION_POINTERS ep;
 
@@ -443,41 +444,31 @@ static int __cdecl _SEHFrameHandler
        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;
 
@@ -488,14 +479,15 @@ void _SEH_FASTCALL _SEHEnterTry_f(_SEHPortableTryLevel_t * trylevel)
                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
        (
@@ -504,16 +496,8 @@ void _SEH_FASTCALL _SEHLeave_f(void)
                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 */