Skip to content

Commit 9a337a7

Browse files
committed
refactor clrhost
1 parent c84b46d commit 9a337a7

File tree

13 files changed

+768
-704
lines changed

13 files changed

+768
-704
lines changed

freedom/clrhost.cpp

Lines changed: 683 additions & 149 deletions
Large diffs are not rendered by default.

freedom/features/discord_rpc.cpp

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,75 @@
11
#include "features/discord_rpc.h"
22

3-
DWORD discord_rich_presence_code_start = 0;
4-
DWORD discord_rich_presence_jump_back = 0;
5-
DWORD discord_rich_presence_state_string_ptr = NULL;
6-
DWORD discord_rich_presence_large_text_string_ptr = NULL;
7-
DWORD discord_rich_presence_small_text_string_ptr = NULL;
3+
intptr_t drpc_code_start = 0;
4+
intptr_t drpc_jump_back = 0;
5+
intptr_t drpc_state_string_ptr = NULL;
6+
intptr_t drpc_state_string_gc_handle = NULL;
7+
intptr_t drpc_large_text_string_ptr = NULL;
8+
intptr_t drpc_large_text_string_gc_handle = NULL;
9+
intptr_t drpc_small_text_string_ptr = NULL;
10+
intptr_t drpc_small_text_string_gc_handle = NULL;
811

912
Hook<Detour32> DiscordRichPresenceHook;
1013

1114
void init_discord_rpc()
1215
{
13-
VARIANT v = invoke_csharp_method(L"Freedom.Utils", L"GetSetPresencePtr");
14-
if (variant_ok(v))
16+
drpc_code_start = get_set_presence_ptr();
17+
if (drpc_code_start)
1518
{
16-
discord_rich_presence_code_start = v.intVal;
17-
discord_rich_presence_jump_back = discord_rich_presence_code_start + 0x5;
18-
}
19-
if (discord_rich_presence_code_start)
20-
{
21-
DiscordRichPresenceHook = Hook<Detour32>(discord_rich_presence_code_start, (BYTE *)set_discord_rich_presence, 5);
22-
if (cfg_discord_rich_presence_enabled)
19+
drpc_jump_back = drpc_code_start + 0x5;
20+
DiscordRichPresenceHook = Hook<Detour32>(drpc_code_start, (BYTE *)set_drpc, 5);
21+
if (cfg_drpc_enabled)
2322
{
24-
enable_discord_rich_presence_hooks();
23+
enable_drpc_hooks();
2524

26-
if (cfg_discord_rich_presence_state[0] != '\0')
27-
set_discord_rpc_str(discord_rich_presence_state_wchar, cfg_discord_rich_presence_state, &discord_rich_presence_state_string_ptr);
25+
if (cfg_drpc_state[0] != '\0')
26+
set_discord_rpc_str(drpc_state_wchar, cfg_drpc_state, &drpc_state_string_ptr, &drpc_state_string_gc_handle);
2827

29-
if (cfg_discord_rich_presence_large_text[0] != '\0')
30-
set_discord_rpc_str(discord_rich_presence_large_text_wchar, cfg_discord_rich_presence_large_text, &discord_rich_presence_large_text_string_ptr);
28+
if (cfg_drpc_large_text[0] != '\0')
29+
set_discord_rpc_str(drpc_large_text_wchar, cfg_drpc_large_text, &drpc_large_text_string_ptr, &drpc_large_text_string_gc_handle);
3130

32-
if (cfg_discord_rich_presence_small_text[0] != '\0')
33-
set_discord_rpc_str(discord_rich_presence_small_text_wchar, cfg_discord_rich_presence_small_text, &discord_rich_presence_small_text_string_ptr);
31+
if (cfg_drpc_small_text[0] != '\0')
32+
set_discord_rpc_str(drpc_small_text_wchar, cfg_drpc_small_text, &drpc_small_text_string_ptr, &drpc_small_text_string_gc_handle);
3433
}
3534
}
3635
}
3736

38-
void set_discord_rpc_str(wchar_t *w_str, char *c_str, DWORD *output_str_ptr)
37+
void set_discord_rpc_str(wchar_t *w_str, char *c_str, intptr_t *output_str_ptr, intptr_t *output_str_gc_handle)
3938
{
40-
invoke_csharp_method(L"Freedom.Utils", L"FreeCSharpString", w_str);
39+
if (*output_str_gc_handle)
40+
free_managed_string(*output_str_gc_handle);
4141
int wchars_count = MultiByteToWideChar(CP_UTF8, 0, c_str, -1, NULL, 0);
4242
int bytes_written = MultiByteToWideChar(CP_UTF8, 0, c_str, -1, w_str, wchars_count);
4343
w_str[bytes_written] = '\0';
44-
VARIANT v = invoke_csharp_method(L"Freedom.Utils", L"GetCSharpStringPtr", w_str);
45-
if (variant_ok(v))
46-
*output_str_ptr = v.intVal;
44+
*output_str_ptr = allocate_managed_string(w_str, output_str_gc_handle);
4745
}
4846

49-
void enable_discord_rich_presence_hooks()
47+
void enable_drpc_hooks()
5048
{
5149
DiscordRichPresenceHook.Enable();
5250
}
5351

54-
void disable_discord_rich_presence_hooks()
52+
void disable_drpc_hooks()
5553
{
5654
DiscordRichPresenceHook.Disable();
5755
}
5856

59-
__declspec(naked) void set_discord_rich_presence()
57+
__declspec(naked) void set_drpc()
6058
{
6159
__asm {
6260
push esi
63-
mov eax, discord_rich_presence_state_string_ptr
61+
mov eax, drpc_state_string_ptr
6462
mov dword ptr [edx+0x4], eax
65-
mov esi, discord_rich_presence_large_text_string_ptr
63+
mov esi, drpc_large_text_string_ptr
6664
mov eax, [edx+0x10]
6765
mov dword ptr [eax+0x8], esi
68-
mov esi, discord_rich_presence_small_text_string_ptr
66+
mov esi, drpc_small_text_string_ptr
6967
mov dword ptr [eax+0x10], esi
7068
pop esi
7169
push ebp
7270
mov ebp,esp
7371
push edi
7472
push esi
75-
jmp [discord_rich_presence_jump_back]
73+
jmp [drpc_jump_back]
7674
}
7775
}

freedom/scan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ void destroy_hooks_except_swap()
546546
disable_replay_hooks();
547547
disable_flashlight_hooks();
548548
disable_score_multiplier_hooks();
549-
disable_discord_rich_presence_hooks();
549+
disable_drpc_hooks();
550550
disable_timewarp_hooks();
551551
disable_hidden_remover_hooks();
552552
disable_nt_user_send_input_patch();

freedom/ui/config.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ bool cfg_replay_hardrock = false;
1111
int cfg_relax_style = 'a'; // alternate
1212
bool cfg_score_multiplier_enabled = false;
1313
float cfg_score_multiplier_value = 1.f;
14-
bool cfg_discord_rich_presence_enabled = false;
14+
bool cfg_drpc_enabled = false;
1515
bool cfg_flashlight_enabled = false;
1616
bool cfg_timewarp_enabled = false;
1717
double cfg_timewarp_playback_rate = 200.0;
@@ -22,12 +22,12 @@ bool cfg_aimbot_lock = false;
2222
bool cfg_hidden_remover_enabled = false;
2323
bool cfg_show_debug_log = false;
2424

25-
char cfg_discord_rich_presence_state[512] = {0};
26-
char cfg_discord_rich_presence_large_text[512] = {0};
27-
char cfg_discord_rich_presence_small_text[512] = {0};
28-
wchar_t discord_rich_presence_state_wchar[512] = {0};
29-
wchar_t discord_rich_presence_large_text_wchar[512] = {0};
30-
wchar_t discord_rich_presence_small_text_wchar[512] = {0};
25+
char cfg_drpc_state[512] = {0};
26+
char cfg_drpc_large_text[512] = {0};
27+
char cfg_drpc_small_text[512] = {0};
28+
wchar_t drpc_state_wchar[512] = {0};
29+
wchar_t drpc_large_text_wchar[512] = {0};
30+
wchar_t drpc_small_text_wchar[512] = {0};
3131

3232
const char *get_imgui_ini_filename(HMODULE hMod)
3333
{
@@ -101,10 +101,10 @@ static void ConfigHandler_WriteAll(ImGuiContext *ctx, ImGuiSettingsHandler *hand
101101
buf->appendf("replay_keys=%d\n", (int)cfg_replay_keys);
102102
buf->appendf("sm_lock=%d\n", (int)cfg_score_multiplier_enabled);
103103
buf->appendf("sm_value=%.2f\n", cfg_score_multiplier_value);
104-
buf->appendf("drpc=%d\n", (int)cfg_discord_rich_presence_enabled);
105-
buf->appendf("drpc_state=%s\n", cfg_discord_rich_presence_state);
106-
buf->appendf("drpc_large=%s\n", cfg_discord_rich_presence_large_text);
107-
buf->appendf("drpc_small=%s\n", cfg_discord_rich_presence_small_text);
104+
buf->appendf("drpc=%d\n", (int)cfg_drpc_enabled);
105+
buf->appendf("drpc_state=%s\n", cfg_drpc_state);
106+
buf->appendf("drpc_large=%s\n", cfg_drpc_large_text);
107+
buf->appendf("drpc_small=%s\n", cfg_drpc_small_text);
108108
buf->appendf("fl=%d\n", (int)cfg_flashlight_enabled);
109109
buf->appendf("hd=%d\n", (int)cfg_hidden_remover_enabled);
110110
buf->appendf("tw_lock=%d\n", (int)cfg_timewarp_enabled);
@@ -117,7 +117,7 @@ static void ConfigHandler_WriteAll(ImGuiContext *ctx, ImGuiSettingsHandler *hand
117117
static void ConfigHandler_ReadLine(ImGuiContext *, ImGuiSettingsHandler *, void *, const char *line)
118118
{
119119
int ar_lock_i, cs_lock_i, od_lock_i, mod_menu_visible_i, font_size_i,
120-
relax_lock_i, aimbot_lock_i, spins_per_minute_i, discord_rich_presence_enabled_i,
120+
relax_lock_i, aimbot_lock_i, spins_per_minute_i, drpc_enabled_i,
121121
hidden_remover_enabled_i, flashlight_enabled_i, timewarp_enabled_i, relax_checks_od_i,
122122
jump_window_i, replay_i, replay_aim_i, replay_keys_i, score_multiplier_i,
123123
show_debug_i;
@@ -143,10 +143,10 @@ static void ConfigHandler_ReadLine(ImGuiContext *, ImGuiSettingsHandler *, void
143143
else if (sscanf(line, "replay_keys=%d", &replay_keys_i) == 1) cfg_replay_keys = replay_keys_i;
144144
else if (sscanf(line, "sm_lock=%d", &score_multiplier_i) == 1) cfg_score_multiplier_enabled = score_multiplier_i;
145145
else if (sscanf(line, "sm_value=%f", &score_multiplier_value_f) == 1) cfg_score_multiplier_value = score_multiplier_value_f;
146-
else if (sscanf(line, "drpc=%d", &discord_rich_presence_enabled_i) == 1) cfg_discord_rich_presence_enabled = discord_rich_presence_enabled_i;
147-
else if (sscanf(line, "drpc_state=%511[^\n]", cfg_discord_rich_presence_state) == 1) {}
148-
else if (sscanf(line, "drpc_large=%511[^\n]", cfg_discord_rich_presence_large_text) == 1) {}
149-
else if (sscanf(line, "drpc_small=%511[^\n]", cfg_discord_rich_presence_small_text) == 1) {}
146+
else if (sscanf(line, "drpc=%d", &drpc_enabled_i) == 1) cfg_drpc_enabled = drpc_enabled_i;
147+
else if (sscanf(line, "drpc_state=%511[^\n]", cfg_drpc_state) == 1) {}
148+
else if (sscanf(line, "drpc_large=%511[^\n]", cfg_drpc_large_text) == 1) {}
149+
else if (sscanf(line, "drpc_small=%511[^\n]", cfg_drpc_small_text) == 1) {}
150150
else if (sscanf(line, "fl=%d", &flashlight_enabled_i) == 1) cfg_flashlight_enabled = flashlight_enabled_i;
151151
else if (sscanf(line, "hd=%d", &hidden_remover_enabled_i) == 1) cfg_hidden_remover_enabled = hidden_remover_enabled_i;
152152
else if (sscanf(line, "tw_lock=%d", &timewarp_enabled_i) == 1) cfg_timewarp_enabled = timewarp_enabled_i;

freedom/ui/ui.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ void update_ui()
237237
selected_replay_offset ? update_tab("Replay", MenuTab::Replay, cfg_replay_enabled) : inactive_tab("Replay");
238238

239239
update_tab("Mods", MenuTab::Mods, cfg_flashlight_enabled || cfg_hidden_remover_enabled || cfg_score_multiplier_enabled);
240-
update_tab("Misc", MenuTab::Misc, cfg_discord_rich_presence_enabled);
240+
update_tab("Misc", MenuTab::Misc, cfg_drpc_enabled);
241241
update_tab("About", MenuTab::About);
242242

243243
if (ImGui::Selectable("Debug", false, ImGuiSelectableFlags_DontClosePopups))
@@ -312,7 +312,6 @@ void update_ui()
312312
ImGui::PopItemWidth();
313313
if (ImGui::IsItemDeactivatedAfterEdit())
314314
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
315-
ImGui::SetCursorPosY(ImGui::GetWindowHeight() - ImGui::GetFrameHeightWithSpacing());
316315
}
317316
if (selected_tab == MenuTab::Timewarp)
318317
{
@@ -422,36 +421,36 @@ void update_ui()
422421
ImGui::Text("Discord RPC Settings");
423422
ImGui::Dummy(ImVec2(.0f, 5.f));
424423

425-
if (ImGui::Checkbox("Enable", &cfg_discord_rich_presence_enabled))
424+
if (ImGui::Checkbox("Enable", &cfg_drpc_enabled))
426425
{
427-
cfg_discord_rich_presence_enabled ? enable_discord_rich_presence_hooks() : disable_discord_rich_presence_hooks();
426+
cfg_drpc_enabled ? enable_drpc_hooks() : disable_drpc_hooks();
428427
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
429428
}
430429

431430
ImGui::Dummy(ImVec2(.0f, 5.f));
432431

433-
if (!cfg_discord_rich_presence_enabled)
432+
if (!cfg_drpc_enabled)
434433
{
435434
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
436435
ImGui::PushStyleColor(ImGuiCol_Text, ITEM_DISABLED);
437436
}
438437
ImGui::PushItemWidth(ImGui::GetFontSize() * 16.f);
439-
if (ImGui::InputTextEx("##rpc_state", "State", cfg_discord_rich_presence_state, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
438+
if (ImGui::InputTextEx("##rpc_state", "State", cfg_drpc_state, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
440439
{
441440
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
442-
set_discord_rpc_str(discord_rich_presence_state_wchar, cfg_discord_rich_presence_state, &discord_rich_presence_state_string_ptr);
441+
set_discord_rpc_str(drpc_state_wchar, cfg_drpc_state, &drpc_state_string_ptr, &drpc_state_string_gc_handle);
443442
}
444-
if (ImGui::InputTextEx("##rpc_large_text", "Large Text", cfg_discord_rich_presence_large_text, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
443+
if (ImGui::InputTextEx("##rpc_large_text", "Large Text", cfg_drpc_large_text, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
445444
{
446445
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
447-
set_discord_rpc_str(discord_rich_presence_large_text_wchar, cfg_discord_rich_presence_large_text, &discord_rich_presence_large_text_string_ptr);
446+
set_discord_rpc_str(drpc_large_text_wchar, cfg_drpc_large_text, &drpc_large_text_string_ptr, &drpc_large_text_string_gc_handle);
448447
}
449-
if (ImGui::InputTextEx("##rpc_small_text", "Small Text", cfg_discord_rich_presence_small_text, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
448+
if (ImGui::InputTextEx("##rpc_small_text", "Small Text", cfg_drpc_small_text, 512, ImVec2(0, 0), ImGuiInputTextFlags_None))
450449
{
451450
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
452-
set_discord_rpc_str(discord_rich_presence_small_text_wchar, cfg_discord_rich_presence_small_text, &discord_rich_presence_small_text_string_ptr);
451+
set_discord_rpc_str(drpc_small_text_wchar, cfg_drpc_small_text, &drpc_small_text_string_ptr, &drpc_small_text_string_gc_handle);
453452
}
454-
if (!cfg_discord_rich_presence_enabled)
453+
if (!cfg_drpc_enabled)
455454
{
456455
ImGui::PopStyleColor();
457456
ImGui::PopItemFlag();
@@ -662,7 +661,7 @@ void draw_debug_log()
662661
colored_if_null("Osu Username", osu_username_code_start);
663662
colored_if_null("Window Manager", window_manager_code_start);
664663
colored_if_null("Score Multiplier", score_multiplier_code_start);
665-
colored_if_null("Discord RPC", discord_rich_presence_code_start);
664+
colored_if_null("Discord RPC", drpc_code_start);
666665
colored_if_null("Check Flashlight", check_flashlight_code_start);
667666
colored_if_null("Update Flashlight", update_flashlight_code_start);
668667
colored_if_null("Update Timing", update_timing_code_start);
@@ -731,7 +730,7 @@ void draw_debug_log()
731730
colored_if_null("AR", ar_hook_jump_back);
732731
colored_if_null("CS", cs_hook_jump_back);
733732
colored_if_null("OD", od_hook_jump_back);
734-
colored_if_null("Discord RPC", discord_rich_presence_jump_back);
733+
colored_if_null("Discord RPC", drpc_jump_back);
735734
colored_if_null("Beatmap Onload", beatmap_onload_hook_jump_back);
736735
colored_if_null("Check Timewarp 1", check_timewarp_hook_1_jump_back);
737736
colored_if_null("Check Timewarp 2", check_timewarp_hook_2_jump_back);

0 commit comments

Comments
 (0)