aboutsummaryrefslogtreecommitdiff
path: root/primedev/core
diff options
context:
space:
mode:
authorp0358 <p0358@users.noreply.github.com>2024-09-08 00:48:12 +0200
committerGitHub <noreply@github.com>2024-09-08 00:48:12 +0200
commit8824340644b0da9d30c35232789acdea93db2569 (patch)
tree72eecb9c5b80b28b9f00955e8cc1160284ff76a0 /primedev/core
parent8c546ed68c83b42cdff32d9b848b25ec2cba9c18 (diff)
downloadNorthstarLauncher-1.28.1-rc1.tar.gz
NorthstarLauncher-1.28.1-rc1.zip
Set thread names for game threads (#666)v1.28.1-rc1v1.28.1v1.28.0-rc5v1.28.0-rc4v1.28.0
Adds nice thread names that can be visible in crash dumps, non-attachable debuggers and generally in all places where old method of throwing exceptions to attached debugger on game start wouldn't work
Diffstat (limited to 'primedev/core')
-rw-r--r--primedev/core/tier0.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/primedev/core/tier0.cpp b/primedev/core/tier0.cpp
index dd5ac245..639b3bf8 100644
--- a/primedev/core/tier0.cpp
+++ b/primedev/core/tier0.cpp
@@ -18,11 +18,40 @@ void TryCreateGlobalMemAlloc()
g_pMemAllocSingleton = CreateGlobalMemAlloc(); // if it already exists, this returns the preexisting IMemAlloc instance
}
+HRESULT WINAPI _SetThreadDescription(HANDLE hThread, PCWSTR lpThreadDescription)
+{
+ // need to grab it dynamically as this function was only introduced at some point in Windows 10
+ static decltype(&SetThreadDescription) _SetThreadDescription =
+ CModule("KernelBase.dll").GetExportedFunction("SetThreadDescription").RCast<decltype(&SetThreadDescription)>();
+
+ if (_SetThreadDescription)
+ return _SetThreadDescription(hThread, lpThreadDescription);
+
+ return ERROR_OLD_WIN_VERSION;
+}
+
+static void(__fastcall* o_pThreadSetDebugName)(HANDLE threadHandle, const char* name) = nullptr;
+static void __fastcall h_ThreadSetDebugName(HANDLE threadHandle, const char* name)
+{
+ if (threadHandle == 0)
+ threadHandle = GetCurrentThread();
+
+ // TODO: This "method" of "charset conversion" from string to wstring is abhorrent. Change it to a proper one
+ // as soon as Northstar has some helper function to do proper charset conversions.
+ auto tmp = std::string(name);
+ _SetThreadDescription(threadHandle, std::wstring(tmp.begin(), tmp.end()).c_str());
+
+ o_pThreadSetDebugName(threadHandle, name);
+}
+
ON_DLL_LOAD("tier0.dll", Tier0GameFuncs, (CModule module))
{
// shouldn't be necessary, but do this just in case
TryCreateGlobalMemAlloc();
+ o_pThreadSetDebugName = module.GetExportedFunction("ThreadSetDebugName").RCast<decltype(o_pThreadSetDebugName)>();
+ HookAttach(&(PVOID&)o_pThreadSetDebugName, (PVOID)h_ThreadSetDebugName);
+
// setup tier0 funcs
CommandLine = module.GetExportedFunction("CommandLine").RCast<CommandLineType>();
Plat_FloatTime = module.GetExportedFunction("Plat_FloatTime").RCast<Plat_FloatTimeType>();