#include "hooking/hooking.hpp" #include "pointers.hpp" #include #include namespace big { hooking::hooking() : m_swapchain_hook(*g_pointers->m_gta.m_swapchain, hooks::swapchain_num_funcs), m_sync_data_reader_hook(g_pointers->m_gta.m_sync_data_reader_vtable, 27), m_error_packet_memmove_hook(g_pointers->m_gta.m_error_packet_memmove, hooks::error_packet_memmove) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers); m_sync_data_reader_hook.hook(1, &hooks::sync_reader_serialize_dword); m_sync_data_reader_hook.hook(2, &hooks::sync_reader_serialize_word); m_sync_data_reader_hook.hook(3, &hooks::sync_reader_serialize_byte); m_sync_data_reader_hook.hook(4, &hooks::sync_reader_serialize_int32); m_sync_data_reader_hook.hook(5, &hooks::sync_reader_serialize_int16); m_sync_data_reader_hook.hook(6, &hooks::sync_reader_serialize_signed_byte); m_sync_data_reader_hook.hook(7, &hooks::sync_reader_serialize_bool); m_sync_data_reader_hook.hook(9, &hooks::sync_reader_serialize_int32); m_sync_data_reader_hook.hook(10, &hooks::sync_reader_serialize_int16); m_sync_data_reader_hook.hook(11, &hooks::sync_reader_serialize_signed_byte); m_sync_data_reader_hook.hook(13, &hooks::sync_reader_serialize_dword); m_sync_data_reader_hook.hook(14, &hooks::sync_reader_serialize_word); m_sync_data_reader_hook.hook(15, &hooks::sync_reader_serialize_byte); m_sync_data_reader_hook.hook(16, &hooks::sync_reader_serialize_signed_float); m_sync_data_reader_hook.hook(17, &hooks::sync_reader_serialize_float); m_sync_data_reader_hook.hook(18, &hooks::sync_reader_serialize_net_id); m_sync_data_reader_hook.hook(19, &hooks::sync_reader_serialize_vec3); m_sync_data_reader_hook.hook(21, &hooks::sync_reader_serialize_vec3_signed); m_sync_data_reader_hook.hook(23, &hooks::sync_reader_serialize_array); // 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_gta.m_run_script_threads); detour_hook_helper::add("GLT", g_pointers->m_gta.m_get_label_text); detour_hook_helper::add("GTS", g_pointers->m_gta.m_gta_thread_start); detour_hook_helper::add("GTK", g_pointers->m_gta.m_gta_thread_kill); detour_hook_helper::add("INT", g_pointers->m_gta.m_init_native_tables); detour_hook_helper::add("SVM", g_pointers->m_gta.m_script_vm); detour_hook_helper::add("NPMI", g_pointers->m_gta.m_network_player_mgr_init); detour_hook_helper::add("NPMS", g_pointers->m_gta.m_network_player_mgr_shutdown); detour_hook_helper::add("RE", g_pointers->m_gta.m_received_event); detour_hook_helper::add("API", g_pointers->m_gta.m_assign_physical_index); detour_hook_helper::add("RNM", g_pointers->m_gta.m_receive_net_message); detour_hook_helper::add("RCC", g_pointers->m_gta.m_received_clone_create); detour_hook_helper::add("RCS", g_pointers->m_gta.m_received_clone_sync); detour_hook_helper::add("CAD", g_pointers->m_gta.m_can_apply_data); detour_hook_helper::add("GNED", g_pointers->m_gta.m_get_network_event_data); detour_hook_helper::add("IDC", g_pointers->m_gta.m_invalid_decal_crash); detour_hook_helper::add("TPO", g_pointers->m_gta.m_task_parachute_object); detour_hook_helper::add("TAC", g_pointers->m_gta.m_task_ambient_clips); detour_hook_helper::add("UPAI", g_pointers->m_sc.m_update_presence_attribute_int); detour_hook_helper::add("UPAS", g_pointers->m_sc.m_update_presence_attribute_string); detour_hook_helper::add("HJR", g_pointers->m_gta.m_handle_join_request); detour_hook_helper::add("SSD", g_pointers->m_gta.m_sort_session_details); detour_hook_helper::add("SCM", g_pointers->m_gta.m_send_chat_message); detour_hook_helper::add("PMFR", g_pointers->m_gta.m_process_matchmaking_find_response); detour_hook_helper::add("SJRM", g_pointers->m_gta.m_serialize_join_request_message); detour_hook_helper::add("SJRM2", g_pointers->m_gta.m_serialize_join_request_message_2); detour_hook_helper::add("SMFS", g_pointers->m_gta.m_start_matchmaking_find_sessions); detour_hook_helper::add("BNA", g_pointers->m_gta.m_broadcast_net_array); detour_hook_helper::add("STOPVT", g_pointers->m_gta.m_serialize_take_off_ped_variation_task); detour_hook_helper::add("SPT", g_pointers->m_gta.m_serialize_parachute_task); detour_hook_helper::add("QD", g_pointers->m_gta.m_queue_dependency); detour_hook_helper::add("PMFS", g_pointers->m_gta.m_prepare_metric_for_sending); detour_hook_helper::add("HSR", g_pointers->m_gta.m_http_start_request); detour_hook_helper::add("FPC2", g_pointers->m_gta.m_fragment_physics_crash_2); detour_hook_helper::add("RAU", g_pointers->m_gta.m_received_array_update); detour_hook_helper::add("RPI", g_pointers->m_gta.m_receive_pickup); detour_hook_helper::add("SPCS", g_pointers->m_gta.m_send_player_card_stats); detour_hook_helper::add("SS", g_pointers->m_gta.m_serialize_stats); detour_hook_helper::add("GMI", g_pointers->m_gta.m_get_model_info); detour_hook_helper::add("TJC", g_pointers->m_gta.m_taskjump_constructor); detour_hook_helper::add("TFC", g_pointers->m_gta.m_taskfall_constructor); detour_hook_helper::add("EAD", g_pointers->m_gta.m_enumerate_audio_devices); detour_hook_helper::add("DSCC", g_pointers->m_gta.m_direct_sound_capture_create); detour_hook_helper::add("WVPMDN", g_pointers->m_gta.m_write_vehicle_proximity_migration_data_node); detour_hook_helper::add("NHM", g_pointers->m_gta.m_netfilter_handle_message); detour_hook_helper::add("E0MBH", g_pointers->m_gta.m_error_message_box); detour_hook_helper::add("E0MBH2", g_pointers->m_gta.m_error_message_box_2); detour_hook_helper::add("SNPPD", g_pointers->m_gta.m_send_non_physical_player_data); detour_hook_helper::add("UTCKD", g_pointers->m_gta.m_timecycle_keyframe_override); detour_hook_helper::add("AMR", g_pointers->m_gta.m_allocate_memory_reliable); detour_hook_helper::add("RP", g_pointers->m_gta.m_render_ped); detour_hook_helper::add("RE", g_pointers->m_gta.m_render_entity); detour_hook_helper::add("RBP", g_pointers->m_gta.m_render_big_ped); detour_hook_helper::add("RBS", g_pointers->m_gta.m_read_bits_single); detour_hook_helper::add("RCR", g_pointers->m_gta.m_received_clone_remove); detour_hook_helper::add("CCV", g_pointers->m_gta.m_can_create_vehicle); detour_hook_helper::add("FI", g_pointers->m_gta.m_format_int); detour_hook_helper::add("SLC", g_pointers->m_gta.m_searchlight_crash); detour_hook_helper::add("AS", g_pointers->m_gta.m_advertise_session); detour_hook_helper::add("USA", g_pointers->m_gta.m_update_session_advertisement); detour_hook_helper::add("US", g_pointers->m_gta.m_unadvertise_session); detour_hook_helper::add("SSDM", g_pointers->m_gta.m_send_session_detail_msg); detour_hook_helper::add("WND", g_pointers->m_gta.m_write_node_data); detour_hook_helper::add("CSNTP", g_pointers->m_gta.m_can_send_node_to_player); detour_hook_helper::add("WN", g_pointers->m_gta.m_write_node); detour_hook_helper::add("GDLCH", g_pointers->m_gta.m_get_dlc_hash); detour_hook_helper::add("AGTS", g_pointers->m_gta.m_add_gamer_to_session); detour_hook_helper::add("CPI", g_pointers->m_gta.m_create_pool_item); g_hooking = this; } hooking::~hooking() { if (m_enabled) { disable(); } g_hooking = nullptr; } void hooking::enable() { m_swapchain_hook.enable(); m_sync_data_reader_hook.enable(); m_error_packet_memmove_hook.enable(); m_og_wndproc = WNDPROC(SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, LONG_PTR(&hooks::wndproc))); for (auto& detour_hook_helper : m_detour_hook_helpers) { detour_hook_helper.m_detour_hook->enable(); } MH_ApplyQueued(); m_enabled = true; } void hooking::disable() { m_enabled = false; for (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_error_packet_memmove_hook.disable(); m_sync_data_reader_hook.disable(); m_swapchain_hook.disable(); MH_ApplyQueued(); m_detour_hook_helpers.clear(); } hooking::detour_hook_helper::~detour_hook_helper() { } 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(); } } }