summaryrefslogtreecommitdiff
path: root/plugins/mobicore/mclf.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mobicore/mclf.c')
-rw-r--r--plugins/mobicore/mclf.c163
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;
}