Skip to content

Commit

Permalink
[PSEH] Fix SEH compatibility macros for dummy PSEH
Browse files Browse the repository at this point in the history
This is used with Clang, which does have native SEH, but it's broken and can cause the compiler to crash. Previously some code was not handling this and instead used native SEH for clang. Fix this by always using _SEH2_* macros instead of relying on __USE_PSEH2__ to be defined.
  • Loading branch information
tkreuzer committed Dec 1, 2024
1 parent 7297ffe commit e102e75
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 51 deletions.
19 changes: 0 additions & 19 deletions modules/rostests/apitests/include/apitest.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#define InvalidPointer ((PVOID)0x5555555555555555ULL)
// #define InvalidPointer ((PVOID)0x0123456789ABCDEFULL)

#ifdef __USE_PSEH2__
#include <pseh/pseh2.h>

#define StartSeh() \
Expand All @@ -32,24 +31,6 @@
"Exception 0x%08lx, expected 0x%08lx\n", \
ExceptionStatus, (ExpectedStatus)); \
}
#else
#define StartSeh() \
{ \
NTSTATUS ExceptionStatus = STATUS_SUCCESS; \
__try \
{

#define EndSeh(ExpectedStatus) \
} \
__except(EXCEPTION_EXECUTE_HANDLER) \
{ \
ExceptionStatus = GetExceptionCode(); \
} \
ok(ExceptionStatus == (ExpectedStatus), \
"Exception 0x%08lx, expected 0x%08lx\n", \
ExceptionStatus, (ExpectedStatus)); \
}
#endif

#define ok_hr(status, expected) ok_hex(status, expected)
#define ok_hr_(file, line, status, expected) ok_hex_(file, line, status, expected)
Expand Down
27 changes: 8 additions & 19 deletions sdk/include/psdk/rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,25 +122,14 @@ typedef int RPC_STATUS;
#include <excpt.h>
#include <winerror.h>

#ifndef __USE_PSEH2__
#define RpcTryExcept __try {
#define RpcExcept(expr) } __except (expr) {
#define RpcEndExcept }
#define RpcTryFinally __try {
#define RpcFinally } __finally {
#define RpcEndFinally }
#define RpcExceptionCode() GetExceptionCode()
#define RpcAbnormalTermination() AbnormalTermination()
#else
#define RpcTryExcept _SEH2_TRY
#define RpcExcept(expr) _SEH2_EXCEPT((expr))
#define RpcEndExcept _SEH2_END;
#define RpcTryFinally _SEH2_TRY
#define RpcFinally _SEH2_FINALLY
#define RpcEndFinally _SEH2_END;
#define RpcExceptionCode() _SEH2_GetExceptionCode()
#define RpcAbnormalTermination() (_SEH2_GetExceptionCode() != 0)
#endif
#define RpcTryExcept _SEH2_TRY
#define RpcExcept(expr) _SEH2_EXCEPT((expr))
#define RpcEndExcept _SEH2_END;
#define RpcTryFinally _SEH2_TRY
#define RpcFinally _SEH2_FINALLY
#define RpcEndFinally _SEH2_END;
#define RpcExceptionCode() _SEH2_GetExceptionCode()
#define RpcAbnormalTermination() (_SEH2_GetExceptionCode() != 0)
#endif

#if defined(__RPC_WIN64__)
Expand Down
13 changes: 1 addition & 12 deletions sdk/include/reactos/wine/exception.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,11 @@ typedef struct _WINE_EXCEPTION_REGISTRATION_RECORD
#define PEXCEPTION_REGISTRATION_RECORD PWINE_EXCEPTION_REGISTRATION_RECORD
#endif

#ifdef __USE_PSEH2__
#define __TRY _SEH2_TRY
#define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
#define __EXCEPT_CTX(func, ctx) _SEH2_EXCEPT((func)(GetExceptionInformation(), ctx))
#define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
#define __EXCEPT_ALL _SEH2_EXCEPT(_SEH_EXECUTE_HANDLER)
#define __EXCEPT_ALL _SEH2_EXCEPT(1)
#define __ENDTRY _SEH2_END
#define __FINALLY(func) _SEH2_FINALLY { func(!_SEH2_AbnormalTermination()); }
#define __FINALLY_CTX(func, ctx) _SEH2_FINALLY { func(!_SEH2_AbnormalTermination(), ctx); }; _SEH2_END
Expand All @@ -79,16 +78,6 @@ typedef struct _WINE_EXCEPTION_REGISTRATION_RECORD
#ifndef AbnormalTermination
#define AbnormalTermination() _SEH2_AbnormalTermination()
#endif
#else
#define __TRY __try
#define __EXCEPT(func) __except(func(GetExceptionInformation()))
#define __EXCEPT_CTX(func, ctx) __except((func)(GetExceptionInformation(), ctx))
#define __EXCEPT_PAGE_FAULT __except(GetExceptionCode() == STATUS_ACCESS_VIOLATION)
#define __EXCEPT_ALL __except(1)
#define __ENDTRY
#define __FINALLY(func) __finally { func(!AbnormalTermination()); }
#define __FINALLY_CTX(func, ctx) __finally { func(!AbnormalTermination(), ctx); }
#endif

#if defined(__MINGW32__) || defined(__CYGWIN__)
#define sigjmp_buf jmp_buf
Expand Down
2 changes: 1 addition & 1 deletion sdk/include/vcruntime/excpt.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ typedef enum _EXCEPTION_DISPOSITION

#endif

#if defined(_MSC_VER) || (defined(__clang__) && defined(__SEH__))
#if (defined(_MSC_VER) || (defined(__clang__) && defined(__SEH__))) && !defined(_exception_code)
unsigned long __cdecl _exception_code(void);
void *__cdecl _exception_info(void);
int __cdecl _abnormal_termination(void);
Expand Down
8 changes: 8 additions & 0 deletions sdk/lib/pseh/include/pseh/pseh2.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ _Pragma("GCC diagnostic pop")
#define _SEH2_LEAVE goto __seh2_scope_end__;
#define _SEH2_VOLATILE volatile

#define __try _SEH2_TRY
#define __except _SEH2_EXCEPT
#define __finally _SEH2_FINALLY
#define __endtry _SEH2_END
#define __leave _SEH2_LEAVE
#define _exception_code() 0
#define _exception_info() ((void*)0)

#elif defined(_USE_PSEH3)

#include "pseh3.h"
Expand Down

0 comments on commit e102e75

Please sign in to comment.