Module: wine Branch: master Commit: 11ccffea08f993aaf94aa1b2a36dd3594e5a9d43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=11ccffea08f993aaf94aa1b2a3... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Wed Mar 16 21:02:04 2016 +0100 msvcrt: Add __CxxRegisterExceptionObject implementation. Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- .../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 f26b932..2fa639c 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 33473b8..cfce956 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 6299a4f..84b50e1 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 bb1ae34..29c6965 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 694230f..51d3ef0 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 e1911d0..a4e0279 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 c3ed3a4..31d80b2 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 ccf7357..36d1058 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 43de82a..56448bc 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 ec923b1..a7ae0da 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 64a7ab9..d0893fd 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 67b5c8c..a96ac35 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 44b62a7..d286bf3 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 ea58694..2ba8f1e 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