feat: added hooks to the api

This commit is contained in:
2025-11-18 22:01:37 +01:00
parent ce6c64d393
commit d341524e66
3 changed files with 59 additions and 13 deletions

View File

@@ -15,13 +15,17 @@ namespace fxn
static schedule_native_t _schedule_native;
typedef bool(*native_hook_t)(fxn::NativeContext* context, bool& call_original);
typedef void(*register_native_hook_t)(std::uint64_t hash, native_hook_t hook);
typedef size_t(*register_native_hook_t)(std::uint64_t hash, native_hook_t hook);
static register_native_hook_t _register_native_hook;
typedef void(*unregister_native_hook_t)(std::uint64_t hash, size_t index);
static unregister_native_hook_t _unregister_native_hook;
static void initialize(std::string_view module_name);
static void get_native_handler(std::uint64_t hash);
static void schedule_native(fxn::NativeContext* context, bool wait);
static void register_native_hook(std::uint64_t hash, native_hook_t hook);
static size_t register_native_hook(std::uint64_t hash, native_hook_t hook);
static void unregister_native_hook(std::uint64_t hash, size_t index);
};
template <std::uint64_t Hash, typename Ret, typename... Args>
@@ -31,6 +35,32 @@ namespace fxn
using native_hash = std::integral_constant<std::uint64_t, Hash>;
return_type operator()(Args... args);
static return_type invoke(Args... args)
{
invoker<Hash, Ret, Args...> inv;
return inv(args...);
}
};
template<std::uint64_t Hash>
struct native_hooker
{
private:
std::size_t _hook;
public:
using native_hash = std::integral_constant<std::uint64_t, Hash>;
native_hooker(fxn::invoker_base::native_hook_t hook)
{
_hook = fxn::invoker_base::register_native_hook(native_hash::value, hook);
}
~native_hooker()
{
fxn::invoker_base::unregister_native_hook(native_hash::value, _hook);
}
};
}
@@ -42,6 +72,7 @@ namespace fxn
inline invoker_base::get_native_handler_t invoker_base::_get_native_handler = nullptr;
inline invoker_base::schedule_native_t invoker_base::_schedule_native = nullptr;
inline invoker_base::register_native_hook_t invoker_base::_register_native_hook = nullptr;
inline invoker_base::unregister_native_hook_t invoker_base::_unregister_native_hook = nullptr;
inline void invoker_base::initialize(std::string_view module_name)
{
@@ -63,9 +94,14 @@ namespace fxn
GetProcAddress(mod, "fxn_register_native_hook")
);
invoker_base::_unregister_native_hook = reinterpret_cast<unregister_native_hook_t>(
GetProcAddress(mod, "fxn_unregister_native_hook")
);
if (!invoker_base::_get_native_handler ||
!invoker_base::_schedule_native ||
!invoker_base::_register_native_hook)
!invoker_base::_register_native_hook ||
!invoker_base::_unregister_native_hook)
{
exit(EXIT_FAILURE);
}
@@ -81,9 +117,14 @@ namespace fxn
invoker_base::_schedule_native(context, wait);
}
inline void invoker_base::register_native_hook(std::uint64_t hash, native_hook_t hook)
inline size_t invoker_base::register_native_hook(std::uint64_t hash, native_hook_t hook)
{
invoker_base::_register_native_hook(hash, hook);
return invoker_base::_register_native_hook(hash, hook);
}
inline void invoker_base::unregister_native_hook(std::uint64_t hash, size_t index)
{
invoker_base::_unregister_native_hook(hash, index);
}
template <std::uint64_t Hash, typename Ret, typename... Args>