From 4c4d605d10109e02708984755405bbe0947ef5c4 Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Thu, 8 Jul 2021 15:33:31 +0100 Subject: initial commit --- NorthstarDedicatedTest/hooks.cpp | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 NorthstarDedicatedTest/hooks.cpp (limited to 'NorthstarDedicatedTest/hooks.cpp') diff --git a/NorthstarDedicatedTest/hooks.cpp b/NorthstarDedicatedTest/hooks.cpp new file mode 100644 index 00000000..a3be154d --- /dev/null +++ b/NorthstarDedicatedTest/hooks.cpp @@ -0,0 +1,90 @@ +#include "pch.h" +#include "hooks.h" +#include "hookutils.h" +#include "dedicated.h" +#include "tier0.h" + +#include +#include +#include + +typedef HMODULE(*LoadLibraryExAType)(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); +HMODULE LoadLibraryExAHook(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); + +typedef HMODULE(*LoadLibraryExWType)(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); +HMODULE LoadLibraryExWHook(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); + +LoadLibraryExAType LoadLibraryExAOriginal; +LoadLibraryExWType LoadLibraryExWOriginal; + +void InstallInitialHooks() +{ + //AllocConsole(); + + if (MH_Initialize() != MH_OK) + Error("MH_Initialize failed"); + + HookEnabler hook; + ENABLER_CREATEHOOK(hook, &LoadLibraryExA, &LoadLibraryExAHook, reinterpret_cast(&LoadLibraryExAOriginal)); + ENABLER_CREATEHOOK(hook, &LoadLibraryExW, &LoadLibraryExWHook, reinterpret_cast(&LoadLibraryExWOriginal)); +} + +// dll load callback stuff +// this allows for code to register callbacks to be run as soon as a dll is loaded, mainly to allow for patches to be made on dll load +struct DllLoadCallback +{ + std::string dll; + DllLoadCallbackFuncType callback; + bool called; +}; + +std::vector dllLoadCallbacks; + +void AddDllLoadCallback(std::string dll, DllLoadCallbackFuncType callback) +{ + DllLoadCallback* callbackStruct = new DllLoadCallback; + callbackStruct->dll = dll; + callbackStruct->callback = callback; + callbackStruct->called = false; + + dllLoadCallbacks.push_back(callbackStruct); +} + +HMODULE LoadLibraryExAHook(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) +{ + HMODULE moduleAddress = LoadLibraryExAOriginal(lpLibFileName, hFile, dwFlags); + + if (moduleAddress) + { + for (auto& callbackStruct : dllLoadCallbacks) + { + if (!callbackStruct->called && strstr(lpLibFileName + (strlen(lpLibFileName) - strlen(callbackStruct->dll.c_str())), callbackStruct->dll.c_str()) != nullptr) + { + callbackStruct->callback(moduleAddress); + callbackStruct->called = true; + } + } + } + + return moduleAddress; +} + +HMODULE LoadLibraryExWHook(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) +{ + HMODULE moduleAddress = LoadLibraryExWOriginal(lpLibFileName, hFile, dwFlags); + + if (moduleAddress) + { + for (auto& callbackStruct : dllLoadCallbacks) + { + const wchar_t* callbackDll = std::wstring(callbackStruct->dll.begin(), callbackStruct->dll.end()).c_str(); + if (!callbackStruct->called && wcsstr(lpLibFileName + (wcslen(lpLibFileName) - wcslen(callbackDll)), callbackDll) != nullptr) + { + callbackStruct->callback(moduleAddress); + callbackStruct->called = true; + } + } + } + + return moduleAddress; +} \ No newline at end of file -- cgit v1.2.3