From: Fabian Maurer Subject: [PATCH v2 2/4] msvcrt: Add _crt_at_quick_exit stub Message-Id: <20180704202758.26877-2-dark.shadow4@web.de> Date: Wed, 4 Jul 2018 22:27:56 +0200 In-Reply-To: <20180704202758.26877-1-dark.shadow4@web.de> References: <20180704202758.26877-1-dark.shadow4@web.de> Fixes bug 45295. Signed-off-by: Fabian Maurer --- .../api-ms-win-crt-runtime-l1-1-0.spec | 2 +- dlls/msvcr120/tests/msvcr120.c | 8 ++++++++ dlls/msvcrt/exit.c | 9 +++++++++ dlls/ucrtbase/tests/misc.c | 8 ++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec index 24014a65bac..4bc8df768d1 100644 --- a/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec +++ b/dlls/api-ms-win-crt-runtime-l1-1-0/api-ms-win-crt-runtime-l1-1-0.spec @@ -28,7 +28,7 @@ @ cdecl _control87(long long) ucrtbase._control87 @ cdecl _controlfp(long long) ucrtbase._controlfp @ cdecl _controlfp_s(ptr long long) ucrtbase._controlfp_s -@ stub _crt_at_quick_exit +@ cdecl _crt_at_quick_exit(ptr) ucrtbase._crt_at_quick_exit @ cdecl _crt_atexit(ptr) ucrtbase._crt_atexit @ cdecl _crt_debugger_hook(long) ucrtbase._crt_debugger_hook @ cdecl _endthread() ucrtbase._endthread diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 85e83a6c65a..a816ad6e7c5 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -184,6 +184,7 @@ static _locale_t (__cdecl *p_wcreate_locale)(int, const wchar_t *); static void (__cdecl *p_free_locale)(_locale_t); static unsigned short (__cdecl *p_wctype)(const char*); static int (__cdecl *p_vsscanf)(const char*, const char *, __ms_va_list valist); +static int (__cdecl *p_crt_at_quick_exit)(void (__cdecl *func)(void)); /* make sure we use the correct errno */ #undef errno @@ -238,6 +239,7 @@ static BOOL init(void) p_errno = (void*)GetProcAddress(module, "_errno"); p_wcreate_locale = (void*)GetProcAddress(module, "_wcreate_locale"); p_free_locale = (void*)GetProcAddress(module, "_free_locale"); + p_crt_at_quick_exit = (void*)GetProcAddress(module, "_crt_at_quick_exit"); SET(p_wctype, "wctype"); SET(p_fegetenv, "fegetenv"); SET(p__clearfp, "_clearfp"); @@ -935,6 +937,11 @@ static void test_vsscanf(void) ok(v == 10, "got %d.\n", v); } +static void test_quick_exit(void) +{ + ok(p_crt_at_quick_exit == NULL, "_crt_at_quick_exit should not exist in this version\n"); +} + START_TEST(msvcr120) { if (!init()) return; @@ -953,4 +960,5 @@ START_TEST(msvcr120) test__Condition_variable(); test_wctype(); test_vsscanf(); + test_quick_exit(); } diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c index 77743d5b01f..3cce64dc75b 100644 --- a/dlls/msvcrt/exit.c +++ b/dlls/msvcrt/exit.c @@ -405,6 +405,15 @@ int CDECL MSVCRT_atexit(void (__cdecl *func)(void)) #if _MSVCR_VER>=140 +/********************************************************************* + * _crt_at_quick_exit (UCRTBASE.@) + */ +int CDECL MSVCRT__crt_at_quick_exit(void (__cdecl *func)(void)) +{ + FIXME("stub: (%p)\n", func); + return -1; +} + /********************************************************************* * _crt_atexit (UCRTBASE.@) */ diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c index 1c56f731335..14b05ffc137 100644 --- a/dlls/ucrtbase/tests/misc.c +++ b/dlls/ucrtbase/tests/misc.c @@ -127,6 +127,7 @@ static int* (CDECL *p_errno)(void); static char* (CDECL *p_asctime)(const struct tm *); static void (CDECL *p_exit)(int); static int (CDECL *p__crt_atexit)(void (CDECL*)(void)); +static int (__cdecl *p_crt_at_quick_exit)(void (__cdecl *func)(void)); static void test__initialize_onexit_table(void) { @@ -433,6 +434,7 @@ static BOOL init(void) p_asctime = (void*)GetProcAddress(module, "asctime"); p__crt_atexit = (void*)GetProcAddress(module, "_crt_atexit"); p_exit = (void*)GetProcAddress(module, "exit"); + p_crt_at_quick_exit = (void*)GetProcAddress(module, "_crt_at_quick_exit"); return TRUE; } @@ -815,6 +817,11 @@ static void test_call_exit(void) p_exit(0); } +static void test_quick_exit(void) +{ + ok(p_crt_at_quick_exit != NULL, "_crt_at_quick_exit should exist in this version\n"); +} + START_TEST(misc) { int arg_c; @@ -845,4 +852,5 @@ START_TEST(misc) test_math_errors(); test_asctime(); test_exit(arg_v[0]); + test_quick_exit(); } diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 236b0d526d7..3cb355506a2 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -240,7 +240,7 @@ @ cdecl _cputws(wstr) @ cdecl _creat(str long) MSVCRT__creat @ cdecl _create_locale(long str) MSVCRT__create_locale -@ stub _crt_at_quick_exit +@ cdecl _crt_at_quick_exit(ptr) MSVCRT__crt_at_quick_exit @ cdecl _crt_atexit(ptr) MSVCRT__crt_atexit @ cdecl _crt_debugger_hook(long) MSVCRT__crt_debugger_hook @ cdecl _ctime32(ptr) MSVCRT__ctime32 -- 2.18.0