int find_symbol_by_name(Context * ctx, int frame, ContextAddress ip, char * name, Symbol ** sym) { int found = 0; *sym = alloc_symbol(); (*sym)->ctx = ctx; if (frame == STACK_TOP_FRAME && (frame = get_top_frame(ctx)) < 0) return -1; if (find_pe_symbol_by_name(ctx, frame, ip, name, *sym) >= 0) found = 1; else if (get_error_code(errno) != ERR_SYM_NOT_FOUND) return -1; #if ENABLE_RCBP_TEST if (!found) { int sym_class = 0; void * address = NULL; if (find_test_symbol(ctx, name, &address, &sym_class) >= 0) found = 1; else if (get_error_code(errno) != ERR_SYM_NOT_FOUND) return -1; if (found) { (*sym)->ctx = ctx->mem; (*sym)->sym_class = sym_class; (*sym)->address = (ContextAddress)address; } } #endif if (!found) { if (find_basic_type_symbol(ctx, name, *sym) >= 0) found = 1; else if (get_error_code(errno) != ERR_SYM_NOT_FOUND) return -1; } if (!found) { errno = ERR_SYM_NOT_FOUND; return -1; } assert(frame >= 0 || (*sym)->ctx == ctx->mem); assert((*sym)->ctx == ((*sym)->frame ? ctx : ctx->mem)); assert((*sym)->frame == ((*sym)->ctx == (*sym)->ctx->mem ? 0u : frame - STACK_NO_FRAME)); return 0; }
void send_event_register_changed(const char * id) { unsigned i; Context * ctx = NULL; int frame = STACK_NO_FRAME; RegisterDefinition * def = NULL; OutputStream * out = &broadcast_group->out; id2register(id, &ctx, &frame, &def); if (ctx == NULL) return; for (i = 0; i < listener_cnt; i++) { Listener * l = listeners + i; if (l->func->register_changed == NULL) continue; l->func->register_changed(ctx, frame, def, l->args); } if (frame >= 0 && frame == get_top_frame(ctx)) { id = register2id(ctx, STACK_TOP_FRAME, def); } write_stringz(out, "E"); write_stringz(out, REGISTERS); write_stringz(out, "registerChanged"); json_write_string(out, id); write_stream(out, 0); write_stream(out, MARKER_EOM); }
int find_symbol_by_addr(Context * ctx, int frame, ContextAddress addr, Symbol ** sym) { *sym = alloc_symbol(); (*sym)->ctx = ctx; if (frame == STACK_TOP_FRAME && (frame = get_top_frame(ctx)) < 0) return -1; if (find_pe_symbol_by_addr(ctx, frame, addr, *sym) < 0) return -1; assert(frame >= 0 || (*sym)->ctx == ctx->mem); assert((*sym)->ctx == ((*sym)->frame ? ctx : ctx->mem)); assert((*sym)->frame == ((*sym)->ctx == (*sym)->ctx->mem ? 0u : frame - STACK_NO_FRAME)); return 0; }
int enumerate_symbols(Context * ctx, int frame, EnumerateSymbolsCallBack * call_back, void * args) { ULONG64 buffer[(sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR) + sizeof(ULONG64) - 1) / sizeof(ULONG64)]; SYMBOL_INFO * symbol = (SYMBOL_INFO *)buffer; IMAGEHLP_STACK_FRAME stack_frame; EnumerateSymbolsContext enum_context; HANDLE process = get_context_handle(ctx->parent == NULL ? ctx : ctx->parent); symbol->SizeOfStruct = sizeof(SYMBOL_INFO); symbol->MaxNameLen = MAX_SYM_NAME; if (frame == STACK_TOP_FRAME) frame = get_top_frame(ctx); if (frame == STACK_TOP_FRAME) return -1; if (get_stack_frame(ctx, frame, 0, &stack_frame) < 0) return -1; if (!SymSetContext(process, &stack_frame, NULL)) { DWORD err = GetLastError(); if (err == ERROR_SUCCESS) { /* Don't know why Windows does that */ } else { set_win32_errno(err); return -1; } } enum_context.ctx = ctx; enum_context.frame = frame; enum_context.call_back = call_back; enum_context.args = args; if (!SymEnumSymbols(process, 0, NULL, enumerate_symbols_proc, &enum_context)) { set_win32_errno(GetLastError()); return -1; } return 0; }