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