summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2021-10-24 18:17:53 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2021-10-24 18:17:53 (GMT)
commita27f101ec7351a006537e819f9af55271620bc50 (patch)
treea4ca058dc05e71732234febf58160bf61957786e
parent810bce688d9b0e271d86886e182b62aa7166319f (diff)
Link a class to loaded content nature.
-rw-r--r--plugins/pychrysalide/analysis/loaded.c116
-rw-r--r--src/analysis/binary.c41
-rw-r--r--src/analysis/loaded-int.h6
-rw-r--r--src/analysis/loaded.c9
-rw-r--r--src/analysis/loaded.h4
-rw-r--r--src/analysis/project.c6
-rw-r--r--src/gui/dialogs/loading.c8
7 files changed, 139 insertions, 51 deletions
diff --git a/plugins/pychrysalide/analysis/loaded.c b/plugins/pychrysalide/analysis/loaded.c
index 607f57c..89762d3 100644
--- a/plugins/pychrysalide/analysis/loaded.c
+++ b/plugins/pychrysalide/analysis/loaded.c
@@ -57,8 +57,8 @@ static void py_loaded_content_init_gclass(GLoadedContentClass *, gpointer);
/* Fournit le contenu représenté de l'élément chargé. */
static GBinContent *py_loaded_content_get_content_wrapper(const GLoadedContent *);
-/* Fournit le format associé à l'élément chargé. */
-static char *py_loaded_content_get_format_name_wrapper(const GLoadedContent *);
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+static char *py_loaded_content_get_content_class_wrapper(const GLoadedContent *, bool);
/* Lance l'analyse propre à l'élément chargé. */
static bool py_loaded_content_analyze_wrapper(GLoadedContent *, bool, bool, wgroup_id_t, GtkStatusStack *);
@@ -113,8 +113,11 @@ static PyObject *py_loaded_content_build_view(PyObject *, PyObject *);
/* Fournit le contenu représenté de l'élément chargé. */
static PyObject *py_loaded_content_get_content(PyObject *, void *);
-/* Fournit le format associé à l'élément chargé. */
-static PyObject *py_loaded_content_get_format_name(PyObject *, void *);
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+static PyObject *py_loaded_content_get_content_class(PyObject *, void *);
+
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+static PyObject *py_loaded_content_get_content_class_for_human(PyObject *, void *);
@@ -159,7 +162,7 @@ static PyObject *py_loaded_content_new(PyTypeObject *type, PyObject *args, PyObj
"\n" \
"The following methods have to be defined for new implementations:\n" \
"* pychrysalide.analysis.storage.LoadedContent._get_content();\n" \
- "* pychrysalide.analysis.storage.LoadedContent._get_format_name();\n" \
+ "* pychrysalide.analysis.storage.LoadedContent._get_content_class();\n" \
"* pychrysalide.analysis.storage.LoadedContent._analyze();\n" \
"* pychrysalide.analysis.storage.LoadedContent._describe();\n" \
"* pychrysalide.analysis.storage.LoadedContent._count_views();\n" \
@@ -225,7 +228,7 @@ static PyObject *py_loaded_content_new(PyTypeObject *type, PyObject *args, PyObj
static void py_loaded_content_init_gclass(GLoadedContentClass *class, gpointer unused)
{
class->get_content = py_loaded_content_get_content_wrapper;
- class->get_format_name = py_loaded_content_get_format_name_wrapper;
+ class->get_content_class = py_loaded_content_get_content_class_wrapper;
class->analyze = py_loaded_content_analyze_wrapper;
@@ -301,31 +304,34 @@ static GBinContent *py_loaded_content_get_content_wrapper(const GLoadedContent *
/******************************************************************************
* *
* Paramètres : content = élément chargé à manipuler. *
+* human = description humaine attendue ? *
* *
-* Description : Fournit le format associé à l'élément chargé. *
+* Description : Décrit la nature du contenu reconnu pour l'élément chargé. *
* *
-* Retour : Format associé à l'élément chargé. *
+* Retour : Classe de contenu associée à l'élément chargé. *
* *
* Remarques : - *
* *
******************************************************************************/
-static char *py_loaded_content_get_format_name_wrapper(const GLoadedContent *content)
+static char *py_loaded_content_get_content_class_wrapper(const GLoadedContent *content, bool human)
{
char *result; /* Contenu interne à renvoyer */
PyGILState_STATE gstate; /* Sauvegarde d'environnement */
PyObject *pyobj; /* Objet Python concerné */
+ PyObject *args; /* Arguments pour l'appel */
+ PyObject *hobj; /* Argument pour Python */
PyObject *pyret; /* Bilan de consultation */
int ret; /* Validité d'une conversion */
-#define LOADED_CONTENT_GET_FORMAT_NAME_WRAPPER PYTHON_WRAPPER_DEF \
+#define LOADED_CONTENT_GET_CONTENT_CLASS_WRAPPER PYTHON_WRAPPER_DEF \
( \
- _get_format_name, "$self", \
+ _get_content_class, "$self, human", \
METH_VARARGS, \
- "Abstract method used to provide the aw name of the format connected" \
- " to the loaded content.\n" \
+ "Abstract method used to provide the nature of the loaded content.\n" \
"\n" \
- "The name associated to a loaded Elf binary is for instance 'elf'." \
+ "The description associated to a loaded ARM Elf binary is for instance" \
+ " 'elf-armv7', or 'Elf, ARMv7' for the human version." \
)
result = NULL;
@@ -334,9 +340,16 @@ static char *py_loaded_content_get_format_name_wrapper(const GLoadedContent *con
pyobj = pygobject_new(G_OBJECT(content));
- if (has_python_method(pyobj, "_get_format_name"))
+ if (has_python_method(pyobj, "_get_content_class"))
{
- pyret = run_python_method(pyobj, "_get_format_name", NULL);
+ args = PyTuple_New(1);
+
+ hobj = (human ? Py_True : Py_False);
+ Py_INCREF(hobj);
+
+ PyTuple_SetItem(args, 0, hobj);
+
+ pyret = run_python_method(pyobj, "_get_content_class", args);
if (pyret != NULL)
{
@@ -349,6 +362,8 @@ static char *py_loaded_content_get_format_name_wrapper(const GLoadedContent *con
}
+ Py_DECREF(args);
+
}
Py_DECREF(pyobj);
@@ -1381,35 +1396,77 @@ static PyObject *py_loaded_content_get_content(PyObject *self, void *closure)
* Paramètres : self = objet Python concerné par l'appel. *
* closure = non utilisé ici. *
* *
-* Description : Fournit le format associé à l'élément chargé. *
+* Description : Décrit la nature du contenu reconnu pour l'élément chargé. *
* *
-* Retour : Format associé à l'élément chargé. *
+* Retour : Classe de contenu associée à l'élément chargé. *
* *
* Remarques : - *
* *
******************************************************************************/
-static PyObject *py_loaded_content_get_format_name(PyObject *self, void *closure)
+static PyObject *py_loaded_content_get_content_class(PyObject *self, void *closure)
{
PyObject *result; /* Instance Python à retourner */
GLoadedContent *content; /* Version GLib de l'élément */
- GBinContent *bincnt; /* Contenu binaire associé */
+ char *class; /* Nature du contenu binaire */
-#define LOADED_CONTENT_FORMAT_NAME_ATTRIB PYTHON_GET_DEF_FULL \
+#define LOADED_CONTENT_CONTENT_CLASS_ATTRIB PYTHON_GET_DEF_FULL \
( \
- format_name, py_loaded_content, \
- "Raw name of the format connected to the loaded content.\n" \
+ content_class, py_loaded_content, \
+ "Nature of the loaded content.\n" \
"\n" \
- "The name associated to a loaded Elf binary is for instance 'elf'." \
+ "The description associated to a loaded ARM Elf binary is for instance" \
+ " 'elf-armv7'." \
)
content = G_LOADED_CONTENT(pygobject_get(self));
- bincnt = g_loaded_content_get_content(content);
+ class = g_loaded_content_get_content_class(content, false);
- result = pygobject_new(G_OBJECT(bincnt));
+ result = PyUnicode_FromString(class);
- g_object_unref(G_OBJECT(bincnt));
+ free(class);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Décrit la nature du contenu reconnu pour l'élément chargé. *
+* *
+* Retour : Classe de contenu associée à l'élément chargé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_loaded_content_get_content_class_for_human(PyObject *self, void *closure)
+{
+ PyObject *result; /* Instance Python à retourner */
+ GLoadedContent *content; /* Version GLib de l'élément */
+ char *class; /* Nature du contenu binaire */
+
+#define LOADED_CONTENT_CONTENT_CLASS_FOR_HUMAN_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ content_class_for_human, py_loaded_content, \
+ "Humain version of the nature of the loaded content.\n" \
+ "\n" \
+ "The description associated to a loaded ARM Elf binary is for instance" \
+ " ''Elf, ARMv7'." \
+)
+
+ content = G_LOADED_CONTENT(pygobject_get(self));
+
+ class = g_loaded_content_get_content_class(content, true);
+
+ result = PyUnicode_FromString(class);
+
+ free(class);
return result;
@@ -1432,7 +1489,7 @@ PyTypeObject *get_python_loaded_content_type(void)
{
static PyMethodDef py_loaded_content_methods[] = {
LOADED_CONTENT_GET_CONTENT_WRAPPER,
- LOADED_CONTENT_GET_FORMAT_NAME_WRAPPER,
+ LOADED_CONTENT_GET_CONTENT_CLASS_WRAPPER,
LOADED_CONTENT_ANALYZE_WRAPPER,
LOADED_CONTENT_DESCRIBE_WRAPPER,
LOADED_CONTENT_COUNT_VIEWS_WRAPPER,
@@ -1454,7 +1511,8 @@ PyTypeObject *get_python_loaded_content_type(void)
static PyGetSetDef py_loaded_content_getseters[] = {
LOADED_CONTENT_CONTENT_ATTRIB,
- LOADED_CONTENT_FORMAT_NAME_ATTRIB,
+ LOADED_CONTENT_CONTENT_CLASS_ATTRIB,
+ LOADED_CONTENT_CONTENT_CLASS_FOR_HUMAN_ATTRIB,
{ NULL }
};
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index ddd2e30..5d604be 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -156,8 +156,8 @@ static bool g_loaded_binary_save(GLoadedBinary *, xmlDoc *, xmlXPathContext *, c
/* Fournit le contenu représenté de l'élément chargé. */
static GBinContent *g_loaded_binary_get_content(const GLoadedBinary *);
-/* Fournit le contenu représenté de l'élément chargé. */
-static char *g_loaded_binary_get_format_name(const GLoadedBinary *);
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+static char *g_loaded_binary_get_content_class(const GLoadedBinary *, bool);
/* Assure le désassemblage en différé. */
static bool g_loaded_binary_analyze(GLoadedBinary *, bool, bool, wgroup_id_t, GtkStatusStack *);
@@ -225,7 +225,7 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *klass)
loaded->save = (save_content_fc)g_loaded_binary_save;
loaded->get_content = (get_content_fc)g_loaded_binary_get_content;
- loaded->get_format_name = (get_format_name_fc)g_loaded_binary_get_format_name;
+ loaded->get_content_class = (get_content_class_fc)g_loaded_binary_get_content_class;
loaded->analyze = (analyze_loaded_fc)g_loaded_binary_analyze;
@@ -1310,9 +1310,10 @@ static bool g_loaded_binary_save(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPathCo
}
+ /*
if (result)
{
- key = g_loaded_content_get_format_name(G_LOADED_CONTENT(binary));
+ key = g_loaded_content_get_content_class(G_LOADED_CONTENT(binary));
result = add_string_attribute_to_node(xdoc, context, path, "format", key);
free(key);
}
@@ -1323,6 +1324,7 @@ static bool g_loaded_binary_save(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPathCo
result = add_string_attribute_to_node(xdoc, context, path, "arch", key);
free(key);
}
+ */
if (result)
result = g_loaded_binary_save_storage(binary, xdoc, context, path);
@@ -1366,6 +1368,7 @@ static GBinContent *g_loaded_binary_get_content(const GLoadedBinary *binary)
/******************************************************************************
* *
* Paramètres : binary = élément chargé à manipuler. *
+* human = description humaine attendue ? *
* *
* Description : Fournit le contenu représenté de l'élément chargé. *
* *
@@ -1375,11 +1378,37 @@ static GBinContent *g_loaded_binary_get_content(const GLoadedBinary *binary)
* *
******************************************************************************/
-static char *g_loaded_binary_get_format_name(const GLoadedBinary *binary)
+static char *g_loaded_binary_get_content_class(const GLoadedBinary *binary, bool human)
{
char *result; /* Désignation à retourner */
+ char *part; /* Partie à intégrer */
+
+ if (human)
+ {
+ result = g_known_format_get_description(G_KNOWN_FORMAT(binary->format));
+
+ result = stradd(result, ", ");
+
+ part = g_arch_processor_get_desc(binary->proc);
+
+ result = stradd(result, part);
+
+ free(part);
+
+ }
+ else
+ {
+ result = g_known_format_get_key(G_KNOWN_FORMAT(binary->format));
+
+ result = stradd(result, "-");
- result = g_known_format_get_key(G_KNOWN_FORMAT(binary->format));
+ part = g_arch_processor_get_key(binary->proc);
+
+ result = stradd(result, part);
+
+ free(part);
+
+ }
return result;
diff --git a/src/analysis/loaded-int.h b/src/analysis/loaded-int.h
index cd47a6a..62534a6 100644
--- a/src/analysis/loaded-int.h
+++ b/src/analysis/loaded-int.h
@@ -39,8 +39,8 @@ typedef bool (* save_content_fc) (GLoadedContent *, xmlDoc *, xmlXPathContext *,
/* Fournit le contenu représenté de l'élément chargé. */
typedef GBinContent * (* get_content_fc) (const GLoadedContent *);
-/* Fournit le format associé à l'élément chargé. */
-typedef char * (* get_format_name_fc) (const GLoadedContent *);
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+typedef char * (* get_content_class_fc) (const GLoadedContent *, bool);
/* Assure l'analyse d'un contenu chargé en différé. */
typedef bool (* analyze_loaded_fc) (GLoadedContent *, bool, bool, wgroup_id_t, GtkStatusStack *);
@@ -85,7 +85,7 @@ struct _GLoadedContentClass
save_content_fc save; /* Sauvegarde dans du XML */
get_content_fc get_content; /* Fourniture du contenu brut */
- get_format_name_fc get_format_name; /* Fourniture du format associé*/
+ get_content_class_fc get_content_class; /* Indication de classe liée */
analyze_loaded_fc analyze; /* Analyse du contenu chargé */
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c
index 3a497f9..9ec2f74 100644
--- a/src/analysis/loaded.c
+++ b/src/analysis/loaded.c
@@ -296,23 +296,24 @@ GBinContent *g_loaded_content_get_content(const GLoadedContent *content)
/******************************************************************************
* *
* Paramètres : content = élément chargé à manipuler. *
+* human = description humaine attendue ? *
* *
-* Description : Fournit le format associé à l'élément chargé. *
+* Description : Décrit la nature du contenu reconnu pour l'élément chargé. *
* *
-* Retour : Format associé à l'élément chargé. *
+* Retour : Classe de contenu associée à l'élément chargé. *
* *
* Remarques : - *
* *
******************************************************************************/
-char *g_loaded_content_get_format_name(const GLoadedContent *content)
+char *g_loaded_content_get_content_class(const GLoadedContent *content, bool human)
{
char *result; /* Contenu interne à renvoyer */
GLoadedContentClass *class; /* Classe de l'instance */
class = G_LOADED_CONTENT_GET_CLASS(content);
- result = class->get_format_name(content);
+ result = class->get_content_class(content, human);
return result;
diff --git a/src/analysis/loaded.h b/src/analysis/loaded.h
index 9a88f8c..406375c 100644
--- a/src/analysis/loaded.h
+++ b/src/analysis/loaded.h
@@ -67,8 +67,8 @@ bool g_loaded_content_save(GLoadedContent *, xmlDoc *, xmlXPathContext *, const
/* Fournit le contenu représenté de l'élément chargé. */
GBinContent *g_loaded_content_get_content(const GLoadedContent *);
-/* Fournit le format associé à l'élément chargé. */
-char *g_loaded_content_get_format_name(const GLoadedContent *);
+/* Décrit la nature du contenu reconnu pour l'élément chargé. */
+char *g_loaded_content_get_content_class(const GLoadedContent *, bool);
/* Lance l'analyse propre à l'élément chargé. */
void g_loaded_content_analyze(GLoadedContent *, bool, bool);
diff --git a/src/analysis/project.c b/src/analysis/project.c
index b57afc7..682dfb9 100644
--- a/src/analysis/project.c
+++ b/src/analysis/project.c
@@ -1249,12 +1249,12 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid,
hash = g_binary_content_get_checksum(content);
g_object_unref(G_OBJECT(content));
- format = g_loaded_content_get_format_name(available[i]);
+ format = "FIXME";//g_loaded_content_get_format_name(available[i]);
asprintf(&access, "/ChrysalideProject/LoadedContents/Content[@hash='%s' and @format='%s']",
hash, format);
- free(format);
+ //free(format);
xobject = get_node_xpath_object(handler->context, access);
@@ -1309,7 +1309,7 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid,
/**
* S'il s'agit des résultats de la dernière exploration,
* alors les groupes contenant les éléments chargés vont
- * être libéré, potentiellement pendant l'analyse.
+ * être libérés, potentiellement pendant l'analyse.
*
* On temporise en incrémentant les références.
*/
diff --git a/src/gui/dialogs/loading.c b/src/gui/dialogs/loading.c
index 912eb8d..39c5820 100644
--- a/src/gui/dialogs/loading.c
+++ b/src/gui/dialogs/loading.c
@@ -459,7 +459,7 @@ void add_content_to_loading_dialog(GtkBuilder *builder, GLoadedContent *content,
{
GtkListStore *store; /* Modèle de gestion */
char *desc; /* Description d'un contenu */
- char *format; /* Format associé à un contenu */
+ char *class; /* Format associé à un contenu */
char *name; /* Désignation complète */
gboolean recognized; /* Nature du contenu */
GtkTreeIter iter; /* Point d'insertion */
@@ -476,11 +476,11 @@ void add_content_to_loading_dialog(GtkBuilder *builder, GLoadedContent *content,
/* Inscription */
desc = g_loaded_content_describe(content, false);
- format = g_loaded_content_get_format_name(content);
+ class = g_loaded_content_get_content_class(content, true);
- asprintf(&name, "%s (%s)", desc, format);
+ asprintf(&name, "%s (%s)", desc, class);
- free(format);
+ free(class);
free(desc);
recognized = TRUE;