void VMCALL hythread_set_self(hythread_t thread) { #ifndef _WIN64 # if (_MSC_VER >= 1400) __writefsdword(offsetof(NT_TIB, ArbitraryUserPointer), (unsigned long)thread); # else _asm{ mov eax, thread mov fs:[0x14], eax } # endif #else __writegsqword(offsetof(NT_TIB, ArbitraryUserPointer), thread); #endif }
void gum_tls_key_set_value (GumTlsKey key, gpointer value) { if (key < 64) { __writegsqword (0x1480 + key * sizeof (gpointer), (unsigned __int64) value); } else if (key < 1088) { gpointer * tls_expansion_slots = (gpointer) __readgsqword (0x1780); if (tls_expansion_slots != NULL) tls_expansion_slots[key - 64] = value; else { _gum_tls_key_set_tmp_value (key, value); TlsSetValue (key, value); _gum_tls_key_del_tmp_value (key); } } }