From c13a6ba2bc291473d5e72d5a33bc9fb8cfc3ce2e Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 2 Nov 2018 21:54:20 -0500 Subject: pe_get_image_meta(), pe_get_image_framework(): init/use .m_framework member. --- src/info/pe_get_image_framework.c | 67 +--------------------------------- src/logic/pe_get_image_meta.c | 76 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 66 deletions(-) (limited to 'src') diff --git a/src/info/pe_get_image_framework.c b/src/info/pe_get_image_framework.c index c570371..84d2538 100644 --- a/src/info/pe_get_image_framework.c +++ b/src/info/pe_get_image_framework.c @@ -25,76 +25,11 @@ static const char * const pe_framework_str[PE_FRAMEWORK_CAP] = { [PE_FRAMEWORK_WIN32] = "win32", }; -static bool pe_image_is_psxscl(const struct pe_image_meta * m) -{ - return (!m->m_stats.t_nimplibs - && !pe_get_expsym_by_name(m,"__psx_init",0)); -} - -static bool pe_image_is_cygwin(const struct pe_image_meta * m) -{ - int i; - - for (i=0; im_stats.t_nimplibs; i++) - if (!(strcmp(m->m_idata[i].ih_name,"cygwin1.dll"))) - return true; - - return false; -} - -static bool pe_image_is_msys(const struct pe_image_meta * m) -{ - int i; - - for (i=0; im_stats.t_nimplibs; i++) - if (!(strcmp(m->m_idata[i].ih_name,"msys-2.0.dll"))) - return true; - - return false; -} - -static bool pe_image_is_mingw(const struct pe_image_meta * m) -{ - return ((pe_get_named_section_index(m,".CRT") >= 0) - && (pe_get_named_section_index(m,".bss") >= 0) - && (pe_get_named_section_index(m,".tls") >= 0)); -} - int pe_get_image_framework(const struct pe_image_meta * m, struct pe_info_string * infostr) { int framework; - if (pe_get_named_section_index(m,".midipix") >= 0) - framework = PE_FRAMEWORK_MIDIPIX; - - else if (pe_get_named_section_index(m,".freestd") >= 0) - framework = PE_FRAMEWORK_FREESTD; - - else if (pe_get_named_section_index(m,".cygheap") >= 0) - framework = PE_FRAMEWORK_CYGONE; - - else if (pe_image_is_psxscl(m)) - framework = PE_FRAMEWORK_PSXSCL; - - else if (pe_image_is_cygwin(m)) - framework = PE_FRAMEWORK_CYGWIN; - - else if (pe_image_is_msys(m)) - framework = PE_FRAMEWORK_MSYS; - - else if (pe_image_is_mingw(m)) - framework = PE_FRAMEWORK_MINGW; - - else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_POSIX_CUI) - framework = PE_FRAMEWORK_SUACON; - - else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_WINDOWS_CUI) - framework = PE_FRAMEWORK_WINCON; - - else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_WINDOWS_GUI) - framework = PE_FRAMEWORK_WIN32; - - else + if (((framework = m->m_framework) < 0) || (framework >= PE_FRAMEWORK_CAP)) framework = PE_FRAMEWORK_UNKNOWN; if (infostr) diff --git a/src/logic/pe_get_image_meta.c b/src/logic/pe_get_image_meta.c index d47b922..4943780 100644 --- a/src/logic/pe_get_image_meta.c +++ b/src/logic/pe_get_image_meta.c @@ -225,6 +225,81 @@ static void pe_detect_image_subtype(struct pe_image_meta * m) m->m_subtype = subtype; } +static bool pe_image_is_psxscl(const struct pe_image_meta * m) +{ + return (!m->m_stats.t_nimplibs + && !pe_get_expsym_by_name(m,"__psx_init",0)); +} + +static bool pe_image_is_cygwin(const struct pe_image_meta * m) +{ + int i; + + for (i=0; im_stats.t_nimplibs; i++) + if (!(strcmp(m->m_idata[i].ih_name,"cygwin1.dll"))) + return true; + + return false; +} + +static bool pe_image_is_msys(const struct pe_image_meta * m) +{ + int i; + + for (i=0; im_stats.t_nimplibs; i++) + if (!(strcmp(m->m_idata[i].ih_name,"msys-2.0.dll"))) + return true; + + return false; +} + +static bool pe_image_is_mingw(const struct pe_image_meta * m) +{ + return ((pe_get_named_section_index(m,".CRT") >= 0) + && (pe_get_named_section_index(m,".bss") >= 0) + && (pe_get_named_section_index(m,".tls") >= 0)); +} + +static void pe_detect_image_framework(struct pe_image_meta * m) +{ + int framework; + + if (pe_get_named_section_index(m,".midipix") >= 0) + framework = PE_FRAMEWORK_MIDIPIX; + + else if (pe_get_named_section_index(m,".freestd") >= 0) + framework = PE_FRAMEWORK_FREESTD; + + else if (pe_get_named_section_index(m,".cygheap") >= 0) + framework = PE_FRAMEWORK_CYGONE; + + else if (pe_image_is_psxscl(m)) + framework = PE_FRAMEWORK_PSXSCL; + + else if (pe_image_is_cygwin(m)) + framework = PE_FRAMEWORK_CYGWIN; + + else if (pe_image_is_msys(m)) + framework = PE_FRAMEWORK_MSYS; + + else if (pe_image_is_mingw(m)) + framework = PE_FRAMEWORK_MINGW; + + else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_POSIX_CUI) + framework = PE_FRAMEWORK_SUACON; + + else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_WINDOWS_CUI) + framework = PE_FRAMEWORK_WINCON; + + else if (m->m_opt.oh_img.coh_subsystem == PE_IMAGE_SUBSYSTEM_WINDOWS_GUI) + framework = PE_FRAMEWORK_WIN32; + + else + framework = PE_FRAMEWORK_UNKNOWN; + + m->m_framework = framework; +} + int pe_get_image_meta( const struct pe_driver_ctx * dctx, const struct pe_raw_image * image, @@ -445,6 +520,7 @@ int pe_get_image_meta( /* info */ pe_detect_image_abi(m); pe_detect_image_subtype(m); + pe_detect_image_framework(m); /* mdso abi */ if (m->h_dsometa || m->h_dsosyms) -- cgit v1.2.3