/* * Copyright (c) 2020 Bitdefender * SPDX-License-Identifier: Apache-2.0 */ #ifndef ND_CRT_H #define ND_CRT_H #include "../../inc/disasmtypes.h" #ifndef UNREFERENCED_PARAMETER #define UNREFERENCED_PARAMETER(P) ((void)(P)) #endif #if defined(_MSC_VER) #include # ifndef _ADDRESSOF # ifdef __cplusplus # define _ADDRESSOF(v) ( &reinterpret_cast(v) ) # else # define _ADDRESSOF(v) ( &(v) ) # endif // __cplusplus # endif // !_ADDRESSOF # ifndef KERNEL_MODE # if defined(AMD64) || defined(WIN64) # define _crt_va_start(ap, x) ( __va_start(&ap, x) ) # define _crt_va_arg(ap, t) ( ( sizeof(t) > sizeof(QWORD) || ( sizeof(t) & (sizeof(t) - 1) ) != 0 ) \ ? **(t **)( ( ap += sizeof(QWORD) ) - sizeof(QWORD) ) \ : *(t *)( ( ap += sizeof(QWORD) ) - sizeof(QWORD) ) ) # define _crt_va_end(ap) ( ap = (va_list)0 ) # else // a guess at the proper definitions for other platforms # ifndef _INTSIZEOF # define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) # endif // !_INTSIZEOF # define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) # define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) # define _crt_va_end(ap) ( ap = (va_list)0 ) # endif // AMD64 || WIN64 # define va_start _crt_va_start # define va_arg _crt_va_arg # define va_end _crt_va_end #endif // KERNEL_MODE #else # include # define __forceinline inline __attribute__((always_inline)) #endif // _MSC_VER // By default, an integrator is expected to provide nd_vsnprintf_s and nd_strcat_s. // bddisasm needs both for NdToText, while bdshemu needs nd_vsnprintf_s for emulation tracing. // If BDDISASM_NO_FORMAT is defined at compile time these requirements are removed. Instruction formatting will no // longer be available in bddisasm and emulation tracing will no longer be available in bdshemu. #ifndef BDDISASM_NO_FORMAT extern int nd_vsnprintf_s( char *buffer, size_t sizeOfBuffer, size_t count, const char *format, va_list argptr ); char * nd_strcat_s( char *dst, size_t dst_size, const char *src ); #endif // !BDDISASM_NO_FORMAT // Declared here only. Expecting it to be defined in the integrator. extern void *nd_memset(void *s, int c, size_t n); #define nd_memzero(Dest, Size) nd_memset((Dest), 0, (Size)) #endif // ND_CRT_H