-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.cpp
More file actions
89 lines (73 loc) · 3.02 KB
/
Copy pathmain.cpp
File metadata and controls
89 lines (73 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "overlay.h"
namespace R5::Overlay {
Sdk::SharedMemory g_rtss_shm;
Hook g_cb_hook;
Sdk::OSD g_osd;
uintptr_t g_hooks_base = 0;
static auto __fastcall OurPrePresentCb() noexcept -> void {
if (!g_rtss_shm.Valid())
g_rtss_shm.TryInit(g_hooks_base);
auto &menu = Menu::Get();
if (g_rtss_shm.Valid())
menu.SetZoom(g_rtss_shm.GetOSDZoom(g_hooks_base));
if (Import::WasKeyPressed(VK_INSERT))
menu.ToggleVisibility();
int sw = 0;
int sh = 0;
if (g_rtss_shm.GetDisplaySize(g_hooks_base, &sw, &sh)) {
Global::g_screen_size.x = sw;
Global::g_screen_size.y = sh;
}
if (menu.IsVisible()) {
if (Import::WasKeyPressed(VK_UP)) menu.OnKeyUp();
if (Import::WasKeyPressed(VK_DOWN)) menu.OnKeyDown();
if (Import::WasKeyPressed(VK_LEFT)) menu.OnKeyLeft();
if (Import::WasKeyPressed(VK_RIGHT)) menu.OnKeyRight();
if (Import::WasKeyPressed(VK_RETURN)) menu.OnKeyEnter();
if (Import::WasKeyPressed(VK_TAB)) {
if (Import::IsKeyDown(VK_SHIFT)) menu.OnTabPrev();
else menu.OnTabNext();
}
}
if (g_rtss_shm.Valid()) {
g_osd.Reset();
g_osd.Text(8, 0, Colors::White, xorstr_("Internal Overlay By Legend"));
Menu::DrawMenu(g_osd);
g_osd.Commit(g_rtss_shm);
}
g_cb_hook.Original<void(__fastcall*)()>()();
}
auto CreateOverlayHook(uintptr_t hooks_base) noexcept -> void {
g_hooks_base = hooks_base;
auto *slot = reinterpret_cast<uintptr_t *>(hooks_base + Offsets::RTSS::k_pre_present_cb_rva);
auto *app_idx = reinterpret_cast<int32_t *>(hooks_base + Offsets::RTSS::k_app_entry_idx_rva);
Log::Message(Log::Information,
xorstr_("pre-present cb slot @ 0x%llx value = 0x%llx app_idx = %d"),
1, 1,
(unsigned long long) slot,
(unsigned long long) *slot,
*app_idx);
for (int i = 0; i < 200 && (!*slot || *app_idx == -1); ++i)
LI_FN(Sleep)(25);
if (!*slot) {
Log::Message(Log::Error, xorstr_("pre-present cb slot still zero"));
return;
}
if (*app_idx == -1) {
Log::Message(Log::Error, xorstr_("app entry index still -1"));
return;
}
if (!g_cb_hook.PointerSwapHook(
reinterpret_cast<uint64_t>(slot),
reinterpret_cast<void *>(&OurPrePresentCb))) {
Log::Message(Log::Error, xorstr_("PointerSwapHook failed"));
return;
}
Log::Message(Log::Information,
xorstr_("pre-present cb hooked: orig=0x%llx ours=0x%llx app_idx=%d"),
1, 1,
(unsigned long long) g_cb_hook.OriginalPointer(),
(unsigned long long) &OurPrePresentCb,
*app_idx);
}
}