gboolean
gum_quick_script_create_context (GumQuickScript * self,
GError ** error)
{
GumQuickCore * core = &self->core;
JSRuntime * rt;
JSContext * ctx;
GumESProgram * program;
JSValue global_obj;
GumQuickScope scope = { core, NULL, };
g_assert (self->ctx == NULL);
rt = gum_quick_script_backend_make_runtime (self->backend);
JS_SetRuntimeOpaque (rt, core);
ctx = JS_NewContext (rt);
JS_SetContextOpaque (ctx, core);
if (self->bytecode != NULL)
{
program = gum_quick_script_backend_read_program (self->backend, ctx,
self->bytecode, error);
}
else
{
program = gum_quick_script_backend_compile_program (self->backend, ctx,
self->name, self->source, error);
}
if (program == NULL)
goto malformed_program;
self->rt = rt;
self->ctx = ctx;
self->program = program;
global_obj = JS_GetGlobalObject (ctx);
JS_DefinePropertyValueStr (ctx, global_obj, "global",
JS_DupValue (ctx, global_obj), JS_PROP_C_W_E);
_gum_quick_core_init (core, self, ctx, global_obj,
gum_quick_script_backend_get_scope_mutex (self->backend),
program, gumjs_frida_source_map, &self->interceptor, &self->stalker,
gum_quick_script_emit,
gum_quick_script_backend_get_scheduler (self->backend));
core->current_scope = &scope;
_gum_quick_kernel_init (&self->kernel, global_obj, core);
_gum_quick_memory_init (&self->memory, global_obj, core);
_gum_quick_module_init (&self->module, global_obj, core);
_gum_quick_process_init (&self->process, global_obj, &self->module, core);
_gum_quick_thread_init (&self->thread, global_obj, core);
_gum_quick_file_init (&self->file, global_obj, core);
_gum_quick_checksum_init (&self->checksum, global_obj, core);
_gum_quick_stream_init (&self->stream, global_obj, core);
_gum_quick_socket_init (&self->socket, global_obj, &self->stream, core);
#ifdef HAVE_SQLITE
_gum_quick_database_init (&self->database, global_obj, core);
#endif
_gum_quick_interceptor_init (&self->interceptor, global_obj, core);
_gum_quick_api_resolver_init (&self->api_resolver, global_obj, core);
_gum_quick_symbol_init (&self->symbol, global_obj, core);
_gum_quick_cmodule_init (&self->cmodule, global_obj, core);
_gum_quick_instruction_init (&self->instruction, global_obj, core);
_gum_quick_code_writer_init (&self->code_writer, global_obj, core);
_gum_quick_code_relocator_init (&self->code_relocator, global_obj,
&self->code_writer, &self->instruction, core);
_gum_quick_stalker_init (&self->stalker, global_obj, &self->code_writer,
&self->instruction, core);
JS_FreeValue (ctx, global_obj);
core->current_scope = NULL;
g_free (self->source);
self->source = NULL;
g_bytes_unref (self->bytecode);
self->bytecode = NULL;
return TRUE;
malformed_program:
{
JS_FreeContext (ctx);
JS_FreeRuntime (rt);
return FALSE;
}
}