diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index c2151f78c63..2633b988b62 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -2580,8 +2580,8 @@ static RUNTIME_FUNCTION *lookup_function_info( ULONG64 pc, ULONG64 *base, LDR_MO return func; } -static DWORD nested_exception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) +static DWORD __cdecl nested_exception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) return ExceptionContinueSearch; @@ -3936,8 +3936,8 @@ struct unwind_exception_frame * * Handler for exceptions happening while calling an unwind handler. */ -static DWORD unwind_exception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) +static DWORD __cdecl unwind_exception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { struct unwind_exception_frame *unwind_frame = (struct unwind_exception_frame *)frame; DISPATCHER_CONTEXT *dispatch = (DISPATCHER_CONTEXT *)dispatcher; diff --git a/dlls/winecrt0/exception.c b/dlls/winecrt0/exception.c index 91f37180135..2e74aec8bdd 100644 --- a/dlls/winecrt0/exception.c +++ b/dlls/winecrt0/exception.c @@ -86,10 +86,10 @@ static void DECLSPEC_NORETURN unwind_frame( EXCEPTION_RECORD *record, __wine_rtl_unwind( frame, record, unwind_target ); } -DWORD __wine_exception_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_exception_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { __WINE_FRAME *wine_frame = (__WINE_FRAME *)frame; EXCEPTION_POINTERS ptrs; @@ -111,10 +111,10 @@ DWORD __wine_exception_handler( EXCEPTION_RECORD *record, unwind_frame( record, frame ); } -DWORD __wine_exception_ctx_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_exception_ctx_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { __WINE_FRAME *wine_frame = (__WINE_FRAME *)frame; EXCEPTION_POINTERS ptrs; @@ -136,10 +136,10 @@ DWORD __wine_exception_ctx_handler( EXCEPTION_RECORD *record, unwind_frame( record, frame ); } -DWORD __wine_exception_handler_page_fault( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_exception_handler_page_fault( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND | EH_NESTED_CALL)) return ExceptionContinueSearch; @@ -148,20 +148,20 @@ DWORD __wine_exception_handler_page_fault( EXCEPTION_RECORD *record, unwind_frame( record, frame ); } -DWORD __wine_exception_handler_all( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_exception_handler_all( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND | EH_NESTED_CALL)) return ExceptionContinueSearch; unwind_frame( record, frame ); } -DWORD __wine_finally_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_finally_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) { @@ -171,10 +171,10 @@ DWORD __wine_finally_handler( EXCEPTION_RECORD *record, return ExceptionContinueSearch; } -DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) +DWORD __cdecl __wine_finally_ctx_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) { diff --git a/include/wine/exception.h b/include/wine/exception.h index f4e91663149..7668eb51a63 100644 --- a/include/wine/exception.h +++ b/include/wine/exception.h @@ -94,36 +94,41 @@ extern "C" { #if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__WINE_SETJMP_H) #define sigjmp_buf jmp_buf -static inline int sigsetjmp( sigjmp_buf buf, int sigs ) { return setjmp( buf ); } static inline void siglongjmp( sigjmp_buf buf, int val ) { longjmp( buf, val ); } +# ifdef _WIN64 +int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) _setjmpex(jmp_buf,void*); +# define sigsetjmp(buf,sigs) _setjmpex(buf,CONTAINING_RECORD(buf,__WINE_FRAME,jmp)) +# else +# define sigsetjmp(buf,sigs) setjmp(buf) +# endif #endif extern void __cdecl __wine_rtl_unwind( EXCEPTION_REGISTRATION_RECORD* frame, EXCEPTION_RECORD *record, void (*target)(void) ) DECLSPEC_HIDDEN DECLSPEC_NORETURN; -extern DWORD __wine_exception_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; -extern DWORD __wine_exception_ctx_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; -extern DWORD __wine_exception_handler_page_fault( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; -extern DWORD __wine_exception_handler_all( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; -extern DWORD __wine_finally_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; -extern DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record, - EXCEPTION_REGISTRATION_RECORD *frame, - CONTEXT *context, - EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_exception_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_exception_ctx_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_exception_handler_page_fault( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_exception_handler_all( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_finally_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; +extern DWORD __cdecl __wine_finally_ctx_handler( EXCEPTION_RECORD *record, + EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, + EXCEPTION_REGISTRATION_RECORD **pdispatcher ) DECLSPEC_HIDDEN; #define __TRY \ do { __WINE_FRAME __f; \ diff --git a/include/winnt.h b/include/winnt.h index b8ddb12e972..310a6254cda 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -2467,8 +2467,8 @@ typedef struct _EXCEPTION_POINTERS struct _EXCEPTION_REGISTRATION_RECORD; -typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct _EXCEPTION_REGISTRATION_RECORD*, - PCONTEXT,struct _EXCEPTION_REGISTRATION_RECORD **); +typedef DWORD (CDECL *PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct _EXCEPTION_REGISTRATION_RECORD*, + PCONTEXT,struct _EXCEPTION_REGISTRATION_RECORD **); typedef struct _EXCEPTION_REGISTRATION_RECORD { diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index d47bee76167..f320f57789a 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -5064,10 +5064,10 @@ void write_exceptions( FILE *file ) fprintf( file, " siglongjmp( exc_frame->jmp, 1 );\n"); fprintf( file, "}\n"); fprintf( file, "\n"); - fprintf( file, "static DWORD __widl_exception_handler( EXCEPTION_RECORD *record,\n"); - fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n"); - fprintf( file, " CONTEXT *context,\n"); - fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n"); + fprintf( file, "static DWORD __cdecl __widl_exception_handler( EXCEPTION_RECORD *record,\n"); + fprintf( file, " EXCEPTION_REGISTRATION_RECORD *frame,\n"); + fprintf( file, " CONTEXT *context,\n"); + fprintf( file, " EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n"); fprintf( file, "{\n"); fprintf( file, " struct __exception_frame *exc_frame = (struct __exception_frame *)frame;\n"); fprintf( file, "\n");