1*0ea48e79STimo Kreuzer /*
2*0ea48e79STimo Kreuzer  * PROJECT:     ReactOS CRT library
3*0ea48e79STimo Kreuzer  * LICENSE:     MIT (https://spdx.org/licenses/MIT)
4*0ea48e79STimo Kreuzer  * PURPOSE:     _invalid_parameter implementation
5*0ea48e79STimo Kreuzer  * COPYRIGHT:   Timo Kreuzer <timo.kreuzer@reactos.org>
6*0ea48e79STimo Kreuzer  */
7*0ea48e79STimo Kreuzer 
8*0ea48e79STimo Kreuzer #include <precomp.h>
9*0ea48e79STimo Kreuzer 
10*0ea48e79STimo Kreuzer #ifdef _MSVCRTEX_
11*0ea48e79STimo Kreuzer #undef TRACE
12*0ea48e79STimo Kreuzer #undef ERR
13*0ea48e79STimo Kreuzer #define TRACE(...)
14*0ea48e79STimo Kreuzer #define ERR(...)
15*0ea48e79STimo Kreuzer #endif
16*0ea48e79STimo Kreuzer 
17*0ea48e79STimo Kreuzer static _invalid_parameter_handler invalid_parameter_handler = NULL;
18*0ea48e79STimo Kreuzer 
19*0ea48e79STimo Kreuzer /******************************************************************************
20*0ea48e79STimo Kreuzer  *		_invalid_parameter (MSVCRT.@)
21*0ea48e79STimo Kreuzer  */
_invalid_parameter(const wchar_t * expr,const wchar_t * func,const wchar_t * file,unsigned int line,uintptr_t arg)22*0ea48e79STimo Kreuzer void __cdecl _invalid_parameter(const wchar_t *expr, const wchar_t *func,
23*0ea48e79STimo Kreuzer                                 const wchar_t *file, unsigned int line, uintptr_t arg)
24*0ea48e79STimo Kreuzer {
25*0ea48e79STimo Kreuzer     if (invalid_parameter_handler) invalid_parameter_handler( expr, func, file, line, arg );
26*0ea48e79STimo Kreuzer     else
27*0ea48e79STimo Kreuzer     {
28*0ea48e79STimo Kreuzer         ERR( "%s:%u %s: %s %lx\n", debugstr_w(file), line, debugstr_w(func), debugstr_w(expr), arg );
29*0ea48e79STimo Kreuzer #if _MSVCR_VER > 0 // FIXME: possible improvement: use a global variable in the DLL
30*0ea48e79STimo Kreuzer         RaiseException( STATUS_INVALID_CRUNTIME_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, NULL );
31*0ea48e79STimo Kreuzer #endif
32*0ea48e79STimo Kreuzer     }
33*0ea48e79STimo Kreuzer }
34*0ea48e79STimo Kreuzer 
35*0ea48e79STimo Kreuzer /* _get_invalid_parameter_handler - not exported in native msvcrt, added in msvcr80 */
_get_invalid_parameter_handler(void)36*0ea48e79STimo Kreuzer _invalid_parameter_handler CDECL _get_invalid_parameter_handler(void)
37*0ea48e79STimo Kreuzer {
38*0ea48e79STimo Kreuzer     TRACE("\n");
39*0ea48e79STimo Kreuzer     return invalid_parameter_handler;
40*0ea48e79STimo Kreuzer }
41*0ea48e79STimo Kreuzer 
42*0ea48e79STimo Kreuzer /* _set_invalid_parameter_handler - not exproted in native msvcrt, added in msvcr80 */
_set_invalid_parameter_handler(_invalid_parameter_handler handler)43*0ea48e79STimo Kreuzer _invalid_parameter_handler CDECL _set_invalid_parameter_handler(
44*0ea48e79STimo Kreuzer         _invalid_parameter_handler handler)
45*0ea48e79STimo Kreuzer {
46*0ea48e79STimo Kreuzer     _invalid_parameter_handler old = invalid_parameter_handler;
47*0ea48e79STimo Kreuzer 
48*0ea48e79STimo Kreuzer     TRACE("(%p)\n", handler);
49*0ea48e79STimo Kreuzer 
50*0ea48e79STimo Kreuzer     invalid_parameter_handler = handler;
51*0ea48e79STimo Kreuzer     return old;
52*0ea48e79STimo Kreuzer }
53