From 9999c59c486b2e6d724a95a63fcfbfc1ce46df9a Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 20 Mar 2018 15:36:48 +0100 Subject: [PATCH] ucrtbase: Add __processing_throw implementation. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- .../api-ms-win-crt-private-l1-1-0.spec | 2 +- dlls/msvcrt/except.c | 9 +++++++++ dlls/msvcrt/except_i386.c | 6 ++++-- dlls/msvcrt/except_x86_64.c | 4 ++++ dlls/msvcrt/msvcrt.h | 1 + dlls/ucrtbase/ucrtbase.spec | 2 +- dlls/vcruntime140/vcruntime140.spec | 2 +- 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec index af23f8dceec..9ddb5dde740 100644 --- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec +++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec @@ -40,7 +40,7 @@ @ stub __intrinsic_abnormal_termination @ cdecl -arch=i386,x86_64,arm,arm64 -norelay __intrinsic_setjmp(ptr) ucrtbase.__intrinsic_setjmp @ cdecl -arch=x86_64,arm64 -norelay __intrinsic_setjmpex(ptr ptr) ucrtbase.__intrinsic_setjmpex -@ stub __processing_throw +@ cdecl __processing_throw() ucrtbase.__processing_throw @ stub __report_gsfailure @ cdecl __std_exception_copy(ptr ptr) ucrtbase.__std_exception_copy @ cdecl __std_exception_destroy(ptr) ucrtbase.__std_exception_destroy diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index 286c82fc23e..b99c98b4a0e 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -528,4 +528,13 @@ void** CDECL __current_exception_context(void) return (void**)&msvcrt_get_thread_data()->ctx_record; } +/********************************************************************* + * __processing_throw (UCRTBASE.@) + */ +int* CDECL __processing_throw(void) +{ + TRACE("()\n"); + return &msvcrt_get_thread_data()->processing_throw; +} + #endif /* _MSVCR_VER>=140 */ diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c index 09dec65b714..512130197ab 100644 --- a/dlls/msvcrt/except_i386.c +++ b/dlls/msvcrt/except_i386.c @@ -412,8 +412,9 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context, struct catch_func_nested_frame nested_frame; int trylevel = frame->trylevel; DWORD save_esp = ((DWORD*)frame)[-1]; - thread_data_t *data; + thread_data_t *data = msvcrt_get_thread_data(); + data->processing_throw++; for (i = 0; i < descr->tryblock_count; i++) { const tryblock_info *tryblock = &descr->tryblock[i]; @@ -456,11 +457,11 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context, cxx_local_unwind( frame, descr, tryblock->start_level ); frame->trylevel = tryblock->end_level + 1; - data = msvcrt_get_thread_data(); nested_frame.frame_info.rec = data->exc_record; nested_frame.frame_info.context = data->ctx_record; data->exc_record = rec; data->ctx_record = context; + data->processing_throw--; /* call the catch block */ TRACE( "calling catch block %p addr %p ebp %p\n", @@ -483,6 +484,7 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context, continue_after_catch( frame, addr ); } } + data->processing_throw--; } /********************************************************************* diff --git a/dlls/msvcrt/except_x86_64.c b/dlls/msvcrt/except_x86_64.c index 7859a63f6a8..77c519dc500 100644 --- a/dlls/msvcrt/except_x86_64.c +++ b/dlls/msvcrt/except_x86_64.c @@ -363,6 +363,7 @@ static void* WINAPI call_catch_block(EXCEPTION_RECORD *rec) ctx.rethrow = FALSE; __CxxRegisterExceptionObject(&ep, &ctx.frame_info); + msvcrt_get_thread_data()->processing_throw--; __TRY { __TRY @@ -410,12 +411,14 @@ static inline void find_catch_block(EXCEPTION_RECORD *rec, CONTEXT *context, ULONG64 exc_base = (rec->NumberParameters == 4 ? rec->ExceptionInformation[3] : 0); int trylevel = ip_to_state(rva_to_ptr(descr->ipmap, dispatch->ImageBase), descr->ipmap_count, dispatch->ControlPc-dispatch->ImageBase); + thread_data_t *data = msvcrt_get_thread_data(); const tryblock_info *in_catch; EXCEPTION_RECORD catch_record; CONTEXT ctx; UINT i, j; INT *unwind_help; + data->processing_throw++; for (i=descr->tryblock_count; i>0; i--) { in_catch = rva_to_ptr(descr->tryblock, dispatch->ImageBase); @@ -494,6 +497,7 @@ static inline void find_catch_block(EXCEPTION_RECORD *rec, CONTEXT *context, } TRACE("no matching catch block found\n"); + data->processing_throw--; } static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c) diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 7c489174d33..6b0f425b771 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -260,6 +260,7 @@ struct __thread_data { int unk7; EXCEPTION_RECORD *exc_record; CONTEXT *ctx_record; + int processing_throw; frame_info *frame_info_head; void *unk8[6]; LCID cached_lcid; diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 2d4f798058d..ff33d86a502 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -135,7 +135,7 @@ @ cdecl __p__wenviron() MSVCRT___p__wenviron @ cdecl __p__wpgmptr() MSVCRT___p__wpgmptr @ cdecl __pctype_func() MSVCRT___pctype_func -@ stub __processing_throw +@ cdecl __processing_throw() @ stub __pwctype_func @ cdecl __pxcptinfoptrs() MSVCRT___pxcptinfoptrs @ stub __report_gsfailure diff --git a/dlls/vcruntime140/vcruntime140.spec b/dlls/vcruntime140/vcruntime140.spec index 252113c8aee..d304de6ff1c 100644 --- a/dlls/vcruntime140/vcruntime140.spec +++ b/dlls/vcruntime140/vcruntime140.spec @@ -34,7 +34,7 @@ @ cdecl __current_exception_context() ucrtbase.__current_exception_context @ cdecl -arch=i386,x86_64,arm,arm64 -norelay __intrinsic_setjmp(ptr) ucrtbase.__intrinsic_setjmp @ cdecl -arch=x86_64,arm64 -norelay __intrinsic_setjmpex(ptr ptr) ucrtbase.__intrinsic_setjmpex -@ stub __processing_throw +@ cdecl __processing_throw() ucrtbase.__processing_throw @ stub __report_gsfailure @ cdecl __std_exception_copy(ptr ptr) ucrtbase.__std_exception_copy @ cdecl __std_exception_destroy(ptr) ucrtbase.__std_exception_destroy -- 2.11.4.GIT