[PATCH] msvcrt: Implement _(get|set)_thread_local_invalid_parameter_handler.

Alex Henrie alexhenrie24 at gmail.com
Tue Jun 7 17:20:33 CDT 2016


Cc: Piotr Caban <piotr at codeweavers.com>
Cc: Austin English <austinenglish at gmail.com>

For https://bugs.winehq.org/show_bug.cgi?id=40745

Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
 .../api-ms-win-crt-runtime-l1-1-0.spec             |  4 ++--
 dlls/msvcrt/errno.c                                | 24 ++++++++++++++++++++++
 dlls/ucrtbase/ucrtbase.spec                        |  4 ++--
 3 files changed, 28 insertions(+), 4 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 e138bf6..9864c6c 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
@@ -46,7 +46,7 @@
 @ stub _get_narrow_winmain_command_line
 @ cdecl _get_pgmptr(ptr) ucrtbase._get_pgmptr
 @ cdecl _get_terminate() ucrtbase._get_terminate
-@ stub _get_thread_local_invalid_parameter_handler
+@ cdecl _get_thread_local_invalid_parameter_handler() ucrtbase._get_thread_local_invalid_parameter_handler
 @ stub _get_wide_winmain_command_line
 @ cdecl _get_wpgmptr(ptr) ucrtbase._get_wpgmptr
 @ cdecl _getdllprocaddr(long str long) ucrtbase._getdllprocaddr
@@ -73,7 +73,7 @@
 @ cdecl _set_error_mode(long) ucrtbase._set_error_mode
 @ cdecl _set_invalid_parameter_handler(ptr) ucrtbase._set_invalid_parameter_handler
 @ cdecl _set_new_handler(ptr) ucrtbase._set_new_handler
-@ stub _set_thread_local_invalid_parameter_handler
+@ cdecl _set_thread_local_invalid_parameter_handler(ptr) ucrtbase._set_thread_local_invalid_parameter_handler
 @ cdecl _seterrormode(long) ucrtbase._seterrormode
 @ cdecl _sleep(long) ucrtbase._sleep
 @ cdecl _statusfp() ucrtbase._statusfp
diff --git a/dlls/msvcrt/errno.c b/dlls/msvcrt/errno.c
index 6c1a912..840230e 100644
--- a/dlls/msvcrt/errno.c
+++ b/dlls/msvcrt/errno.c
@@ -126,6 +126,7 @@ char *MSVCRT__sys_errlist[] =
 unsigned int MSVCRT__sys_nerr = sizeof(MSVCRT__sys_errlist)/sizeof(MSVCRT__sys_errlist[0]) - 1;
 
 static MSVCRT_invalid_parameter_handler invalid_parameter_handler = NULL;
+static MSVCRT_invalid_parameter_handler thread_local_invalid_parameter_handler = NULL;
 
 /* INTERNAL: Set the crt and dos errno's from the OS error given. */
 void msvcrt_set_errno(int err)
@@ -473,3 +474,26 @@ MSVCRT_invalid_parameter_handler CDECL _set_invalid_parameter_handler(
     invalid_parameter_handler = handler;
     return old;
 }
+
+/*********************************************************************
+ * _get_invalid_parameter_handler (UCRTBASE.@)
+ */
+MSVCRT_invalid_parameter_handler CDECL _get_thread_local_invalid_parameter_handler(void)
+{
+    TRACE("\n");
+    return thread_local_invalid_parameter_handler;
+}
+
+/*********************************************************************
+ * _set_invalid_parameter_handler (UCRTBASE.@)
+ */
+MSVCRT_invalid_parameter_handler CDECL _set_thread_local_invalid_parameter_handler(
+        MSVCRT_invalid_parameter_handler handler)
+{
+    MSVCRT_invalid_parameter_handler old = thread_local_invalid_parameter_handler;
+
+    TRACE("(%p)\n", handler);
+
+    thread_local_invalid_parameter_handler = handler;
+    return old;
+}
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index bda6d3d..9d65d3c 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -375,7 +375,7 @@
 @ stub _get_purecall_handler
 @ cdecl _get_stream_buffer_pointers(ptr ptr ptr ptr) MSVCRT__get_stream_buffer_pointers
 @ cdecl _get_terminate() MSVCRT__get_terminate
-@ stub _get_thread_local_invalid_parameter_handler
+@ cdecl _get_thread_local_invalid_parameter_handler()
 @ cdecl _get_timezone(ptr)
 @ cdecl _get_tzname(ptr str long long) MSVCRT__get_tzname
 @ cdecl _get_unexpected() MSVCRT__get_unexpected
@@ -1893,7 +1893,7 @@
 @ cdecl _set_printf_count_output(long) MSVCRT__set_printf_count_output
 @ cdecl _set_purecall_handler(ptr)
 @ stub _set_se_translator
-@ stub _set_thread_local_invalid_parameter_handler
+@ cdecl _set_thread_local_invalid_parameter_handler(ptr)
 @ cdecl _seterrormode(long)
 @ cdecl -arch=i386 -norelay _setjmp3(ptr long) MSVCRT__setjmp3
 @ cdecl _setmaxstdio(long) MSVCRT__setmaxstdio
-- 
2.8.3




More information about the wine-patches mailing list