From d2ff8d97724640097f1a984d0ef160cc6a8c1159 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 14 Dec 2024 13:15:34 -0300 Subject: [PATCH] Cross-platform TLS. --- UnleashedRecomp/kernel/imports.cpp | 34 ++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/UnleashedRecomp/kernel/imports.cpp b/UnleashedRecomp/kernel/imports.cpp index 5bfc06a2..0878bc76 100644 --- a/UnleashedRecomp/kernel/imports.cpp +++ b/UnleashedRecomp/kernel/imports.cpp @@ -901,24 +901,50 @@ DWORD KeWaitForSingleObject(XDISPATCHER_HEADER* Object, DWORD WaitReason, DWORD return WaitForSingleObjectEx(handle, timeout, Alertable); } +static thread_local std::vector KeTlsValues; +static std::vector KeTlsFreeIndices; +static size_t KeTlsNextIndex = 0; +static std::mutex KeTlsAllocationMutex; + +static void KeTlsEnsureTlsCapacity(size_t index) +{ + if (KeTlsValues.size() <= index) + { + KeTlsValues.resize(index + 1, 0); + } +} + uint32_t KeTlsGetValue(DWORD dwTlsIndex) { - return (uint32_t)TlsGetValue(dwTlsIndex); + KeTlsEnsureTlsCapacity(dwTlsIndex); + return KeTlsValues[dwTlsIndex]; } BOOL KeTlsSetValue(DWORD dwTlsIndex, DWORD lpTlsValue) { - return TlsSetValue(dwTlsIndex, (LPVOID)lpTlsValue); + KeTlsEnsureTlsCapacity(dwTlsIndex); + KeTlsValues[dwTlsIndex] = lpTlsValue; + return TRUE; } DWORD KeTlsAlloc() { - return TlsAlloc(); + std::lock_guard lock(KeTlsAllocationMutex); + if (!KeTlsFreeIndices.empty()) + { + size_t index = KeTlsFreeIndices.front(); + KeTlsFreeIndices.pop_back(); + return index; + } + + return KeTlsNextIndex++; } BOOL KeTlsFree(DWORD dwTlsIndex) { - return TlsFree(dwTlsIndex); + std::lock_guard lock(KeTlsAllocationMutex); + KeTlsFreeIndices.push_back(dwTlsIndex); + return TRUE; } DWORD XMsgInProcessCall(uint32_t app, uint32_t message, XDWORD* param1, XDWORD* param2)