Added fake _set_invalid_paremeter_handler to libmsvcrt.a and use call _set_invalid_paremeter_handler directly in crtexe.c. git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@5893 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index d1a672f..faa5f84 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am
@@ -118,6 +118,7 @@ libsrc/wspiapi/WspiapiFreeAddrInfo.c src_msvcrt=\ + misc/invalid_parameter_handler.c \ secapi/_access_s.c \ secapi/_cgets_s.c \ secapi/_cgetws_s.c \
diff --git a/mingw-w64-crt/Makefile.in b/mingw-w64-crt/Makefile.in index 3637d7a..cf78d02 100644 --- a/mingw-w64-crt/Makefile.in +++ b/mingw-w64-crt/Makefile.in
@@ -1067,10 +1067,10 @@ am_lib32_libmoldname_a_OBJECTS = lib32_libmoldname_a_OBJECTS = $(am_lib32_libmoldname_a_OBJECTS) lib32_libmsvcrt_a_LIBADD = -am__lib32_libmsvcrt_a_SOURCES_DIST = secapi/_access_s.c \ - secapi/_cgets_s.c secapi/_cgetws_s.c secapi/_chsize_s.c \ - secapi/_cprintf_s.c secapi/_cprintf_s_l.c secapi/_ctime32_s.c \ - secapi/_ctime64_s.c secapi/_cwprintf_s.c \ +am__lib32_libmsvcrt_a_SOURCES_DIST = misc/invalid_parameter_handler.c \ + secapi/_access_s.c secapi/_cgets_s.c secapi/_cgetws_s.c \ + secapi/_chsize_s.c secapi/_cprintf_s.c secapi/_cprintf_s_l.c \ + secapi/_ctime32_s.c secapi/_ctime64_s.c secapi/_cwprintf_s.c \ secapi/_cwprintf_s_l.c secapi/_gmtime32_s.c \ secapi/_gmtime64_s.c secapi/_localtime32_s.c \ secapi/_localtime64_s.c secapi/_mktemp_s.c secapi/_strdate_s.c \ @@ -1081,7 +1081,9 @@ secapi/_wstrtime_s.c secapi/_wmktemp_s.c secapi/_wstrdate_s.c \ secapi/asctime_s.c secapi/memcpy_s.c secapi/vsprintf_s.c \ secapi/wmemcpy_s.c lib32/msvcrt.def.in -am__objects_18 = secapi/lib32_libmsvcrt_a-_access_s.$(OBJEXT) \ +am__objects_18 = \ + misc/lib32_libmsvcrt_a-invalid_parameter_handler.$(OBJEXT) \ + secapi/lib32_libmsvcrt_a-_access_s.$(OBJEXT) \ secapi/lib32_libmsvcrt_a-_cgets_s.$(OBJEXT) \ secapi/lib32_libmsvcrt_a-_cgetws_s.$(OBJEXT) \ secapi/lib32_libmsvcrt_a-_chsize_s.$(OBJEXT) \ @@ -2162,10 +2164,10 @@ am_lib64_libmoldname_a_OBJECTS = lib64_libmoldname_a_OBJECTS = $(am_lib64_libmoldname_a_OBJECTS) lib64_libmsvcrt_a_LIBADD = -am__lib64_libmsvcrt_a_SOURCES_DIST = secapi/_access_s.c \ - secapi/_cgets_s.c secapi/_cgetws_s.c secapi/_chsize_s.c \ - secapi/_cprintf_s.c secapi/_cprintf_s_l.c secapi/_ctime32_s.c \ - secapi/_ctime64_s.c secapi/_cwprintf_s.c \ +am__lib64_libmsvcrt_a_SOURCES_DIST = misc/invalid_parameter_handler.c \ + secapi/_access_s.c secapi/_cgets_s.c secapi/_cgetws_s.c \ + secapi/_chsize_s.c secapi/_cprintf_s.c secapi/_cprintf_s_l.c \ + secapi/_ctime32_s.c secapi/_ctime64_s.c secapi/_cwprintf_s.c \ secapi/_cwprintf_s_l.c secapi/_gmtime32_s.c \ secapi/_gmtime64_s.c secapi/_localtime32_s.c \ secapi/_localtime64_s.c secapi/_mktemp_s.c secapi/_strdate_s.c \ @@ -2176,7 +2178,9 @@ secapi/_wstrtime_s.c secapi/_wmktemp_s.c secapi/_wstrdate_s.c \ secapi/asctime_s.c secapi/memcpy_s.c secapi/vsprintf_s.c \ secapi/wmemcpy_s.c lib64/msvcrt.def.in -am__objects_47 = secapi/lib64_libmsvcrt_a-_access_s.$(OBJEXT) \ +am__objects_47 = \ + misc/lib64_libmsvcrt_a-invalid_parameter_handler.$(OBJEXT) \ + secapi/lib64_libmsvcrt_a-_access_s.$(OBJEXT) \ secapi/lib64_libmsvcrt_a-_cgets_s.$(OBJEXT) \ secapi/lib64_libmsvcrt_a-_cgetws_s.$(OBJEXT) \ secapi/lib64_libmsvcrt_a-_chsize_s.$(OBJEXT) \ @@ -3777,6 +3781,7 @@ libsrc/wspiapi/WspiapiFreeAddrInfo.c src_msvcrt = \ + misc/invalid_parameter_handler.c \ secapi/_access_s.c \ secapi/_cgets_s.c \ secapi/_cgetws_s.c \ @@ -6311,6 +6316,8 @@ $(AM_V_at)-rm -f lib32/libmoldname.a $(AM_V_AR)$(lib32_libmoldname_a_AR) lib32/libmoldname.a $(lib32_libmoldname_a_OBJECTS) $(lib32_libmoldname_a_LIBADD) $(AM_V_at)$(RANLIB) lib32/libmoldname.a +misc/lib32_libmsvcrt_a-invalid_parameter_handler.$(OBJEXT): \ + misc/$(am__dirstamp) misc/$(DEPDIR)/$(am__dirstamp) secapi/$(am__dirstamp): @$(MKDIR_P) secapi @: > secapi/$(am__dirstamp) @@ -7889,6 +7896,8 @@ $(AM_V_at)-rm -f lib64/libmoldname.a $(AM_V_AR)$(lib64_libmoldname_a_AR) lib64/libmoldname.a $(lib64_libmoldname_a_OBJECTS) $(lib64_libmoldname_a_LIBADD) $(AM_V_at)$(RANLIB) lib64/libmoldname.a +misc/lib64_libmsvcrt_a-invalid_parameter_handler.$(OBJEXT): \ + misc/$(am__dirstamp) misc/$(DEPDIR)/$(am__dirstamp) secapi/lib64_libmsvcrt_a-_access_s.$(OBJEXT): secapi/$(am__dirstamp) \ secapi/$(DEPDIR)/$(am__dirstamp) secapi/lib64_libmsvcrt_a-_cgets_s.$(OBJEXT): secapi/$(am__dirstamp) \ @@ -10179,6 +10188,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib32_libmingwex_a-wmemmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib32_libmingwex_a-wmempcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib32_libmingwex_a-wmemset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-alarm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-basename.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-btowc.Po@am__quote@ @@ -10268,6 +10278,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-wmemmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-wmempcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmingwex_a-wmemset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@profile/$(DEPDIR)/lib32_libgmon_a-gmon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@profile/$(DEPDIR)/lib32_libgmon_a-mcount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@profile/$(DEPDIR)/lib32_libgmon_a-mcountFunc.Po@am__quote@ @@ -19066,6 +19077,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmingwthrd_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsrc/lib32_libmingwthrd_a-mingwthrd_mt.obj `if test -f 'libsrc/mingwthrd_mt.c'; then $(CYGPATH_W) 'libsrc/mingwthrd_mt.c'; else $(CYGPATH_W) '$(srcdir)/libsrc/mingwthrd_mt.c'; fi` +misc/lib32_libmsvcrt_a-invalid_parameter_handler.o: misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc/lib32_libmsvcrt_a-invalid_parameter_handler.o -MD -MP -MF misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Tpo -c -o misc/lib32_libmsvcrt_a-invalid_parameter_handler.o `test -f 'misc/invalid_parameter_handler.c' || echo '$(srcdir)/'`misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Tpo misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/invalid_parameter_handler.c' object='misc/lib32_libmsvcrt_a-invalid_parameter_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc/lib32_libmsvcrt_a-invalid_parameter_handler.o `test -f 'misc/invalid_parameter_handler.c' || echo '$(srcdir)/'`misc/invalid_parameter_handler.c + +misc/lib32_libmsvcrt_a-invalid_parameter_handler.obj: misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc/lib32_libmsvcrt_a-invalid_parameter_handler.obj -MD -MP -MF misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Tpo -c -o misc/lib32_libmsvcrt_a-invalid_parameter_handler.obj `if test -f 'misc/invalid_parameter_handler.c'; then $(CYGPATH_W) 'misc/invalid_parameter_handler.c'; else $(CYGPATH_W) '$(srcdir)/misc/invalid_parameter_handler.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Tpo misc/$(DEPDIR)/lib32_libmsvcrt_a-invalid_parameter_handler.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/invalid_parameter_handler.c' object='misc/lib32_libmsvcrt_a-invalid_parameter_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc/lib32_libmsvcrt_a-invalid_parameter_handler.obj `if test -f 'misc/invalid_parameter_handler.c'; then $(CYGPATH_W) 'misc/invalid_parameter_handler.c'; else $(CYGPATH_W) '$(srcdir)/misc/invalid_parameter_handler.c'; fi` + secapi/lib32_libmsvcrt_a-_access_s.o: secapi/_access_s.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib32_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT secapi/lib32_libmsvcrt_a-_access_s.o -MD -MP -MF secapi/$(DEPDIR)/lib32_libmsvcrt_a-_access_s.Tpo -c -o secapi/lib32_libmsvcrt_a-_access_s.o `test -f 'secapi/_access_s.c' || echo '$(srcdir)/'`secapi/_access_s.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) secapi/$(DEPDIR)/lib32_libmsvcrt_a-_access_s.Tpo secapi/$(DEPDIR)/lib32_libmsvcrt_a-_access_s.Po @@ -27956,6 +27981,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwthrd_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsrc/lib64_libmingwthrd_a-mingwthrd_mt.obj `if test -f 'libsrc/mingwthrd_mt.c'; then $(CYGPATH_W) 'libsrc/mingwthrd_mt.c'; else $(CYGPATH_W) '$(srcdir)/libsrc/mingwthrd_mt.c'; fi` +misc/lib64_libmsvcrt_a-invalid_parameter_handler.o: misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc/lib64_libmsvcrt_a-invalid_parameter_handler.o -MD -MP -MF misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Tpo -c -o misc/lib64_libmsvcrt_a-invalid_parameter_handler.o `test -f 'misc/invalid_parameter_handler.c' || echo '$(srcdir)/'`misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Tpo misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/invalid_parameter_handler.c' object='misc/lib64_libmsvcrt_a-invalid_parameter_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc/lib64_libmsvcrt_a-invalid_parameter_handler.o `test -f 'misc/invalid_parameter_handler.c' || echo '$(srcdir)/'`misc/invalid_parameter_handler.c + +misc/lib64_libmsvcrt_a-invalid_parameter_handler.obj: misc/invalid_parameter_handler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc/lib64_libmsvcrt_a-invalid_parameter_handler.obj -MD -MP -MF misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Tpo -c -o misc/lib64_libmsvcrt_a-invalid_parameter_handler.obj `if test -f 'misc/invalid_parameter_handler.c'; then $(CYGPATH_W) 'misc/invalid_parameter_handler.c'; else $(CYGPATH_W) '$(srcdir)/misc/invalid_parameter_handler.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Tpo misc/$(DEPDIR)/lib64_libmsvcrt_a-invalid_parameter_handler.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/invalid_parameter_handler.c' object='misc/lib64_libmsvcrt_a-invalid_parameter_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc/lib64_libmsvcrt_a-invalid_parameter_handler.obj `if test -f 'misc/invalid_parameter_handler.c'; then $(CYGPATH_W) 'misc/invalid_parameter_handler.c'; else $(CYGPATH_W) '$(srcdir)/misc/invalid_parameter_handler.c'; fi` + secapi/lib64_libmsvcrt_a-_access_s.o: secapi/_access_s.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmsvcrt_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT secapi/lib64_libmsvcrt_a-_access_s.o -MD -MP -MF secapi/$(DEPDIR)/lib64_libmsvcrt_a-_access_s.Tpo -c -o secapi/lib64_libmsvcrt_a-_access_s.o `test -f 'secapi/_access_s.c' || echo '$(srcdir)/'`secapi/_access_s.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) secapi/$(DEPDIR)/lib64_libmsvcrt_a-_access_s.Tpo secapi/$(DEPDIR)/lib64_libmsvcrt_a-_access_s.Po
diff --git a/mingw-w64-crt/crt/crtexe.c b/mingw-w64-crt/crt/crtexe.c index 79ddc54..fef0172 100644 --- a/mingw-w64-crt/crt/crtexe.c +++ b/mingw-w64-crt/crt/crtexe.c
@@ -99,12 +99,29 @@ static int __cdecl pre_c_init (void); static void __cdecl pre_cpp_init (void); -static void __cdecl __mingw_prepare_except_for_msvcr80_and_higher (void); _CRTALLOC(".CRT$XIAA") _PIFV mingw_pcinit = pre_c_init; _CRTALLOC(".CRT$XCAA") _PVFV mingw_pcppinit = pre_cpp_init; extern int _MINGW_INSTALL_DEBUG_MATHERR; +#ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION +#define __UNUSED_PARAM_1(x) x +#else +#define __UNUSED_PARAM_1 __UNUSED_PARAM +#endif +static void +__mingw_invalidParameterHandler (const wchar_t * __UNUSED_PARAM_1(expression), + const wchar_t * __UNUSED_PARAM_1(function), + const wchar_t * __UNUSED_PARAM_1(file), + unsigned int __UNUSED_PARAM_1(line), + uintptr_t __UNUSED_PARAM(pReserved)) +{ +#ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION + wprintf(L"Invalid parameter detected in function %s. File: %s Line: %d\n", function, file, line); + wprintf(L"Expression: %s\n", expression); +#endif +} + static int __cdecl pre_c_init (void) { @@ -265,7 +282,7 @@ #ifdef _WIN64 __mingw_init_ehandler (); #endif - __mingw_prepare_except_for_msvcr80_and_higher (); + _set_invalid_parameter_handler (__mingw_invalidParameterHandler); _fpreset (); @@ -409,33 +426,3 @@ *av = n; } #endif - -#ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION -#define __UNUSED_PARAM_1(x) x -#else -#define __UNUSED_PARAM_1 __UNUSED_PARAM -#endif -static void -__mingw_invalidParameterHandler (const wchar_t * __UNUSED_PARAM_1(expression), - const wchar_t * __UNUSED_PARAM_1(function), - const wchar_t * __UNUSED_PARAM_1(file), - unsigned int __UNUSED_PARAM_1(line), - uintptr_t __UNUSED_PARAM(pReserved)) -{ -#ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION - wprintf(L"Invalid parameter detected in function %s. File: %s Line: %d\n", function, file, line); - wprintf(L"Expression: %s\n", expression); -#endif -} - -HANDLE __mingw_get_msvcrt_handle(void); - -static void __cdecl -__mingw_prepare_except_for_msvcr80_and_higher (void) -{ - _invalid_parameter_handler (*fIPH)(_invalid_parameter_handler) = NULL; - - fIPH = (void*)GetProcAddress (__mingw_get_msvcrt_handle(), "_set_invalid_parameter_handler"); - if (fIPH) - (*fIPH)(__mingw_invalidParameterHandler); -}
diff --git a/mingw-w64-crt/misc/invalid_parameter_handler.c b/mingw-w64-crt/misc/invalid_parameter_handler.c new file mode 100644 index 0000000..76c9899 --- /dev/null +++ b/mingw-w64-crt/misc/invalid_parameter_handler.c
@@ -0,0 +1,14 @@ +#include <windows.h> +#include <stdlib.h> + +static _invalid_parameter_handler handler; + +_invalid_parameter_handler __cdecl __MINGW_IMP_SYMBOL(_set_invalid_parameter_handler)(_invalid_parameter_handler new_handler) +{ + return InterlockedExchangePointer(&handler, new_handler); +} + +_invalid_parameter_handler __cdecl __MINGW_IMP_SYMBOL(_get_invalid_parameter_handler)(void) +{ + return handler; +}
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h index e7c79a6..744be87 100644 --- a/mingw-w64-headers/crt/stdlib.h +++ b/mingw-w64-headers/crt/stdlib.h
@@ -134,8 +134,8 @@ _CRTIMP _purecall_handler __cdecl _get_purecall_handler(void); typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *,const wchar_t *,const wchar_t *,unsigned int,uintptr_t); - _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(_invalid_parameter_handler _Handler); - _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void); + _CRTIMP _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(_invalid_parameter_handler _Handler); + _CRTIMP _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void); #ifndef _CRT_ERRNO_DEFINED #define _CRT_ERRNO_DEFINED