From cf4adcd6a9a857eb9d33c6f0235eed071be7e434 Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 13 Nov 2016 15:06:20 -0500 Subject: logic: pe_get_expsym_by_name(), pe_get_expsym_by_index(): improved interface. --- src/logic/pe_get_image_meta.c | 43 +++++++++++++++++++++++++++------------ src/output/pe_output_image_type.c | 2 +- 2 files changed, 31 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/logic/pe_get_image_meta.c b/src/logic/pe_get_image_meta.c index b4b21d3..ee2b632 100644 --- a/src/logic/pe_get_image_meta.c +++ b/src/logic/pe_get_image_meta.c @@ -59,9 +59,10 @@ int pe_get_block_section_index(const struct pe_image_meta * m, const struct pe_b return -1; } -const char * pe_get_expsym_by_name( +int pe_get_expsym_by_name( const struct pe_image_meta * m, - const char * name) + const char * name, + struct pe_expsym * expsym) { uint32_t offset; uint32_t * symrva; @@ -74,29 +75,45 @@ const char * pe_get_expsym_by_name( for (i=0; iedata.num_of_name_ptrs; i++) { sym = (const char *)m->image.addr + symrva[i] - offset; - if (!(strcmp(sym,name))) - return sym; + if (!(strcmp(sym,name))) { + if (expsym) { + expsym->name = sym; + expsym->eaddr = 0; + expsym->maddr = 0; + expsym->roffset = 0; + } + + return 0; + } } - return 0; + return -1; } -const char * pe_get_expsym_by_index( +int pe_get_expsym_by_index( const struct pe_image_meta * m, - unsigned index) + unsigned index, + struct pe_expsym * expsym) { uint32_t offset; uint32_t * symrva; - uintptr_t addr; + uintptr_t symaddr; if (index >= m->edata.num_of_name_ptrs) - return 0; + return -1; + + if (expsym) { + offset = m->hedata->virtual_addr - m->hedata->ptr_to_raw_data; + symrva = (uint32_t *)((uintptr_t)m->image.addr + (m->edata.name_ptr_rva - offset)); + symaddr = (uintptr_t)m->image.addr + symrva[index] - offset; - offset = m->hedata->virtual_addr - m->hedata->ptr_to_raw_data; - symrva = (uint32_t *)((uintptr_t)m->image.addr + (m->edata.name_ptr_rva - offset)); - addr = (uintptr_t)m->image.addr + symrva[index] - offset; + expsym->name = (const char *)symaddr; + expsym->eaddr = 0; + expsym->maddr = 0; + expsym->roffset = 0; + } - return (const char *)addr; + return 0; } int pe_get_image_meta( diff --git a/src/output/pe_output_image_type.c b/src/output/pe_output_image_type.c index b2a0bd7..21ae925 100644 --- a/src/output/pe_output_image_type.c +++ b/src/output/pe_output_image_type.c @@ -66,7 +66,7 @@ static const char * pretty_subsystem(const struct pe_unit_ctx * uctx) static bool pe_image_is_psxscl(const struct pe_unit_ctx * uctx) { return (!uctx->meta->summary.nimplibs - && pe_get_expsym_by_name(uctx->meta,"__psx_init")); + && !pe_get_expsym_by_name(uctx->meta,"__psx_init",0)); } static const char * pretty_framework(const struct pe_unit_ctx * uctx) -- cgit v1.2.3