From 11ccffea08f993aaf94aa1b2a36dd3594e5a9d43 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 16 Mar 2016 21:02:04 +0100 Subject: [PATCH] msvcrt: Add __CxxRegisterExceptionObject implementation. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- .../api-ms-win-crt-private-l1-1-0.spec | 2 +- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr70/msvcr70.spec | 2 +- dlls/msvcr71/msvcr71.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/except.c | 23 +++++++++++++++++++ dlls/msvcrt/msvcrt.h | 7 ++++++ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 2 +- dlls/vcruntime140/vcruntime140.spec | 2 +- 14 files changed, 42 insertions(+), 12 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 f26b932688c..2fa639c8403 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 @@ -22,7 +22,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) ucrtbase.__CxxFrameHandler3 @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) ucrtbase.__CxxLongjmpUnwind @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() ucrtbase.__CxxQueryExceptionSize -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) ucrtbase.__CxxRegisterExceptionObject @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 33473b8f129..cfce95662eb 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -554,7 +554,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 6299a4f9165..84b50e1c96e 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -881,7 +881,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index bb1ae344f06..29c6965c790 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -865,7 +865,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 694230f2e71..51d3ef0ef74 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -859,7 +859,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) msvcr120.__CxxFrameHandler3 @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) msvcr120.__CxxLongjmpUnwind @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() msvcr120.__CxxQueryExceptionSize -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) msvcr120.__CxxRegisterExceptionObject @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec index e1911d05094..a4e0279bee9 100644 --- a/dlls/msvcr70/msvcr70.spec +++ b/dlls/msvcr70/msvcr70.spec @@ -123,7 +123,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler(ptr ptr ptr ptr) @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ cdecl __RTCastToVoid(ptr) MSVCRT___RTCastToVoid diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec index c3ed3a418b9..31d80b2cc8f 100644 --- a/dlls/msvcr71/msvcr71.spec +++ b/dlls/msvcr71/msvcr71.spec @@ -118,7 +118,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler(ptr ptr ptr ptr) @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ cdecl __RTCastToVoid(ptr) MSVCRT___RTCastToVoid diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index ccf73571024..36d1058cf53 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -188,7 +188,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 43de82a1154..56448bc229b 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -179,7 +179,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index ec923b17244..a7ae0dae23c 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -369,3 +369,26 @@ void CDECL _FindAndUnlinkFrame(frame_info *fi) ERR("frame not found, native crashes in this case\n"); } + +/********************************************************************* + * __CxxRegisterExceptionObject (MSVCRT.@) + */ +BOOL CDECL __CxxRegisterExceptionObject(EXCEPTION_RECORD **rec, cxx_frame_info *frame_info) +{ + thread_data_t *data = msvcrt_get_thread_data(); + + TRACE("(%p, %p)\n", rec, frame_info); + + if (!rec || !*rec) + { + frame_info->rec = (void*)-1; + frame_info->unk = (void*)-1; + return TRUE; + } + + frame_info->rec = data->exc_record; + frame_info->unk = 0; + data->exc_record = *rec; + _CreateFrameInfo(&frame_info->frame_info, (void*)(*rec)->ExceptionInformation[1]); + return TRUE; +} diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 64a7ab97d03..d0893fd13c9 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -210,6 +210,13 @@ typedef struct _frame_info struct _frame_info *next; } frame_info; +typedef struct +{ + frame_info frame_info; + EXCEPTION_RECORD *rec; + void *unk; +} cxx_frame_info; + /* TLS data */ extern DWORD msvcrt_tls_index DECLSPEC_HIDDEN; diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 67b5c8c2673..a96ac352045 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -184,7 +184,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -# stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) # stub __CxxUnregisterExceptionObject # stub __DestructExceptionObject @ cdecl __RTCastToVoid(ptr) MSVCRT___RTCastToVoid diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 44b62a71771..d286bf3c1c7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -56,7 +56,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) __CxxFrameHandler @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter diff --git a/dlls/vcruntime140/vcruntime140.spec b/dlls/vcruntime140/vcruntime140.spec index ea58694abc2..2ba8f1e2aac 100644 --- a/dlls/vcruntime140/vcruntime140.spec +++ b/dlls/vcruntime140/vcruntime140.spec @@ -19,7 +19,7 @@ @ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) ucrtbase.__CxxFrameHandler3 @ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) ucrtbase.__CxxLongjmpUnwind @ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() ucrtbase.__CxxQueryExceptionSize -@ stub __CxxRegisterExceptionObject +@ cdecl __CxxRegisterExceptionObject(ptr ptr) ucrtbase.__CxxRegisterExceptionObject @ stub __CxxUnregisterExceptionObject @ stub __DestructExceptionObject @ stub __FrameUnwindFilter