diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-09-18 19:07:28 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-09-18 19:07:28 (GMT) |
commit | 175e8193759e01b45b1f6d2d7970e2993ec8c364 (patch) | |
tree | a762e3fe34d843e764497bd00412eb91d8317fd1 /plugins/mobicore/mclf.c | |
parent | 264be7bafd7ab92ddadc5c0d9d5c4489c9cda5d4 (diff) |
Updated the MCLF format support.
Diffstat (limited to 'plugins/mobicore/mclf.c')
-rw-r--r-- | plugins/mobicore/mclf.c | 163 |
1 files changed, 132 insertions, 31 deletions
diff --git a/plugins/mobicore/mclf.c b/plugins/mobicore/mclf.c index 37939f7..65a7af0 100644 --- a/plugins/mobicore/mclf.c +++ b/plugins/mobicore/mclf.c @@ -49,6 +49,18 @@ static void g_mclf_format_dispose(GMCLFFormat *); /* Procède à la libération totale de la mémoire. */ static void g_mclf_format_finalize(GMCLFFormat *); +/* Indique la désignation interne du format. */ +static const char *g_mclf_format_get_name(const GMCLFFormat *); + +/* Fournit une description humaine du format. */ +static const char *g_mclf_format_get_description(const GMCLFFormat *); + +/* Assure l'interprétation d'un format en différé. */ +static bool g_mclf_format_analyze(GMCLFFormat *, wgroup_id_t, GtkStatusStack *); + +/* Informe quant au boutisme utilisé. */ +static SourceEndian g_mclf_format_get_endianness(const GMCLFFormat *); + /* Indique le type d'architecture visée par le format. */ static const char *g_mclf_format_get_target_machine(const GMCLFFormat *); @@ -59,39 +71,28 @@ static void g_mclf_format_refine_portions(GMCLFFormat *); /****************************************************************************** * * -* Paramètres : content = contenu binaire à parcourir. * -* parent = éventuel format exécutable déjà chargé. * -* unused = adresse non utilisée ici. * -* key = identifiant de format trouvé ou NULL. [OUT] * +* Paramètres : content = contenu binaire à traiter. * * * -* Description : Indique si le format peut être pris en charge ici. * +* Description : Valide un contenu comme étant un format Mobicore. * * * -* Retour : Désignation du format reconnu ou NULL si aucun. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -FormatMatchStatus mclf_is_matching(GBinContent *content, GExeFormat *parent, void *unused, char **key) +bool check_mclf_format(const GBinContent *content) { - FormatMatchStatus result; /* Bilan à renvoyer */ + bool result; /* Bilan à faire remonter */ vmpa2t addr; /* Tête de lecture initiale */ - bool status; /* Bilan des accès mémoire */ char magic[4]; /* Idenfiant standard */ init_vmpa(&addr, 0, VMPA_NO_VIRTUAL); - status = g_binary_content_read_raw(content, &addr, 4, (bin_t *)magic); + result = g_binary_content_read_raw(content, &addr, 4, (bin_t *)magic); - status &= (memcmp(magic, MC_SERVICE_HEADER_MAGIC_STR, 4) == 0); - - if (status) - { - result = FMS_MATCHED; - *key = strdup("mclf"); - } - else - result = FMS_UNKNOWN; + if (result) + result = (memcmp(magic, MC_SERVICE_HEADER_MAGIC_STR, 4) == 0); return result; @@ -117,6 +118,7 @@ G_DEFINE_TYPE(GMCLFFormat, g_mclf_format, G_TYPE_EXE_FORMAT); static void g_mclf_format_class_init(GMCLFFormatClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GBinFormatClass *fmt; /* Version en format basique */ GExeFormatClass *exe; /* Version en exécutable */ object = G_OBJECT_CLASS(klass); @@ -124,6 +126,13 @@ static void g_mclf_format_class_init(GMCLFFormatClass *klass) object->dispose = (GObjectFinalizeFunc/* ! */)g_mclf_format_dispose; object->finalize = (GObjectFinalizeFunc)g_mclf_format_finalize; + fmt = G_BIN_FORMAT_CLASS(klass); + + fmt->get_name = (format_get_name_fc)g_mclf_format_get_name; + fmt->get_desc = (format_get_desc_fc)g_mclf_format_get_description; + fmt->analyze = (format_analyze_fc)g_mclf_format_analyze; + fmt->get_endian = (format_get_endian_fc)g_mclf_format_get_endianness; + exe = G_EXE_FORMAT_CLASS(klass); exe->get_machine = (get_target_machine_fc)g_mclf_format_get_target_machine; @@ -191,8 +200,6 @@ static void g_mclf_format_finalize(GMCLFFormat *format) /****************************************************************************** * * * Paramètres : content = contenu binaire à parcourir. * -* parent = éventuel format exécutable déjà chargé. * - status = barre de statut à tenir informée. * * * * Description : Prend en charge un nouveau format MCLF. * * * @@ -202,29 +209,123 @@ static void g_mclf_format_finalize(GMCLFFormat *format) * * ******************************************************************************/ -GBinFormat *g_mclf_format_new(GBinContent *content, GExeFormat *parent, GtkStatusStack *status) +GExeFormat *g_mclf_format_new(GBinContent *content) { GMCLFFormat *result; /* Structure à retourner */ + if (!check_mclf_format(content)) + return NULL; + result = g_object_new(G_TYPE_MCLF_FORMAT, NULL); g_binary_format_set_content(G_BIN_FORMAT(result), content); - if (!read_mclf_header(result, &result->header, result->endian)) - goto gmfn_error; + return G_EXE_FORMAT(result); + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* * +* Description : Indique la désignation interne du format. * +* * +* Retour : Description du format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const char *g_mclf_format_get_name(const GMCLFFormat *format) +{ + const char *result; /* Désignation à retourner */ + + result = "mclf"; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* * +* Description : Fournit une description humaine du format. * +* * +* Retour : Description du format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const char *g_mclf_format_get_description(const GMCLFFormat *format) +{ + const char *result; /* Désignation à retourner */ + + result = "MobiCore Load Format"; + + return result; + +} + - g_executable_format_setup_portions(G_EXE_FORMAT(result), status); +/****************************************************************************** +* * +* Paramètres : format = format chargé dont l'analyse est lancée. * +* gid = groupe de travail dédié. * +* status = barre de statut à tenir informée. * +* * +* Description : Assure l'interprétation d'un format en différé. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_mclf_format_analyze(GMCLFFormat *format, wgroup_id_t gid, GtkStatusStack *status) +{ + bool result; /* Bilan à retourner */ + GExeFormat *exe; /* Autre version du format */ - if (!load_mclf_symbols(result)) - goto gmfn_error; + result = false; - return G_BIN_FORMAT(result); + exe = G_EXE_FORMAT(format); - gmfn_error: + if (!read_mclf_header(format, &format->header, format->endian)) + goto error; - g_object_unref(G_OBJECT(result)); + g_executable_format_setup_portions(exe, status); - return NULL; + if (!load_mclf_symbols(format)) + goto error; + + result = true; + + error: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* * +* Description : Informe quant au boutisme utilisé. * +* * +* Retour : Indicateur de boutisme. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static SourceEndian g_mclf_format_get_endianness(const GMCLFFormat *format) +{ + return format->endian; } |