aboutsummaryrefslogtreecommitdiff
path: root/LauncherInjector/memalloc.cpp
diff options
context:
space:
mode:
authorp0358 <p0358@users.noreply.github.com>2021-12-29 06:38:54 +0100
committerp0358 <p0358@users.noreply.github.com>2021-12-29 06:38:54 +0100
commit213bf6412410a09b0bdce62b8598bfa23ba096cf (patch)
tree68c650c35639a71e834d4e3fc964ee5bf65a9d28 /LauncherInjector/memalloc.cpp
parent8a1a2e97624d15617197248a5e292c5ead5e74a2 (diff)
downloadNorthstarLauncher-213bf6412410a09b0bdce62b8598bfa23ba096cf.tar.gz
NorthstarLauncher-213bf6412410a09b0bdce62b8598bfa23ba096cf.zip
Add direct launcher
Diffstat (limited to 'LauncherInjector/memalloc.cpp')
-rw-r--r--LauncherInjector/memalloc.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/LauncherInjector/memalloc.cpp b/LauncherInjector/memalloc.cpp
new file mode 100644
index 00000000..64bc7b76
--- /dev/null
+++ b/LauncherInjector/memalloc.cpp
@@ -0,0 +1,61 @@
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#include "memalloc.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 = 16384;
+
+size_t g_iStaticAllocated = 0;
+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) 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* operator new(size_t n)
+{
+ return malloc(n);
+}
+
+void operator delete(void* p)
+{
+ free(p);
+}