dbghelp: Implemented SymFunctionTableAccess.
This commit is contained in:
parent
2ed8b9f6b6
commit
bf97b03db5
|
@ -409,4 +409,5 @@ struct cpu cpu_i386 = {
|
||||||
4,
|
4,
|
||||||
i386_get_addr,
|
i386_get_addr,
|
||||||
i386_stack_walk,
|
i386_stack_walk,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,4 +59,5 @@ struct cpu cpu_ppc = {
|
||||||
4,
|
4,
|
||||||
ppc_get_addr,
|
ppc_get_addr,
|
||||||
ppc_stack_walk,
|
ppc_stack_walk,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
|
@ -124,9 +124,39 @@ done_err:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void* x86_64_find_runtime_function(struct module* module, DWORD64 addr)
|
||||||
|
{
|
||||||
|
#ifdef __x86_64__
|
||||||
|
RUNTIME_FUNCTION* rtf;
|
||||||
|
ULONG size;
|
||||||
|
int min, max;
|
||||||
|
|
||||||
|
rtf = (RUNTIME_FUNCTION*)pe_map_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size);
|
||||||
|
if (rtf) for (min = 0, max = size / sizeof(*rtf); min <= max; )
|
||||||
|
{
|
||||||
|
int pos = (min + max) / 2;
|
||||||
|
if (addr < module->module.BaseOfImage + rtf[pos].BeginAddress) max = pos - 1;
|
||||||
|
else if (addr >= module->module.BaseOfImage + rtf[pos].EndAddress) min = pos + 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rtf += pos;
|
||||||
|
while (rtf->UnwindData & 1) /* follow chained entry */
|
||||||
|
{
|
||||||
|
FIXME("RunTime_Function outside IMAGE_DIRECTORY_ENTRY_EXCEPTION unimplemented yet!\n");
|
||||||
|
/* we need to read into the other process */
|
||||||
|
/* rtf = (RUNTIME_FUNCTION*)(module->module.BaseOfImage + (rtf->UnwindData & ~1)); */
|
||||||
|
}
|
||||||
|
return rtf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct cpu cpu_x86_64 = {
|
struct cpu cpu_x86_64 = {
|
||||||
IMAGE_FILE_MACHINE_AMD64,
|
IMAGE_FILE_MACHINE_AMD64,
|
||||||
8,
|
8,
|
||||||
x86_64_get_addr,
|
x86_64_get_addr,
|
||||||
x86_64_stack_walk,
|
x86_64_stack_walk,
|
||||||
|
x86_64_find_runtime_function,
|
||||||
};
|
};
|
||||||
|
|
|
@ -475,6 +475,9 @@ struct cpu
|
||||||
|
|
||||||
/* stack manipulation */
|
/* stack manipulation */
|
||||||
BOOL (*stack_walk)(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame);
|
BOOL (*stack_walk)(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame);
|
||||||
|
|
||||||
|
/* module manipulation */
|
||||||
|
void* (*find_runtime_function)(struct module*, DWORD64 addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct cpu* dbghelp_current_cpu;
|
extern struct cpu* dbghelp_current_cpu;
|
||||||
|
|
|
@ -1087,3 +1087,26 @@ BOOL WINAPI SymRefreshModuleList(HANDLE hProcess)
|
||||||
|
|
||||||
return refresh_module_list(pcs);
|
return refresh_module_list(pcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SymFunctionTableAccess (DBGHELP.@)
|
||||||
|
*/
|
||||||
|
PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase)
|
||||||
|
{
|
||||||
|
return SymFunctionTableAccess64(hProcess, AddrBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SymFunctionTableAccess64 (DBGHELP.@)
|
||||||
|
*/
|
||||||
|
PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase)
|
||||||
|
{
|
||||||
|
struct process* pcs = process_find_by_handle(hProcess);
|
||||||
|
struct module* module;
|
||||||
|
|
||||||
|
if (!pcs || !dbghelp_current_cpu->find_runtime_function) return NULL;
|
||||||
|
module = module_find_by_addr(pcs, AddrBase, DMT_UNKNOWN);
|
||||||
|
if (!module) return NULL;
|
||||||
|
|
||||||
|
return dbghelp_current_cpu->find_runtime_function(module, AddrBase);
|
||||||
|
}
|
||||||
|
|
|
@ -1793,24 +1793,6 @@ BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SymFunctionTableAccess (DBGHELP.@)
|
|
||||||
*/
|
|
||||||
PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase)
|
|
||||||
{
|
|
||||||
WARN("(%p, 0x%08x): stub\n", hProcess, AddrBase);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SymFunctionTableAccess64 (DBGHELP.@)
|
|
||||||
*/
|
|
||||||
PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase)
|
|
||||||
{
|
|
||||||
WARN("(%p, %s): stub\n", hProcess, wine_dbgstr_longlong(AddrBase));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SymUnDName (DBGHELP.@)
|
* SymUnDName (DBGHELP.@)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue