diff options
author | p0358 <p0358@users.noreply.github.com> | 2021-12-29 05:48:33 +0100 |
---|---|---|
committer | p0358 <p0358@users.noreply.github.com> | 2021-12-29 05:48:33 +0100 |
commit | 8a1a2e97624d15617197248a5e292c5ead5e74a2 (patch) | |
tree | d236b5bd3c21db674c784239beb2404273498887 /loader_launcher_proxy/Memory.cpp | |
parent | 2bb9e5b29ab08062614b2d52c430f9097bf2106f (diff) | |
download | NorthstarLauncher-8a1a2e97624d15617197248a5e292c5ead5e74a2.tar.gz NorthstarLauncher-8a1a2e97624d15617197248a5e292c5ead5e74a2.zip |
add launcher.dll proxy option
Diffstat (limited to 'loader_launcher_proxy/Memory.cpp')
-rw-r--r-- | loader_launcher_proxy/Memory.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/loader_launcher_proxy/Memory.cpp b/loader_launcher_proxy/Memory.cpp new file mode 100644 index 00000000..d8dc1dc5 --- /dev/null +++ b/loader_launcher_proxy/Memory.cpp @@ -0,0 +1,52 @@ +#include "pch.h" +#include <cstddef> +#include <malloc.h> +#include <stdio.h> + +HMODULE hTier0Module; +IMemAlloc** g_ppMemAllocSingleton; + +void LoadTier0Handle() +{ + hTier0Module = GetModuleHandleA("tier0.dll"); + if (!hTier0Module) return; + + g_ppMemAllocSingleton = (IMemAlloc**)GetProcAddress(hTier0Module, "g_pMemAllocSingleton"); +} + +const int STATIC_ALLOC_SIZE = 4096; + +size_t g_iStaticAllocated = 0; +char pStaticAllocBuf[STATIC_ALLOC_SIZE]; + +// they should never be used here, except in LibraryLoadError + +void* operator new(size_t n) +{ + // allocate into static buffer + if (g_iStaticAllocated + n <= STATIC_ALLOC_SIZE) + { + void* ret = pStaticAllocBuf + g_iStaticAllocated; + g_iStaticAllocated += n; + return ret; + } + else + { + // try to fallback to g_pMemAllocSingleton + if (!hTier0Module) LoadTier0Handle(); + if (g_ppMemAllocSingleton && *g_ppMemAllocSingleton) + (*g_ppMemAllocSingleton)->m_vtable->Alloc(*g_ppMemAllocSingleton, n); + else + throw "Cannot allocate"; + } +} + +void operator delete(void* p) +{ + // if it was allocated into the static buffer, just do nothing, safest way to deal with it + if (p >= pStaticAllocBuf && p <= pStaticAllocBuf + STATIC_ALLOC_SIZE) + return; + + if (g_ppMemAllocSingleton && *g_ppMemAllocSingleton) + (*g_ppMemAllocSingleton)->m_vtable->Free(*g_ppMemAllocSingleton, p); +} |