static void command_get_address_info_cache_client(void * x) { int err = 0; Channel * c = cache_channel(); CommandAddressInfo * args = (CommandAddressInfo *)x; Context * ctx = NULL; const char * isa = NULL; ContextAddress range_addr = 0; ContextAddress range_size = 0; ContextAddress plt = 0; ctx = id2ctx(args->id); if (ctx == NULL) err = ERR_INV_CONTEXT; if (!err && get_context_isa(ctx, args->addr, &isa, &range_addr, &range_size) < 0) err = errno; if (!err) plt = is_plt_section(ctx, args->addr); cache_exit(); write_stringz(&c->out, "R"); write_stringz(&c->out, args->token); write_errno(&c->out, err); if (!err) { write_stream(&c->out, '{'); json_write_string(&c->out, "Addr"); write_stream(&c->out, ':'); json_write_uint64(&c->out, range_addr); write_stream(&c->out, ','); json_write_string(&c->out, "Size"); write_stream(&c->out, ':'); json_write_uint64(&c->out, range_size); if (isa != NULL) { write_stream(&c->out, ','); json_write_string(&c->out, "ISA"); write_stream(&c->out, ':'); json_write_string(&c->out, isa); } if (plt != 0) { write_stream(&c->out, ','); json_write_string(&c->out, "PLT"); write_stream(&c->out, ':'); json_write_uint64(&c->out, plt); } write_stream(&c->out, '}'); write_stream(&c->out, 0); } else { write_stringz(&c->out, "null"); } write_stream(&c->out, MARKER_EOM); }
int context_get_isa(Context * ctx, ContextAddress addr, ContextISA * isa) { memset(isa, 0, sizeof(ContextISA)); #if defined(__i386__) isa->def = "386"; #elif defined(__x86_64__) isa->def = "X86_64"; #else isa->def = NULL; #endif #if SERVICE_Symbols if (get_context_isa(ctx, addr, &isa->isa, &isa->addr, &isa->size) < 0) return -1; #endif return 0; }