fix tls patch on windows (#328)
* fix tls patch on windows based on TlsGetValue in kernel32.dll * fix tls patch on windows for expansion slots
This commit is contained in:
parent
680192a0c4
commit
361412031c
|
@ -285,20 +285,24 @@ static void GenerateTcbAccess(const ZydisDecodedOperand* operands, Xbyak::CodeGe
|
||||||
const auto slot = GetTcbKey();
|
const auto slot = GetTcbKey();
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
// The following logic is based on the wine implementation of TlsGetValue
|
// The following logic is based on the Kernel32.dll asm of TlsGetValue
|
||||||
// https://github.com/wine-mirror/wine/blob/a27b9551/dlls/kernelbase/thread.c#L719
|
|
||||||
static constexpr u32 TlsSlotsOffset = 0x1480;
|
static constexpr u32 TlsSlotsOffset = 0x1480;
|
||||||
static constexpr u32 TlsExpansionSlotsOffset = 0x1780;
|
static constexpr u32 TlsExpansionSlotsOffset = 0x1780;
|
||||||
static constexpr u32 TlsMinimumAvailable = 64;
|
static constexpr u32 TlsMinimumAvailable = 64;
|
||||||
|
|
||||||
const u32 teb_offset = slot < TlsMinimumAvailable ? TlsSlotsOffset : TlsExpansionSlotsOffset;
|
|
||||||
const u32 tls_index = slot < TlsMinimumAvailable ? slot : slot - TlsMinimumAvailable;
|
|
||||||
|
|
||||||
// Load the pointer to the table of TLS slots.
|
// Load the pointer to the table of TLS slots.
|
||||||
c.putSeg(gs);
|
c.putSeg(gs);
|
||||||
c.mov(dst, ptr[reinterpret_cast<void*>(teb_offset)]);
|
if (slot < TlsMinimumAvailable) {
|
||||||
|
// Load the pointer to TLS slots.
|
||||||
|
c.mov(dst, ptr[reinterpret_cast<void*>(TlsSlotsOffset + slot * sizeof(LPVOID))]);
|
||||||
|
} else {
|
||||||
|
const u32 tls_index = slot - TlsMinimumAvailable;
|
||||||
|
|
||||||
|
// Load the pointer to the table of TLS expansion slots.
|
||||||
|
c.mov(dst, ptr[reinterpret_cast<void*>(TlsExpansionSlotsOffset)]);
|
||||||
// Load the pointer to our buffer.
|
// Load the pointer to our buffer.
|
||||||
c.mov(dst, qword[dst + tls_index * sizeof(LPVOID)]);
|
c.mov(dst, qword[dst + tls_index * sizeof(LPVOID)]);
|
||||||
|
}
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
// The following logic is based on the Darwin implementation of _os_tsd_get_direct, used by
|
// The following logic is based on the Darwin implementation of _os_tsd_get_direct, used by
|
||||||
// pthread_getspecific https://github.com/apple/darwin-xnu/blob/main/libsyscall/os/tsd.h#L89-L96
|
// pthread_getspecific https://github.com/apple/darwin-xnu/blob/main/libsyscall/os/tsd.h#L89-L96
|
||||||
|
|
Loading…
Reference in New Issue