Files
2025-05-18 13:04:45 +08:00

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