2022-06-02 03:14:44 -05:00
|
|
|
#pragma once
|
|
|
|
|
2023-01-02 01:12:14 +01:00
|
|
|
#include "structs.hpp"
|
|
|
|
#include <utils/nt.hpp>
|
|
|
|
|
2023-03-19 18:21:48 +01:00
|
|
|
namespace arxan::detail
|
|
|
|
{
|
|
|
|
void set_address_to_call(const void* address);
|
|
|
|
extern void* callstack_proxy_addr;
|
|
|
|
}
|
|
|
|
|
2022-06-02 03:14:44 -05:00
|
|
|
namespace game
|
|
|
|
{
|
2022-11-11 17:19:26 +01:00
|
|
|
size_t get_base();
|
2023-01-01 21:46:36 +01:00
|
|
|
bool is_server();
|
2023-03-04 13:42:56 +01:00
|
|
|
bool is_client();
|
|
|
|
bool is_legacy_client();
|
2022-08-10 11:26:19 +02:00
|
|
|
|
2022-11-11 17:19:26 +01:00
|
|
|
inline size_t relocate(const size_t val)
|
|
|
|
{
|
2023-01-02 13:57:00 +01:00
|
|
|
if (!val) return 0;
|
|
|
|
|
2022-11-11 17:19:26 +01:00
|
|
|
const auto base = get_base();
|
|
|
|
return base + (val - 0x140000000);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t derelocate(const size_t val)
|
|
|
|
{
|
2023-01-02 13:57:00 +01:00
|
|
|
if (!val) return 0;
|
|
|
|
|
2022-11-11 17:19:26 +01:00
|
|
|
const auto base = get_base();
|
|
|
|
return (val - base) + 0x140000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t derelocate(const void* val)
|
|
|
|
{
|
|
|
|
return derelocate(reinterpret_cast<size_t>(val));
|
|
|
|
}
|
2022-06-02 06:49:43 -05:00
|
|
|
|
2023-01-02 13:57:00 +01:00
|
|
|
inline size_t select(const size_t client_val, const size_t server_val)
|
|
|
|
{
|
|
|
|
return relocate(is_server() ? server_val : client_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t select(const void* client_val, const void* server_val)
|
|
|
|
{
|
|
|
|
return select(reinterpret_cast<size_t>(client_val), reinterpret_cast<size_t>(server_val));
|
|
|
|
}
|
|
|
|
|
2022-06-02 03:14:44 -05:00
|
|
|
template <typename T>
|
2023-03-19 18:21:48 +01:00
|
|
|
class base_symbol
|
2022-06-02 03:14:44 -05:00
|
|
|
{
|
|
|
|
public:
|
2023-03-19 18:21:48 +01:00
|
|
|
base_symbol(const size_t address)
|
2022-11-09 17:10:08 +01:00
|
|
|
: address_(address)
|
2022-06-02 03:14:44 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-03-19 18:21:48 +01:00
|
|
|
base_symbol(const size_t address, const size_t server_address)
|
2023-01-02 13:57:00 +01:00
|
|
|
: address_(address)
|
|
|
|
, server_address_(server_address)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-06-02 03:14:44 -05:00
|
|
|
T* get() const
|
|
|
|
{
|
2023-01-02 13:57:00 +01:00
|
|
|
return reinterpret_cast<T*>(select(this->address_, this->server_address_));
|
2022-06-02 03:14:44 -05:00
|
|
|
}
|
|
|
|
|
2022-11-09 17:10:08 +01:00
|
|
|
operator T*() const
|
2022-06-02 03:14:44 -05:00
|
|
|
{
|
|
|
|
return this->get();
|
|
|
|
}
|
|
|
|
|
|
|
|
T* operator->() const
|
|
|
|
{
|
|
|
|
return this->get();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2023-01-02 13:57:00 +01:00
|
|
|
size_t address_{};
|
|
|
|
size_t server_address_{};
|
2022-06-02 03:14:44 -05:00
|
|
|
};
|
2023-02-18 19:13:13 +01:00
|
|
|
|
2023-03-19 18:21:48 +01:00
|
|
|
template <typename T>
|
2023-03-19 21:22:59 +01:00
|
|
|
struct symbol : base_symbol<T>
|
2023-03-19 18:21:48 +01:00
|
|
|
{
|
|
|
|
using base_symbol<T>::base_symbol;
|
2023-03-19 21:22:59 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T, typename... Args>
|
|
|
|
struct symbol<T(Args...)> : base_symbol<T(Args...)>
|
|
|
|
{
|
|
|
|
using func_type = T(Args...);
|
2023-03-19 18:21:48 +01:00
|
|
|
|
2023-03-19 21:22:59 +01:00
|
|
|
using base_symbol<func_type>::base_symbol;
|
|
|
|
|
|
|
|
T call_safe(Args... args)
|
2023-03-19 18:21:48 +01:00
|
|
|
{
|
|
|
|
arxan::detail::set_address_to_call(this->get());
|
2023-03-19 21:22:59 +01:00
|
|
|
return static_cast<func_type*>(arxan::detail::callstack_proxy_addr)(args...);
|
2023-03-19 18:21:48 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2023-02-18 19:13:13 +01:00
|
|
|
std::filesystem::path get_appdata_path();
|
2022-06-02 03:14:44 -05:00
|
|
|
}
|
|
|
|
|
2022-11-11 17:19:26 +01:00
|
|
|
inline size_t operator"" _g(const size_t val)
|
|
|
|
{
|
|
|
|
return game::relocate(val);
|
|
|
|
}
|
|
|
|
|
2023-01-02 13:57:00 +01:00
|
|
|
#include "structs.hpp"
|
2022-06-02 03:14:44 -05:00
|
|
|
#include "symbols.hpp"
|