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