2019-03-21 20:18:31 +01:00
|
|
|
#include "common.hpp"
|
|
|
|
#include "function_types.hpp"
|
|
|
|
#include "logger.hpp"
|
|
|
|
#include "gta/array.hpp"
|
|
|
|
#include "gta/player.hpp"
|
|
|
|
#include "gta/script_thread.hpp"
|
|
|
|
#include "gui.hpp"
|
|
|
|
#include "hooking.hpp"
|
|
|
|
#include "memory/module.hpp"
|
|
|
|
#include "natives.hpp"
|
|
|
|
#include "pointers.hpp"
|
|
|
|
#include "renderer.hpp"
|
|
|
|
#include "script_mgr.hpp"
|
|
|
|
|
2019-06-23 22:00:18 +02:00
|
|
|
#include <MinHook.h>
|
2019-03-21 20:18:31 +01:00
|
|
|
|
|
|
|
namespace big
|
|
|
|
{
|
|
|
|
hooking::hooking() :
|
2022-01-25 02:55:35 +01:00
|
|
|
// Swapchain
|
2022-10-30 19:32:51 +01:00
|
|
|
m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs)
|
2019-03-21 20:18:31 +01:00
|
|
|
{
|
|
|
|
m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present);
|
|
|
|
m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers);
|
|
|
|
|
2022-10-30 19:32:51 +01:00
|
|
|
// The only instances in that vector at this point should only be the "lazy" hooks
|
|
|
|
// aka the ones that still don't have their m_target assigned
|
|
|
|
for (auto& detour_hook_helper : m_detour_hook_helpers)
|
|
|
|
{
|
|
|
|
detour_hook_helper->m_detour_hook->set_target_and_create_hook(detour_hook_helper->m_on_hooking_available());
|
|
|
|
}
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::run_script_threads>("SH", g_pointers->m_run_script_threads);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::get_label_text>("GLT", g_pointers->m_get_label_text);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::multiplayer_chat_filter>("MCF", g_pointers->m_multiplayer_chat_filter);
|
|
|
|
|
2022-11-09 06:44:52 +08:00
|
|
|
detour_hook_helper::add<hooks::write_player_game_state_data_node>("WPGSDN", g_pointers->m_write_player_game_state_data_node);
|
2022-10-30 19:32:51 +01:00
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::gta_thread_start>("GTS", g_pointers->m_gta_thread_start);
|
|
|
|
detour_hook_helper::add<hooks::gta_thread_kill>("GTK", g_pointers->m_gta_thread_kill);
|
2022-11-12 18:35:28 +00:00
|
|
|
detour_hook_helper::add<hooks::init_native_tables>("INT", g_pointers->m_init_native_tables);
|
|
|
|
detour_hook_helper::add<hooks::script_vm>("SVM", g_pointers->m_script_vm);
|
2022-10-30 19:32:51 +01:00
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::network_player_mgr_init>("NPMI", g_pointers->m_network_player_mgr_init);
|
|
|
|
detour_hook_helper::add<hooks::network_player_mgr_shutdown>("NPMS", g_pointers->m_network_player_mgr_shutdown);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::received_event>("RE", g_pointers->m_received_event);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::send_net_info_to_lobby>("SNITL", g_pointers->m_send_net_info_to_lobby);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::assign_physical_index>("API", g_pointers->m_assign_physical_index);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::receive_net_message>("RNM", g_pointers->m_receive_net_message);
|
2022-11-19 01:49:36 +00:00
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::received_clone_create>("RCC", g_pointers->m_received_clone_create);
|
2022-10-30 19:32:51 +01:00
|
|
|
detour_hook_helper::add<hooks::received_clone_sync>("RCS", g_pointers->m_received_clone_sync);
|
2022-11-19 01:49:36 +00:00
|
|
|
detour_hook_helper::add<hooks::can_apply_data>("CAD", g_pointers->m_can_apply_data);
|
2022-10-30 19:32:51 +01:00
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::get_network_event_data>("GNED", g_pointers->m_get_network_event_data);
|
|
|
|
detour_hook_helper::add<hooks::write_player_gamer_data_node>("WPGDN", g_pointers->m_write_player_gamer_data_node);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::format_metric_for_sending>("FMFS", g_pointers->m_format_metric_for_sending);
|
|
|
|
|
2022-11-12 04:01:10 +08:00
|
|
|
detour_hook_helper::add<hooks::invalid_mods_crash_detour>("IMCD", g_pointers->m_invalid_mods_crash_detour);
|
|
|
|
|
2022-11-13 16:34:44 +00:00
|
|
|
detour_hook_helper::add<hooks::update_presence_attribute_int>("UPAI", g_pointers->m_update_presence_attribute_int);
|
|
|
|
detour_hook_helper::add<hooks::update_presence_attribute_string>("UPAS", g_pointers->m_update_presence_attribute_string);
|
|
|
|
|
2022-11-19 01:49:36 +00:00
|
|
|
detour_hook_helper::add<hooks::serialize_dynamic_entity_game_state_data_node>("SDEGSDN", g_pointers->m_serialize_dynamic_entity_game_state_data_node);
|
|
|
|
detour_hook_helper::add<hooks::serialize_ped_inventory_data_node>("SPIDN", g_pointers->m_serialize_ped_inventory_data_node);
|
|
|
|
detour_hook_helper::add<hooks::serialize_vehicle_gadget_data_node>("SVGDN", g_pointers->m_serialize_vehicle_gadget_data_node);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::handle_join_request>("HJR", g_pointers->m_handle_join_request);
|
|
|
|
|
|
|
|
detour_hook_helper::add<hooks::sort_session_details>("SSD", g_pointers->m_sort_session_details);
|
|
|
|
|
2019-03-21 20:18:31 +01:00
|
|
|
g_hooking = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
hooking::~hooking()
|
|
|
|
{
|
|
|
|
if (m_enabled)
|
2022-10-30 19:32:51 +01:00
|
|
|
{
|
2019-03-21 20:18:31 +01:00
|
|
|
disable();
|
2022-10-30 19:32:51 +01:00
|
|
|
}
|
2019-03-21 20:18:31 +01:00
|
|
|
|
|
|
|
g_hooking = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void hooking::enable()
|
|
|
|
{
|
|
|
|
m_swapchain_hook.enable();
|
2022-07-05 16:54:45 -04:00
|
|
|
m_og_wndproc = WNDPROC(SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, LONG_PTR(&hooks::wndproc)));
|
2019-03-21 20:18:31 +01:00
|
|
|
|
2022-10-30 19:32:51 +01:00
|
|
|
for (const auto& detour_hook_helper : m_detour_hook_helpers)
|
|
|
|
{
|
|
|
|
detour_hook_helper->m_detour_hook->enable();
|
|
|
|
}
|
2022-05-23 00:31:21 +02:00
|
|
|
|
2022-08-09 14:39:55 -04:00
|
|
|
MH_ApplyQueued();
|
|
|
|
|
2019-03-21 20:18:31 +01:00
|
|
|
m_enabled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void hooking::disable()
|
|
|
|
{
|
|
|
|
m_enabled = false;
|
|
|
|
|
2022-10-30 19:32:51 +01:00
|
|
|
for (const auto& detour_hook_helper : m_detour_hook_helpers)
|
|
|
|
{
|
|
|
|
detour_hook_helper->m_detour_hook->disable();
|
|
|
|
}
|
2022-08-09 14:39:55 -04:00
|
|
|
|
2019-03-21 20:18:31 +01:00
|
|
|
SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(m_og_wndproc));
|
|
|
|
m_swapchain_hook.disable();
|
2022-10-30 19:32:51 +01:00
|
|
|
|
|
|
|
MH_ApplyQueued();
|
|
|
|
|
|
|
|
for (const auto& detour_hook_helper : m_detour_hook_helpers)
|
|
|
|
{
|
|
|
|
delete detour_hook_helper;
|
|
|
|
}
|
|
|
|
m_detour_hook_helpers.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
hooking::detour_hook_helper::~detour_hook_helper()
|
|
|
|
{
|
|
|
|
delete m_detour_hook;
|
|
|
|
}
|
|
|
|
|
|
|
|
void hooking::detour_hook_helper::enable_hook_if_hooking_is_already_running()
|
|
|
|
{
|
|
|
|
if (g_hooking && g_hooking->m_enabled)
|
|
|
|
{
|
|
|
|
if (m_on_hooking_available)
|
|
|
|
{
|
|
|
|
m_detour_hook->set_target_and_create_hook(m_on_hooking_available());
|
|
|
|
}
|
|
|
|
|
|
|
|
m_detour_hook->enable();
|
|
|
|
MH_ApplyQueued();
|
|
|
|
}
|
2019-03-21 20:18:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool hooks::run_script_threads(std::uint32_t ops_to_execute)
|
|
|
|
{
|
2022-09-30 20:41:26 +02:00
|
|
|
g_native_invoker.cache_handlers();
|
|
|
|
|
|
|
|
if (g_running)
|
2019-03-21 20:18:31 +01:00
|
|
|
{
|
2022-09-30 20:41:26 +02:00
|
|
|
g_script_mgr.tick();
|
|
|
|
}
|
|
|
|
|
2022-10-30 19:32:51 +01:00
|
|
|
return g_hooking->get_original<run_script_threads>()(ops_to_execute);
|
2019-03-21 20:18:31 +01:00
|
|
|
}
|
|
|
|
}
|