#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" #include namespace big { hooking::hooking() : // Swapchain m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers); // 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("SH", g_pointers->m_run_script_threads); detour_hook_helper::add("GLT", g_pointers->m_get_label_text); detour_hook_helper::add("MCF", g_pointers->m_multiplayer_chat_filter); detour_hook_helper::add("WPGSDN", g_pointers->m_write_player_game_state_data_node); detour_hook_helper::add("GTS", g_pointers->m_gta_thread_start); detour_hook_helper::add("GTK", g_pointers->m_gta_thread_kill); detour_hook_helper::add("INT", g_pointers->m_init_native_tables); detour_hook_helper::add("SVM", g_pointers->m_script_vm); detour_hook_helper::add("NPMI", g_pointers->m_network_player_mgr_init); detour_hook_helper::add("NPMS", g_pointers->m_network_player_mgr_shutdown); detour_hook_helper::add("RE", g_pointers->m_received_event); detour_hook_helper::add("SNITL", g_pointers->m_send_net_info_to_lobby); detour_hook_helper::add("API", g_pointers->m_assign_physical_index); detour_hook_helper::add("RNM", g_pointers->m_receive_net_message); detour_hook_helper::add("RCC", g_pointers->m_received_clone_create); detour_hook_helper::add("RCS", g_pointers->m_received_clone_sync); detour_hook_helper::add("CAD", g_pointers->m_can_apply_data); detour_hook_helper::add("GNED", g_pointers->m_get_network_event_data); detour_hook_helper::add("WPGDN", g_pointers->m_write_player_gamer_data_node); detour_hook_helper::add("FMFS", g_pointers->m_format_metric_for_sending); detour_hook_helper::add("IMCD", g_pointers->m_invalid_mods_crash_detour); detour_hook_helper::add("UPAI", g_pointers->m_update_presence_attribute_int); detour_hook_helper::add("UPAS", g_pointers->m_update_presence_attribute_string); detour_hook_helper::add("SDEGSDN", g_pointers->m_serialize_dynamic_entity_game_state_data_node); detour_hook_helper::add("SPIDN", g_pointers->m_serialize_ped_inventory_data_node); detour_hook_helper::add("SVGDN", g_pointers->m_serialize_vehicle_gadget_data_node); detour_hook_helper::add("HJR", g_pointers->m_handle_join_request); detour_hook_helper::add("SSD", g_pointers->m_sort_session_details); detour_hook_helper::add("APTS", g_pointers->m_add_player_to_session); detour_hook_helper::add("SCNM", g_pointers->m_send_chat_net_message); detour_hook_helper::add("PMFR", g_pointers->m_process_matchmaking_find_response); detour_hook_helper::add("SJPD", g_pointers->m_serialize_player_data_msg); detour_hook_helper::add("SJRM", g_pointers->m_serialize_join_request_message); detour_hook_helper::add("SMFS", g_pointers->m_start_matchmaking_find_sessions); detour_hook_helper::add("BNA", g_pointers->m_broadcast_net_array); detour_hook_helper::add("SSMA", g_pointers->m_send_session_matchmaking_attributes); detour_hook_helper::add("STOPVT", g_pointers->m_serialize_take_off_ped_variation_task); detour_hook_helper::add("CSH", g_pointers->m_create_script_handler); detour_hook_helper::add("WBGH", g_pointers->m_write_bitbuffer_gamer_handle); detour_hook_helper::add("RBGH", g_pointers->m_read_bitbuffer_gamer_handle); g_hooking = this; } hooking::~hooking() { if (m_enabled) { disable(); } g_hooking = nullptr; } void hooking::enable() { m_swapchain_hook.enable(); m_og_wndproc = WNDPROC(SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, LONG_PTR(&hooks::wndproc))); for (const auto& detour_hook_helper : m_detour_hook_helpers) { detour_hook_helper->m_detour_hook->enable(); } for (auto& thread : *g_pointers->m_script_threads) { if (thread->m_handler) hook_script_handler((CGameScriptHandler*)thread->m_handler); } MH_ApplyQueued(); m_enabled = true; } void hooking::disable() { m_enabled = false; for (const auto& detour_hook_helper : m_detour_hook_helpers) { detour_hook_helper->m_detour_hook->disable(); } SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, reinterpret_cast(m_og_wndproc)); m_swapchain_hook.disable(); MH_ApplyQueued(); for (const auto& detour_hook_helper : m_detour_hook_helpers) { delete detour_hook_helper; } m_detour_hook_helpers.clear(); m_handler_hooks.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(); } } bool hooks::run_script_threads(std::uint32_t ops_to_execute) { g_native_invoker.cache_handlers(); if (g_running) { g_script_mgr.tick(); } return g_hooking->get_original()(ops_to_execute); } }