예제 #1
0
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
}
예제 #2
0
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);
    }
  }
}