📄 internal.h
字号:
#ifdef _DEBUG
#define _CALL_INVALID_PARAMETER(expr) _invalid_parameter(expr, __FUNCTIONW__, __FILEW__, __LINE__, 0)
#define _INVOKE_WATSON_IF_ERROR(expr) _invoke_watson_if_error((expr), __STR2WSTR(#expr), __FUNCTIONW__, __FILEW__, __LINE__, 0)
#define _INVOKE_WATSON_IF_ONEOF(expr, errvalue1, errvalue2) _invoke_watson_if_oneof(expr, (errvalue1), (errvalue2), __STR2WSTR(#expr), __FUNCTIONW__, __FILEW__, __LINE__, 0)
#else /* _DEBUG */
#define _CALL_INVALID_PARAMETER(expr) _invalid_parameter_noinfo()
#define _INVOKE_WATSON_IF_ERROR(expr) _invoke_watson_if_error(expr, NULL, NULL, NULL, 0, 0)
#define _INVOKE_WATSON_IF_ONEOF(expr, errvalue1, errvalue2) _invoke_watson_if_oneof((expr), (errvalue1), (errvalue2), NULL, NULL, NULL, 0, 0)
#endif /* _DEBUG */
#define _INVALID_PARAMETER(expr) _CALL_INVALID_PARAMETER(expr)
#define _VALIDATE_RETURN_VOID( expr, errorcode ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr)); \
return; \
} \
}
/*
* Assert in debug builds.
* set errno and return value
*/
#ifndef _VALIDATE_RETURN
#define _VALIDATE_RETURN( expr, errorcode, retexpr ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr) ); \
return ( retexpr ); \
} \
}
#endif /* _VALIDATE_RETURN */
#ifndef _VALIDATE_RETURN_NOEXC
#define _VALIDATE_RETURN_NOEXC( expr, errorcode, retexpr ) \
{ \
if ( !(expr) ) \
{ \
errno = errorcode; \
return ( retexpr ); \
} \
}
#endif /* _VALIDATE_RETURN_NOEXC */
/*
* Assert in debug builds.
* set errno and set retval for later usage
*/
#define _VALIDATE_SETRET( expr, errorcode, retval, retexpr ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr)); \
retval=( retexpr ); \
} \
}
#define _CHECK_FH_RETURN( handle, errorcode, retexpr ) \
{ \
if(handle == _NO_CONSOLE_FILENO) \
{ \
errno = errorcode; \
return ( retexpr ); \
} \
}
/*
We use _VALIDATE_STREAM_ANSI_RETURN to ensure that ANSI file operations(
fprintf etc) aren't called on files opened as UNICODE. We do this check
only if it's an actual FILE pointer & not a string
*/
#define _VALIDATE_STREAM_ANSI_RETURN( stream, errorcode, retexpr ) \
{ \
FILE *_Stream=stream; \
int fn; \
_VALIDATE_RETURN(( (_Stream->_flag & _IOSTRG) || \
( fn = _fileno(_Stream), \
( (_textmode_safe(fn) == __IOINFO_TM_ANSI) && \
!_tm_unicode_safe(fn)))), \
errorcode, retexpr) \
}
/*
We use _VALIDATE_STREAM_ANSI_SETRET to ensure that ANSI file operations(
fprintf etc) aren't called on files opened as UNICODE. We do this check
only if it's an actual FILE pointer & not a string. It doesn't actually return
immediately
*/
#define _VALIDATE_STREAM_ANSI_SETRET( stream, errorcode, retval, retexpr) \
{ \
FILE *_Stream=stream; \
int fn; \
_VALIDATE_SETRET(( (_Stream->_flag & _IOSTRG) || \
( fn = _fileno(_Stream), \
( (_textmode_safe(fn) == __IOINFO_TM_ANSI) && \
!_tm_unicode_safe(fn)))), \
errorcode, retval, retexpr) \
}
/*
* Assert in debug builds.
* Return value (do not set errno)
*/
#define _VALIDATE_RETURN_NOERRNO( expr, retexpr ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
_INVALID_PARAMETER(_CRT_WIDE(#expr)); \
return ( retexpr ); \
} \
}
/*
* Assert in debug builds.
* set errno and return errorcode
*/
#define _VALIDATE_RETURN_ERRCODE( expr, errorcode ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr)); \
return ( errorcode ); \
} \
}
#define _VALIDATE_RETURN_ERRCODE_NOEXC( expr, errorcode ) \
{ \
if (!(expr)) \
{ \
errno = errorcode; \
return ( errorcode ); \
} \
}
#define _VALIDATE_CLEAR_OSSERR_RETURN( expr, errorcode, retexpr ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
_doserrno = 0L; \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr) ); \
return ( retexpr ); \
} \
}
#define _CHECK_FH_CLEAR_OSSERR_RETURN( handle, errorcode, retexpr ) \
{ \
if(handle == _NO_CONSOLE_FILENO) \
{ \
_doserrno = 0L; \
errno = errorcode; \
return ( retexpr ); \
} \
}
#define _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE( expr, errorcode ) \
{ \
int _Expr_val=!!(expr); \
_ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) ); \
if ( !( _Expr_val ) ) \
{ \
_doserrno = 0L; \
errno = errorcode; \
_INVALID_PARAMETER(_CRT_WIDE(#expr)); \
return ( errorcode ); \
} \
}
#define _CHECK_FH_CLEAR_OSSERR_RETURN_ERRCODE( handle, retexpr ) \
{ \
if(handle == _NO_CONSOLE_FILENO) \
{ \
_doserrno = 0L; \
return ( retexpr ); \
} \
}
#ifdef _DEBUG
extern size_t __crtDebugFillThreshold;
#endif /* _DEBUG */
#if !defined (_SECURECRT_FILL_BUFFER_THRESHOLD)
#ifdef _DEBUG
#define _SECURECRT_FILL_BUFFER_THRESHOLD __crtDebugFillThreshold
#else /* _DEBUG */
#define _SECURECRT_FILL_BUFFER_THRESHOLD ((size_t)0)
#endif /* _DEBUG */
#endif /* !defined (_SECURECRT_FILL_BUFFER_THRESHOLD) */
#if _SECURECRT_FILL_BUFFER
#define _SECURECRT__FILL_STRING(_String, _Size, _Offset) \
if ((_Size) != ((size_t)-1) && (_Size) != INT_MAX && \
((size_t)(_Offset)) < (_Size)) \
{ \
memset((_String) + (_Offset), \
_SECURECRT_FILL_BUFFER_PATTERN, \
(_SECURECRT_FILL_BUFFER_THRESHOLD < ((size_t)((_Size) - (_Offset))) ? \
_SECURECRT_FILL_BUFFER_THRESHOLD : \
((_Size) - (_Offset))) * sizeof(*(_String))); \
}
#else /* _SECURECRT_FILL_BUFFER */
#define _SECURECRT__FILL_STRING(_String, _Size, _Offset)
#endif /* _SECURECRT_FILL_BUFFER */
#if _SECURECRT_FILL_BUFFER
#define _SECURECRT__FILL_BYTE(_Position) \
if (_SECURECRT_FILL_BUFFER_THRESHOLD > 0) \
{ \
(_Position) = _SECURECRT_FILL_BUFFER_PATTERN; \
}
#else /* _SECURECRT_FILL_BUFFER */
#define _SECURECRT__FILL_BYTE(_Position)
#endif /* _SECURECRT_FILL_BUFFER */
#ifdef __cplusplus
#define _REDIRECT_TO_L_VERSION_FUNC_PROLOGUE extern "C"
#else /* __cplusplus */
#define _REDIRECT_TO_L_VERSION_FUNC_PROLOGUE
#endif /* __cplusplus */
/* helper macros to redirect an mbs function to the corresponding _l version */
#define _REDIRECT_TO_L_VERSION_1(_ReturnType, _FunctionName, _Type1) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1) \
{ \
return _FunctionName##_l(_Arg1, NULL); \
}
#define _REDIRECT_TO_L_VERSION_2(_ReturnType, _FunctionName, _Type1, _Type2) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1, _Type2 _Arg2) \
{ \
return _FunctionName##_l(_Arg1, _Arg2, NULL); \
}
#define _REDIRECT_TO_L_VERSION_3(_ReturnType, _FunctionName, _Type1, _Type2, _Type3) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1, _Type2 _Arg2, _Type3 _Arg3) \
{ \
return _FunctionName##_l(_Arg1, _Arg2, _Arg3, NULL); \
}
#define _REDIRECT_TO_L_VERSION_4(_ReturnType, _FunctionName, _Type1, _Type2, _Type3, _Type4) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1, _Type2 _Arg2, _Type3 _Arg3, _Type4 _Arg4) \
{ \
return _FunctionName##_l(_Arg1, _Arg2, _Arg3, _Arg4, NULL); \
}
#define _REDIRECT_TO_L_VERSION_5(_ReturnType, _FunctionName, _Type1, _Type2, _Type3, _Type4, _Type5) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1, _Type2 _Arg2, _Type3 _Arg3, _Type4 _Arg4, _Type5 _Arg5) \
{ \
return _FunctionName##_l(_Arg1, _Arg2, _Arg3, _Arg4, _Arg5, NULL); \
}
#define _REDIRECT_TO_L_VERSION_6(_ReturnType, _FunctionName, _Type1, _Type2, _Type3, _Type4, _Type5, _Type6) \
_REDIRECT_TO_L_VERSION_FUNC_PROLOGUE \
_ReturnType __cdecl _FunctionName(_Type1 _Arg1, _Type2 _Arg2, _Type3 _Arg3, _Type4 _Arg4, _Type5 _Arg5, _Type6 _Arg6) \
{ \
return _FunctionName##_l(_Arg1, _Arg2, _Arg3, _Arg4, _Arg5, _Arg6, NULL); \
}
/* internal helper functions for encoding and decoding pointers */
void __cdecl _init_pointers();
_SUPPRESS_UNMANAGED_CODE_SECURITY
SECURITYCRITICAL_ATTRIBUTE
_RELIABILITY_CONTRACT
_INTEROPSERVICES_DLLIMPORT(_CRT_MSVCR_CURRENT, "_encoded_null", _CALLING_CONVENTION_CDECL)
_CRTIMP void * __cdecl _encoded_null();
_SUPPRESS_UNMANAGED_CODE_SECURITY
SECURITYCRITICAL_ATTRIBUTE
_RELIABILITY_CONTRACT
_INTEROPSERVICES_DLLIMPORT("KERNEL32.dll", "EncodePointer", _CALLING_CONVENTION_WINAPI)
WINBASEAPI
__out_opt
PVOID
WINAPI
EncodePointer (
__in_opt PVOID Ptr
);
_SUPPRESS_UNMANAGED_CODE_SECURITY
SECURITYCRITICAL_ATTRIBUTE
_RELIABILITY_CONTRACT
_INTEROPSERVICES_DLLIMPORT("KERNEL32.dll", "DecodePointer", _CALLING_CONVENTION_WINAPI)
WINBASEAPI
__out_opt
PVOID
WINAPI
DecodePointer (
__in_opt PVOID Ptr
);
/* Macros to simplify the use of Secure CRT in the CRT itself.
* We should use [_BEGIN/_END]_SECURE_CRT_DEPRECATION_DISABLE sparingly.
*/
#define _BEGIN_SECURE_CRT_DEPRECATION_DISABLE \
__pragma(warning(push)) \
__pragma(warning(disable:4996)) \
__pragma(warning(disable:6053))
#define _END_SECURE_CRT_DEPRECATION_DISABLE \
__pragma(warning(pop))
#define _ERRCHECK(e) \
_INVOKE_WATSON_IF_ERROR(e)
#define _ERRCHECK_EINVAL(e) \
_INVOKE_WATSON_IF_ONEOF(e, EINVAL, EINVAL)
#define _ERRCHECK_EINVAL_ERANGE(e) \
_INVOKE_WATSON_IF_ONEOF(e, EINVAL, ERANGE)
#define _ERRCHECK_SPRINTF(_PrintfCall) \
{ \
errno_t _SaveErrno = errno; \
errno = 0; \
if ( ( _PrintfCall ) < 0) \
{ \
_ERRCHECK_EINVAL_ERANGE(errno); \
} \
errno = _SaveErrno; \
}
/* internal helper function to access environment variable in read-only mode */
const wchar_t * __cdecl _wgetenv_helper_nolock(const wchar_t *);
const char * __cdecl _getenv_helper_nolock(const char *);
/* internal helper routines used to query a PE image header. */
BOOL __cdecl _ValidateImageBase(PBYTE pImageBase);
PIMAGE_SECTION_HEADER __cdecl _FindPESection(PBYTE pImageBase, DWORD_PTR rva);
BOOL __cdecl _IsNonwritableInCurrentImage(PBYTE pTarget);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#define CRT_WARNING_DISABLE_PUSH(x,y) __pragma(warning(push)); __pragma(warning(disable: x))
#define CRT_WARNING_POP __pragma(warning(pop))
#pragma pack(pop)
#endif /* _INC_INTERNAL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -