193 lines
4.4 KiB
C++
193 lines
4.4 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#if UBA_USE_MIMALLOC
|
|
|
|
#define DETOURED_CALL_MEM(x) DETOURED_CALL(x)
|
|
|
|
void* Detoured_malloc(size_t size)
|
|
{
|
|
DETOURED_CALL_MEM(malloc);
|
|
return mi_malloc(size);
|
|
}
|
|
|
|
void* Detoured_calloc(size_t number, size_t size)
|
|
{
|
|
DETOURED_CALL_MEM(calloc);
|
|
return mi_calloc(number, size);
|
|
}
|
|
|
|
void* Detoured__recalloc(void* memblock, size_t num, size_t size)
|
|
{
|
|
DETOURED_CALL_MEM(_recalloc);
|
|
return mi_recalloc(memblock, num, size);
|
|
}
|
|
|
|
void* Detoured_realloc(void* memblock, size_t size)
|
|
{
|
|
DETOURED_CALL_MEM(realloc);
|
|
return mi_realloc(memblock, size);
|
|
}
|
|
|
|
void* Detoured__expand(void* memblock, size_t size)
|
|
{
|
|
DETOURED_CALL_MEM(_expand);
|
|
return mi_expand(memblock, size);
|
|
}
|
|
|
|
size_t Detoured__msize(void* memblock)
|
|
{
|
|
DETOURED_CALL_MEM(free);
|
|
return mi_usable_size(memblock);
|
|
}
|
|
|
|
inline bool IsInMiMalloc(void* ptr)
|
|
{
|
|
return (((uintptr_t)ptr - 1) & ~MI_SEGMENT_MASK) && mi_is_in_heap_region(ptr);
|
|
}
|
|
|
|
void Detoured_free(void* memblock)
|
|
{
|
|
DETOURED_CALL_MEM(free);
|
|
if (IsInMiMalloc(memblock))
|
|
return mi_free(memblock);
|
|
else
|
|
True_free(memblock);
|
|
}
|
|
|
|
char* Detoured__strdup(const char* s)
|
|
{
|
|
DETOURED_CALL_MEM(_strdup);
|
|
return mi_strdup(s);
|
|
}
|
|
|
|
wchar_t* Detoured__wcsdup(const wchar_t* s)
|
|
{
|
|
DETOURED_CALL_MEM(_wcsdup);
|
|
return (wchar_t*)mi_wcsdup((const unsigned short*)(s));
|
|
}
|
|
|
|
wchar_t* Detoured__mbsdup(const wchar_t* s)
|
|
{
|
|
DETOURED_CALL_MEM(_mbsdup);
|
|
return (wchar_t*)mi_mbsdup((const unsigned char*)(s));
|
|
}
|
|
|
|
void* Detoured__aligned_malloc(size_t size, size_t alignment)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_malloc);
|
|
return mi_malloc_aligned(size, alignment);
|
|
}
|
|
|
|
void* Detoured__aligned_recalloc(void* memblock, size_t num, size_t size, size_t alignment)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_recalloc);
|
|
return mi_aligned_recalloc(memblock, num, size, alignment);
|
|
}
|
|
|
|
void* Detoured__aligned_realloc(void* memblock, size_t size, size_t alignment)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_realloc);
|
|
return mi_realloc_aligned(memblock, size, alignment);
|
|
}
|
|
|
|
void Detoured__aligned_free(void* memblock)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_free);
|
|
return mi_free(memblock);
|
|
}
|
|
|
|
void* Detoured__aligned_offset_malloc(size_t size, size_t alignment, size_t offset)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_offset_malloc);
|
|
return mi_malloc_aligned_at(size, alignment, offset);
|
|
}
|
|
|
|
void* Detoured__aligned_offset_recalloc(void* memblock, size_t num, size_t size, size_t alignment, size_t offset)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_offset_recalloc);
|
|
return mi_recalloc_aligned_at(memblock, num, size, alignment, offset);
|
|
}
|
|
|
|
void* Detoured__aligned_offset_realloc(void* memblock, size_t size, size_t alignment, size_t offset)
|
|
{
|
|
DETOURED_CALL_MEM(_aligned_offset_realloc);
|
|
return mi_realloc_aligned_at(memblock, size, alignment, offset);
|
|
}
|
|
|
|
errno_t Detoured__wdupenv_s(wchar_t** buffer, size_t* numberOfElements, const wchar_t* varname)
|
|
{
|
|
DETOURED_CALL_MEM(_wdupenv_s);
|
|
auto res = mi_wdupenv_s((unsigned short**)(buffer), numberOfElements, (const unsigned short*)(varname));
|
|
DEBUG_LOG_DETOURED(L"_wdupenv_s", L"(%ls) -> %u", varname, res);
|
|
return res;
|
|
}
|
|
|
|
errno_t Detoured__dupenv_s(char** buffer, size_t* numberOfElements, const char* varname)
|
|
{
|
|
DETOURED_CALL_MEM(_dupenv_s);
|
|
auto res = mi_dupenv_s(buffer, numberOfElements, varname);
|
|
DEBUG_LOG_DETOURED(L"_dupenv_s", L"(%hs) -> %u", varname, res);
|
|
return res;
|
|
}
|
|
|
|
void* Detoured__malloc_base(size_t _Size)
|
|
{
|
|
return mi_malloc(_Size);
|
|
}
|
|
|
|
void* Detoured__calloc_base(size_t _Count, size_t _Size)
|
|
{
|
|
return mi_calloc(_Count, _Size);
|
|
}
|
|
|
|
void* Detoured__realloc_base(void* memblock, size_t size)
|
|
{
|
|
return mi_realloc(memblock, size);
|
|
}
|
|
|
|
void Detoured__free_base(void* memblock)
|
|
{
|
|
if (!memblock)
|
|
return;
|
|
if (IsInMiMalloc(memblock))
|
|
mi_free(memblock);
|
|
else
|
|
True__free_base(memblock);
|
|
}
|
|
|
|
void* Detoured__expand_base(void* memblock, size_t size)
|
|
{
|
|
return mi_expand(memblock, size);
|
|
}
|
|
|
|
size_t Detoured__msize_base(void* memblock)
|
|
{
|
|
DETOURED_CALL_MEM(_msize_base);
|
|
return mi_usable_size(memblock);
|
|
}
|
|
|
|
void* Detoured__recalloc_base(void* memblock, size_t num, size_t size)
|
|
{
|
|
return mi_recalloc(memblock, num, size);
|
|
}
|
|
|
|
#if defined(DETOURED_INCLUDE_DEBUG)
|
|
|
|
size_t Detoured__aligned_msize(void* p, size_t alignment, size_t offset)
|
|
{
|
|
UBA_ASSERTF(false, L"_aligned_msize called but is only detoured in debug");
|
|
DETOURED_CALL(_aligned_msize);
|
|
return mi_usable_size(p);
|
|
}
|
|
|
|
//void Detoured__free_dbg(void* userData, int blockType)
|
|
//{
|
|
// DETOURED_CALL(_free_dbg);
|
|
// //DEBUG_LOG_TRUE(L"_free_dbg", L"");
|
|
// return True__free_dbg(userData, blockType);
|
|
//}
|
|
|
|
#endif
|
|
|
|
#endif
|