#pragma once #include #include namespace details { template class wrap_func_cdecl_ { void* m_function_ptr; public: explicit wrap_func_cdecl_(uintptr_t ptr, void* base) { m_function_ptr = static_cast(base) + ptr; } TRet operator()(Args... args) { return reinterpret_cast(m_function_ptr)(args...); } }; template class wrap_func_std_ { void* m_function_ptr; public: explicit wrap_func_std_(uintptr_t ptr, void* base) { m_function_ptr = static_cast(base) + ptr; } TRet operator()(Args... args) { return reinterpret_cast(m_function_ptr)(args...); } }; template class wrap_func_cdecl_import_ { void* m_base; void* m_function_ptr; uint32_t m_ordinal; public: explicit wrap_func_cdecl_import_(uint32_t ordinal, void* base) { m_base = base; m_function_ptr = nullptr; m_ordinal = ordinal; } TRet operator()(Args... args) { if (!m_function_ptr) { m_function_ptr = reinterpret_cast(GetProcAddress(reinterpret_cast(m_base), reinterpret_cast(m_ordinal))); } return reinterpret_cast(m_function_ptr)(args...); } }; template class wrap_func_std_import_ { void* m_base; void* m_function_ptr; uint32_t m_ordinal; public: explicit wrap_func_std_import_(uint32_t ordinal, void* base) { m_base = base; m_function_ptr = nullptr; m_ordinal = ordinal; } TRet operator()(Args... args) { if (!m_function_ptr) { m_function_ptr = reinterpret_cast(GetProcAddress(reinterpret_cast(m_base), reinterpret_cast(m_ordinal))); } return reinterpret_cast(m_function_ptr)(args...); } }; template class wrap_func_fast_import_ { void* m_base; void* m_function_ptr; uint32_t m_ordinal; public: explicit wrap_func_fast_import_(uint32_t ordinal, void* base) { m_base = base; m_function_ptr = nullptr; m_ordinal = ordinal; } TRet operator()(Args... args) { if (!m_function_ptr) { m_function_ptr = reinterpret_cast(GetProcAddress(reinterpret_cast(m_base), reinterpret_cast(m_ordinal))); } return reinterpret_cast(m_function_ptr)(args...); } }; template class wrap_func_fast_ { void* m_function_ptr; public: explicit wrap_func_fast_(uintptr_t ptr, void* base) { m_function_ptr = static_cast(base) + ptr; } TRet operator()(Args... args) { return reinterpret_cast(m_function_ptr)(args...); } }; } template class wrap_func_cdecl {}; template class wrap_func_cdecl : public details::wrap_func_cdecl_ { public: wrap_func_cdecl(uintptr_t ptr, void* base) : wrap_func_cdecl_(ptr, base) {}; }; template class wrap_func_cdecl_import {}; template class wrap_func_cdecl_import : public details::wrap_func_cdecl_import_ { public: wrap_func_cdecl_import(uint32_t ordinal, void* base) : wrap_func_cdecl_import_(ordinal, base) {}; }; template class wrap_func_std {}; template class wrap_func_std : public details::wrap_func_std_ { public: wrap_func_std(uintptr_t ptr, void* base) : wrap_func_std_(ptr, base) {}; }; template class wrap_func_std_import {}; template class wrap_func_std_import : public details::wrap_func_std_import_ { public: wrap_func_std_import(uint32_t ordinal, void* base) : wrap_func_std_import_(ordinal, base) {}; }; template class wrap_func_fast_import {}; template class wrap_func_fast_import : public details::wrap_func_fast_import_ { public: wrap_func_fast_import(uint32_t ordinal, void* base) : wrap_func_fast_import_(ordinal, base) {}; }; template class wrap_func_fast {}; template class wrap_func_fast : public details::wrap_func_fast_ { public: wrap_func_fast(uintptr_t ptr, void* base) : wrap_func_fast_(ptr, base) {}; }; template class wrap_value { TType* m_value; public: wrap_value(uintptr_t ptr, void* base) { // Fuck off, I'm gonna cast it in C-style because of templates // ReSharper disable once CppCStyleCast m_value = (TType*)(static_cast(base) + ptr); } operator void* () const { return m_value; } operator TType* () const { return m_value; } };