mirror of
https://github.com/reactos/reactos
synced 2025-10-06 00:12:51 +02:00
[PSEH] Use _setjmp3 with custom unwind function
This commit is contained in:
@@ -13,8 +13,8 @@ add_executable(ftp ${SOURCE} ftp.rc)
|
|||||||
target_compile_definitions(ftp PRIVATE lint)
|
target_compile_definitions(ftp PRIVATE lint)
|
||||||
|
|
||||||
set_module_type(ftp win32cui)
|
set_module_type(ftp win32cui)
|
||||||
|
target_link_libraries(ftp oldnames ${PSEH_LIB})
|
||||||
add_importlibs(ftp ws2_32 iphlpapi msvcrt kernel32)
|
add_importlibs(ftp ws2_32 iphlpapi msvcrt kernel32)
|
||||||
target_link_libraries(ftp oldnames)
|
|
||||||
add_pch(ftp precomp.h SOURCE)
|
add_pch(ftp precomp.h SOURCE)
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
|
2
dll/3rdparty/libpng/CMakeLists.txt
vendored
2
dll/3rdparty/libpng/CMakeLists.txt
vendored
@@ -31,7 +31,7 @@ list(APPEND SOURCE
|
|||||||
|
|
||||||
add_library(libpng MODULE ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/libpng.def)
|
add_library(libpng MODULE ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/libpng.def)
|
||||||
set_module_type(libpng win32dll)
|
set_module_type(libpng win32dll)
|
||||||
target_link_libraries(libpng zlib)
|
target_link_libraries(libpng zlib ${PSEH_LIB})
|
||||||
add_importlibs(libpng msvcrt kernel32 ntdll)
|
add_importlibs(libpng msvcrt kernel32 ntdll)
|
||||||
add_pch(libpng pngpriv.h SOURCE)
|
add_pch(libpng pngpriv.h SOURCE)
|
||||||
add_cd_file(TARGET libpng DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET libpng DESTINATION reactos/system32 FOR all)
|
||||||
|
@@ -116,7 +116,7 @@ add_library(glu32 MODULE
|
|||||||
${PCH_SKIP_SOURCE}
|
${PCH_SKIP_SOURCE}
|
||||||
glu32.rc
|
glu32.rc
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/glu32.def)
|
${CMAKE_CURRENT_BINARY_DIR}/glu32.def)
|
||||||
target_link_libraries(glu32 cpprt)
|
target_link_libraries(glu32 cpprt ${PSEH_LIB})
|
||||||
|
|
||||||
set_module_type(glu32 win32dll)
|
set_module_type(glu32 win32dll)
|
||||||
|
|
||||||
|
@@ -23,9 +23,9 @@ function(add_hal _halname)
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}/hal.def)
|
${CMAKE_CURRENT_BINARY_DIR}/hal.def)
|
||||||
|
|
||||||
if(${_halname} STREQUAL "hal")
|
if(${_halname} STREQUAL "hal")
|
||||||
target_link_libraries(${_halname} libcntpr arbiter fast486)
|
target_link_libraries(${_halname} libcntpr arbiter fast486 ${PSEH_LIB})
|
||||||
else()
|
else()
|
||||||
target_link_libraries(${_halname} libcntpr fast486)
|
target_link_libraries(${_halname} libcntpr fast486 ${PSEH_LIB})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_importlibs(${_halname} ntoskrnl)
|
add_importlibs(${_halname} ntoskrnl)
|
||||||
|
@@ -447,3 +447,49 @@ _SEH3$_CPP_except_handler(
|
|||||||
{
|
{
|
||||||
return _SEH3$_common_except_handler(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext, _SEH3$_CPP_HANDLER);
|
return _SEH3$_common_except_handler(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext, _SEH3$_CPP_HANDLER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
__stdcall
|
||||||
|
_SEH3$_longjmp_unwind(_JUMP_BUFFER* _Buf)
|
||||||
|
{
|
||||||
|
PSEH3$_REGISTRATION_FRAME RegisteredFrame = (PSEH3$_REGISTRATION_FRAME)_Buf->Registration;
|
||||||
|
PSEH3$_REGISTRATION_FRAME CurrentFrame;
|
||||||
|
|
||||||
|
/* Native SEH registers the EH frame at the start of the function, so a call to
|
||||||
|
_setjmp(3) will always save that EH frame. PSEH only registers the frame
|
||||||
|
when entering a try block, so a call to _setjmp outside of a try block
|
||||||
|
would save a previously installed EH frame, which can be of a different
|
||||||
|
type (e.g. native EH3/EH4). We need to check whether the frame is ours
|
||||||
|
by comparing its address to the saved ebp value, which marks the boundary
|
||||||
|
of the stack frame for the caller of _setjmp. */
|
||||||
|
if (_Buf->Registration > _Buf->Ebp)
|
||||||
|
{
|
||||||
|
/* The registration frame is not ours, we don't need to do anything */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loop all frames for this registration */
|
||||||
|
for (CurrentFrame = RegisteredFrame->EndOfChain;
|
||||||
|
CurrentFrame->TryLevel != _Buf->TryLevel;
|
||||||
|
CurrentFrame = CurrentFrame->Next)
|
||||||
|
{
|
||||||
|
/* Check if this is a termination handler */
|
||||||
|
if (CurrentFrame->ScopeTable->Target == NULL)
|
||||||
|
{
|
||||||
|
/* Call the termination handler */
|
||||||
|
if (RegisteredFrame->Handler == _SEH3$_C_except_handler)
|
||||||
|
{
|
||||||
|
#ifdef __clang__
|
||||||
|
_SEH3$_CallFinally(CurrentFrame, _SEH3$_CLANG_HANDLER);
|
||||||
|
#else
|
||||||
|
_SEH3$_CallFinally(CurrentFrame, _SEH3$_NESTED_HANDLER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ASSERT(CurrentFrame->Handler == _SEH3$_CPP_except_handler);
|
||||||
|
_SEH3$_CallFinally(CurrentFrame, _SEH3$_CPP_HANDLER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#define _PSEH3_H_
|
#define _PSEH3_H_
|
||||||
|
|
||||||
#include <excpt.h>
|
#include <excpt.h>
|
||||||
|
#include <intrin.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -495,6 +496,14 @@ _Pragma("GCC diagnostic pop") \
|
|||||||
|
|
||||||
#define _SEH3_VOLATILE volatile
|
#define _SEH3_VOLATILE volatile
|
||||||
|
|
||||||
|
int _setjmp3(jmp_buf env, int count, ...);
|
||||||
|
void __stdcall _SEH3$_longjmp_unwind(_JUMP_BUFFER* _Buf);
|
||||||
|
|
||||||
|
#undef setjmp
|
||||||
|
#define setjmp(env) \
|
||||||
|
_setjmp3(env, 2, (const void*)_SEH3$_longjmp_unwind, _SEH3$_TryLevel)
|
||||||
|
|
||||||
|
#define _INC_SETJMPEX
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}; // extern "C"
|
}; // extern "C"
|
||||||
|
@@ -18,7 +18,7 @@ add_library(ftfd MODULE
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}/ftfd.def)
|
${CMAKE_CURRENT_BINARY_DIR}/ftfd.def)
|
||||||
|
|
||||||
set_module_type(ftfd kerneldll ENTRYPOINT FtfdEnableDriver 12)
|
set_module_type(ftfd kerneldll ENTRYPOINT FtfdEnableDriver 12)
|
||||||
target_link_libraries(ftfd freetype libcntpr)
|
target_link_libraries(ftfd freetype libcntpr ${PSEH_LIB})
|
||||||
add_pch(ftfd ftfd.h "${PCH_SKIP_SOURCE}")
|
add_pch(ftfd ftfd.h "${PCH_SKIP_SOURCE}")
|
||||||
add_importlibs(ftfd win32k)
|
add_importlibs(ftfd win32k)
|
||||||
add_dependencies(ftfd psdk)
|
add_dependencies(ftfd psdk)
|
||||||
|
Reference in New Issue
Block a user