aboutsummaryrefslogtreecommitdiff
path: root/loader_launcher_proxy/Memory.cpp
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2022-01-02 22:32:36 +0000
committerGitHub <noreply@github.com>2022-01-02 22:32:36 +0000
commit3f629680f71b4694bd4eb78726537a91e10a2352 (patch)
tree137e44e28bbe372adeb616e3f20156ba23c08655 /loader_launcher_proxy/Memory.cpp
parentff875c0551c54bb187b5320b81029f8fe7f010fb (diff)
parentf7b96d1048acddc343244ddec87a996ebaf7cb5b (diff)
downloadNorthstarLauncher-3f629680f71b4694bd4eb78726537a91e10a2352.tar.gz
NorthstarLauncher-3f629680f71b4694bd4eb78726537a91e10a2352.zip
Merge pull request #19 from p0358/main
Big refactor of launching process
Diffstat (limited to 'loader_launcher_proxy/Memory.cpp')
-rw-r--r--loader_launcher_proxy/Memory.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/loader_launcher_proxy/Memory.cpp b/loader_launcher_proxy/Memory.cpp
new file mode 100644
index 00000000..f00c4d96
--- /dev/null
+++ b/loader_launcher_proxy/Memory.cpp
@@ -0,0 +1,84 @@
+#include "pch.h"
+
+extern HMODULE hTier0Module;
+IMemAlloc** g_ppMemAllocSingleton;
+
+void LoadTier0Handle()
+{
+ if (!hTier0Module) 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;
+void* g_pLastAllocated = nullptr;
+char pStaticAllocBuf[STATIC_ALLOC_SIZE];
+
+// they should never be used here, except in LibraryLoadError?
+
+void* malloc(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 || !g_ppMemAllocSingleton) LoadTier0Handle();
+ if (g_ppMemAllocSingleton && *g_ppMemAllocSingleton)
+ return (*g_ppMemAllocSingleton)->m_vtable->Alloc(*g_ppMemAllocSingleton, n);
+ else
+ throw "Cannot allocate";
+ }
+}
+
+void free(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);
+}
+
+void* realloc(void* old_ptr, size_t size) {
+ // it was allocated into the static buffer
+ if (old_ptr >= pStaticAllocBuf && old_ptr <= pStaticAllocBuf + STATIC_ALLOC_SIZE)
+ {
+ if (g_pLastAllocated == old_ptr)
+ {
+ // nothing was allocated after this
+ size_t old_size = g_iStaticAllocated - ((size_t)g_pLastAllocated - (size_t)pStaticAllocBuf);
+ size_t diff = size - old_size;
+ if (diff > 0)
+ g_iStaticAllocated += diff;
+ return old_ptr;
+ }
+ else
+ {
+ return malloc(size);
+ }
+ }
+
+ if (g_ppMemAllocSingleton && *g_ppMemAllocSingleton)
+ return (*g_ppMemAllocSingleton)->m_vtable->Realloc(*g_ppMemAllocSingleton, old_ptr, size);
+ return nullptr;
+}
+
+void* operator new(size_t n)
+{
+ return malloc(n);
+}
+
+void operator delete(void* p)
+{
+ return free(p);
+}