static struct bfd_ctx * get_bc(struct output_buffer *ob , struct bfd_set *set , const char *procname) { while(set->name) { if (strcmp(set->name , procname) == 0) { return set->bc; } set = set->next; } struct bfd_ctx bc; if (init_bfd_ctx(&bc, procname , ob)) { return NULL; } set->next = calloc(1, sizeof(*set)); set->bc = malloc(sizeof(struct bfd_ctx)); memcpy(set->bc, &bc, sizeof(bc)); set->name = strdup(procname); return set->bc; }
struct bfd_ctx* get_bc (struct output_buffer* ob, struct bfd_set* set, const char* procname) { struct bfd_ctx bc; while (set->name) { if (Q_streq(set->name, procname)) { return set->bc; } set = set->next; } if (init_bfd_ctx(&bc, procname, ob)) { return nullptr; } set->next = (bfd_set*)calloc(1, sizeof(*set)); set->bc = (bfd_ctx*)malloc(sizeof(struct bfd_ctx)); memcpy(set->bc, &bc, sizeof(bc)); set->name = strdup(procname); return set->bc; }
bfd_ctx * get_bc(bfd_set * set , PCWSTR procname) { LogTrace(); while(set->name) { if (wcscmp(set->name , procname) == 0) return set->bc; set = set->next; } bfd_ctx bc; if (init_bfd_ctx(&bc, procname )) { return NULL; } LogTrace(); set->next = (bfd_set*)calloc(1, sizeof(*set)); set->bc = (bfd_ctx*)malloc(sizeof(bfd_ctx)); memcpy(set->bc, &bc, sizeof(bc)); set->name = wcsdup(procname); return set->bc; }
static void _backtrace(struct output_buffer *ob, struct bfd_ctx *bc, int depth , LPCONTEXT context) { if (init_bfd_ctx(bc,ob)) return; STACKFRAME frame; memset(&frame,0,sizeof(frame)); frame.AddrPC.Offset = context->Eip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = context->Esp; frame.AddrStack.Mode = AddrModeFlat; frame.AddrFrame.Offset = context->Ebp; frame.AddrFrame.Mode = AddrModeFlat; HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; char module_name_raw[MAX_PATH]; while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, &frame, context, 0, SymFunctionTableAccess, SymGetModuleBase, 0)) { --depth; if (depth < 0) break; IMAGEHLP_SYMBOL *symbol = (IMAGEHLP_SYMBOL *)symbol_buffer; symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->MaxNameLength = 254; DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); const char * module_name = "[unknown module]"; if (module_base && GetModuleFileNameA((HINSTANCE)module_base, module_name_raw, MAX_PATH)) module_name = module_name_raw; const char * file; const char * func; unsigned line; find(bc,frame.AddrPC.Offset,&file,&func,&line); if (file == NULL) { DWORD dummy = 0; if (SymGetSymFromAddr(process, frame.AddrPC.Offset, &dummy, symbol)) { file = symbol->Name; } else { file = "[unknown file]"; } } if (func == NULL) { func = "[unknown func]"; } output_print(ob,"0x%x : %s : %s (%d) : in function (%s) \n", frame.AddrPC.Offset, module_name, file, line, func); } }