2 #define WIN32_LEAN_AND_MEAN
5 #include <pseh/framebased/internal.h>
8 /* Assembly helpers, see i386/framebased.asm */
9 extern void __cdecl
_SEHCleanHandlerEnvironment(void);
10 extern void __cdecl
_SEHRegisterFrame(_SEHRegistration_t
*);
11 extern void __cdecl
_SEHUnregisterFrame(const _SEHRegistration_t
*);
12 extern void __cdecl
_SEHUnwind(_SEHPortableFrame_t
*);
14 __declspec(noreturn
) void __cdecl
_SEHCallHandler(_SEHPortableFrame_t
* frame
)
16 frame
->SPF_Handling
= 1;
18 frame
->SPF_Handlers
->SH_Handler(frame
);
21 int __cdecl _SEHFrameHandler
23 struct _EXCEPTION_RECORD
* ExceptionRecord
,
24 void * EstablisherFrame
,
25 struct _CONTEXT
* ContextRecord
,
26 void * DispatcherContext
29 _SEHPortableFrame_t
* frame
;
31 _SEHCleanHandlerEnvironment();
33 frame
= EstablisherFrame
;
36 if(ExceptionRecord
->ExceptionFlags
& (4 | 2))
38 if(frame
->SPF_Handlers
->SH_Finally
&& !frame
->SPF_Handling
)
39 frame
->SPF_Handlers
->SH_Finally(frame
);
44 if(ExceptionRecord
->ExceptionCode
)
45 frame
->SPF_Code
= ExceptionRecord
->ExceptionCode
;
47 frame
->SPF_Code
= 0xC0000001;
49 if(frame
->SPF_Handlers
->SH_Filter
)
53 switch((UINT_PTR
)frame
->SPF_Handlers
->SH_Filter
)
55 case EXCEPTION_EXECUTE_HANDLER
+ 1:
56 case EXCEPTION_CONTINUE_SEARCH
+ 1:
57 case EXCEPTION_CONTINUE_EXECUTION
+ 1:
59 ret
= (int)((UINT_PTR
)frame
->SPF_Handlers
->SH_Filter
) - 1;
65 EXCEPTION_POINTERS ep
;
67 ep
.ExceptionRecord
= ExceptionRecord
;
68 ep
.ContextRecord
= ContextRecord
;
70 ret
= frame
->SPF_Handlers
->SH_Filter(&ep
, frame
);
75 /* EXCEPTION_CONTINUE_EXECUTION */
77 return ExceptionContinueExecution
;
78 /* EXCEPTION_EXECUTE_HANDLER */
80 _SEHCallHandler(frame
);
81 /* EXCEPTION_CONTINUE_SEARCH */
87 return ExceptionContinueSearch
;
90 void __stdcall
_SEHEnter(_SEHPortableFrame_t
* frame
)
92 frame
->SPF_Registration
.SER_Handler
= _SEHFrameHandler
;
94 frame
->SPF_Handling
= 0;
95 _SEHRegisterFrame(&frame
->SPF_Registration
);
98 void __stdcall
_SEHLeave(_SEHPortableFrame_t
* frame
)
100 _SEHUnregisterFrame(&frame
->SPF_Registration
);