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;
}
Exemple #2
0
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;
}
Exemple #4
0
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);
	}
}