#pragma once #include #include namespace Memory { extern MODULEINFO GetModuleInfo(const char* szModule); extern bool IsAddressValidMod(const DWORD64 ptr, const char* moduleName); template bool IsValidPtr(ptrT ptr) { return !IsBadReadPtr(reinterpret_cast(ptr), sizeof(LPVOID)); } template bool IsValidPtrMod(ptrT ptr, const char* moduleName, const bool checkForVT = true) { return IsValidPtr(ptr) && IsAddressValidMod(checkForVT ? *(PDWORD64)(ptr) : (DWORD64)(ptr), moduleName); } template __forceinline ReturnType CallVT(LPVOID instance, Args... args) { using Fn = ReturnType(__thiscall*)(LPVOID, Args...); auto function = (*reinterpret_cast(instance))[Index]; return function(instance, args...); } template __forceinline ReturnType CallFromVT(LPVOID instance, LPVOID vtable, Args... args) { using Fn = ReturnType(__thiscall*)(LPVOID, Args...); auto function = reinterpret_cast(vtable)[Index]; return function(instance, args...); } }