static NativeThreadFuncReturnType frida_agent_auto_ignorer_thread_create_proxy (void * data) { GumThreadId current_thread_id; FridaAutoInterceptContext * ctx = data; NativeThreadFuncReturnType result; current_thread_id = gum_process_get_current_thread_id (); gum_script_ignore (current_thread_id); result = ctx->thread_func (ctx->thread_data); g_object_unref (ctx->interceptor); g_slice_free (FridaAutoInterceptContext, ctx); gum_script_unignore (current_thread_id); return result; }
static void _gum_tls_key_del_tmp_value (GumTlsKey key) { guint i; GumThreadId tid = gum_process_get_current_thread_id (); gum_spinlock_acquire (&_gum_tls_tmp_keys_lock); for (i = 0; i != MAX_TMP_TLS_KEY; i++) { if (_gum_tls_tmp_keys[i].tid == tid && _gum_tls_tmp_keys[i].key == key) { memset (&_gum_tls_tmp_keys[i], 0, sizeof (_gum_tls_tmp_keys[i])); break; } } g_assert (i < MAX_TMP_TLS_KEY); gum_spinlock_release (&_gum_tls_tmp_keys_lock); }
static void gum_on_thread_realize (void) { GumInternalThreadDetails * details; guint i; gum_interceptor_ignore_current_thread (gum_cached_interceptor); details = g_slice_new (GumInternalThreadDetails); details->thread_id = gum_process_get_current_thread_id (); details->n_cloaked_ranges = gum_thread_try_get_ranges (details->cloaked_ranges, GUM_MAX_THREAD_RANGES); gum_cloak_add_thread (details->thread_id); for (i = 0; i != details->n_cloaked_ranges; i++) gum_cloak_add_range (&details->cloaked_ranges[i]); /* This allows us to free the data no matter how the thread exits */ g_private_set (&gum_internal_thread_details_key, details); }
static gpointer _gum_tls_key_get_tmp_value (GumTlsKey key) { guint i; GumThreadId tid = gum_process_get_current_thread_id (); gpointer value = NULL; gum_spinlock_acquire (&_gum_tls_tmp_keys_lock); for (i = 0; i != MAX_TMP_TLS_KEY; i++) { if (_gum_tls_tmp_keys[i].tid == tid && _gum_tls_tmp_keys[i].key == key) { value = _gum_tls_tmp_keys[i].value; break; } } gum_spinlock_release (&_gum_tls_tmp_keys_lock); return value; }
static void _gum_tls_key_set_tmp_value (GumTlsKey key, gpointer value) { guint i; GumThreadId tid = gum_process_get_current_thread_id (); gum_spinlock_acquire (&_gum_tls_tmp_keys_lock); for (i = 0; i != MAX_TMP_TLS_KEY; i++) { if (_gum_tls_tmp_keys[i].tid == 0) { _gum_tls_tmp_keys[i].tid = tid; _gum_tls_tmp_keys[i].key = key; _gum_tls_tmp_keys[i].value = value; break; } } g_assert (i < MAX_TMP_TLS_KEY); gum_spinlock_release (&_gum_tls_tmp_keys_lock); }