aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan <sentrycraft123@gmail.com>2023-11-23 18:53:04 +0100
committerGitHub <noreply@github.com>2023-11-23 18:53:04 +0100
commitcfc53081ff38a7a0e29cc0b89644760a7ade33a1 (patch)
treef0b00aa5c06151da8c93f9c3dd9d7f167564b689
parent17217a39681c7fed35bee95195bdba7eaf508911 (diff)
downloadNorthstarLauncher-cfc53081ff38a7a0e29cc0b89644760a7ade33a1.tar.gz
NorthstarLauncher-cfc53081ff38a7a0e29cc0b89644760a7ade33a1.zip
Replace audio event fetching with hook (#603)
Takes the previous audio event code, which relied on reading out a register using masm, and replaces it with a new hook. Adapted from NorthstarPrime https://github.com/F1F7Y/NorthstarPrime Co-authored-by: F1F7Y <filip.bartos07@proton.me>
-rw-r--r--NorthstarDLL/CMakeLists.txt1
-rw-r--r--NorthstarDLL/audio_asm.asm8
-rw-r--r--NorthstarDLL/client/audio.cpp33
3 files changed, 11 insertions, 31 deletions
diff --git a/NorthstarDLL/CMakeLists.txt b/NorthstarDLL/CMakeLists.txt
index 5c275887..d238f61f 100644
--- a/NorthstarDLL/CMakeLists.txt
+++ b/NorthstarDLL/CMakeLists.txt
@@ -148,7 +148,6 @@ add_library(NorthstarDLL SHARED
"util/version.h"
"util/wininfo.cpp"
"util/wininfo.h"
- "audio_asm.asm"
"dllmain.cpp"
"dllmain.h"
"ns_version.h"
diff --git a/NorthstarDLL/audio_asm.asm b/NorthstarDLL/audio_asm.asm
deleted file mode 100644
index 1b2d3f8d..00000000
--- a/NorthstarDLL/audio_asm.asm
+++ /dev/null
@@ -1,8 +0,0 @@
-public Audio_GetParentEvent
-
-.code
-Audio_GetParentEvent proc
- mov rax, r12
- ret
-Audio_GetParentEvent endp
-end
diff --git a/NorthstarDLL/client/audio.cpp b/NorthstarDLL/client/audio.cpp
index 66d34404..aa32e390 100644
--- a/NorthstarDLL/client/audio.cpp
+++ b/NorthstarDLL/client/audio.cpp
@@ -10,11 +10,7 @@
AUTOHOOK_INIT()
-extern "C"
-{
- // should be called only in LoadSampleMetadata_Hook
- extern void* __fastcall Audio_GetParentEvent();
-}
+static const char* pszAudioEventName;
ConVar* Cvar_mileslog_enable;
ConVar* Cvar_ns_print_played_sounds;
@@ -366,32 +362,16 @@ bool ShouldPlayAudioEvent(const char* eventName, const std::shared_ptr<EventOver
return true; // good to go
}
-// forward declare
-bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal(
- uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType);
-
-// DO NOT TOUCH THIS FUNCTION
-// The actual logic of it in a separate function (forcefully not inlined) to preserve the r12 register, which holds the event pointer.
// clang-format off
AUTOHOOK(LoadSampleMetadata, mileswin64.dll + 0xF110,
bool, __fastcall, (void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType))
// clang-format on
{
- uintptr_t parentEvent = (uintptr_t)Audio_GetParentEvent();
-
// Raw source, used for voice data only
if (audioType == 0)
return LoadSampleMetadata(sample, audioBuffer, audioBufferLength, audioType);
- return LoadSampleMetadata_Internal(parentEvent, sample, audioBuffer, audioBufferLength, audioType);
-}
-
-// DO NOT INLINE THIS FUNCTION
-// See comment below.
-bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal(
- uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType)
-{
- char* eventName = (char*)parentEvent + 0x110;
+ const char* eventName = pszAudioEventName;
if (Cvar_ns_print_played_sounds->GetInt() > 0)
spdlog::info("[AUDIO] Playing event {}", eventName);
@@ -491,6 +471,15 @@ bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal(
}
// clang-format off
+AUTOHOOK(sub_1800294C0, mileswin64.dll + 0x294C0,
+void*, __fastcall, (void* a1, void* a2))
+// clang-format on
+{
+ pszAudioEventName = reinterpret_cast<const char*>((*((__int64*)a2 + 6)));
+ return sub_1800294C0(a1, a2);
+}
+
+// clang-format off
AUTOHOOK(MilesLog, client.dll + 0x57DAD0,
void, __fastcall, (int level, const char* string))
// clang-format on