[PATCH v2 2/4] msvcrt: Add _crt_at_quick_exit stub

Fabian Maurer dark.shadow4 at web.de
Wed Jul 4 15:27:56 CDT 2018


Fixes bug 45295.

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 .../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




More information about the wine-devel mailing list