summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/pychrysalide/analysis/loading.c45
-rw-r--r--src/analysis/loading.c117
-rw-r--r--src/analysis/loading.h8
-rw-r--r--src/analysis/project.c12
4 files changed, 178 insertions, 4 deletions
diff --git a/plugins/pychrysalide/analysis/loading.c b/plugins/pychrysalide/analysis/loading.c
index 44930cd..f785a53 100644
--- a/plugins/pychrysalide/analysis/loading.c
+++ b/plugins/pychrysalide/analysis/loading.c
@@ -44,6 +44,9 @@
/* Ajoute un nouveau contenu découvert au crédit d'un groupe. */
static PyObject *py_content_explorer_populate_group(PyObject *, PyObject *);
+/* Note un contenu chargé pour future intégration guidée. */
+static PyObject *py_content_explorer_note_detected(PyObject *, PyObject *);
+
/* ------------------- RESOLUTION DE CONTENUS BINAIRES EN CHARGES ------------------- */
@@ -96,6 +99,43 @@ static PyObject *py_content_explorer_populate_group(PyObject *self, PyObject *ar
}
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant un binaire. *
+* args = arguments fournis à l'appel. *
+* *
+* Description : Note un contenu chargé pour future intégration guidée. *
+* *
+* Retour : None. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_content_explorer_note_detected(PyObject *self, PyObject *args)
+{
+ PyObject *result; /* Valeur à retourner */
+ unsigned long long wid; /* Identifiant de groupe */
+ PyObject *loaded_obj; /* Contenu chargé en Python */
+ int ret; /* Bilan de lecture des args. */
+ GContentExplorer *explorer; /* Explorateur à manipuler */
+ GLoadedContent *loaded; /* Contenu chargé au final */
+
+ ret = PyArg_ParseTuple(args, "KO!", &wid, get_python_loaded_content_type(), &loaded_obj);
+ if (!ret) Py_RETURN_NONE;
+
+ explorer = G_CONTENT_EXPLORER(pygobject_get(self));
+ loaded = G_LOADED_CONTENT(pygobject_get(loaded_obj));
+
+ g_content_explorer_note_detected(explorer, wid, loaded);
+
+ result = Py_None;
+ Py_INCREF(result);
+
+ return result;
+
+}
+
/******************************************************************************
* *
@@ -117,6 +157,11 @@ PyTypeObject *get_python_content_explorer_type(void)
METH_VARARGS,
"populate_group($self, wid, content, /)\n--\n\nPush a new binary content into the list to explore."
},
+ {
+ "note_detected", py_content_explorer_note_detected,
+ METH_VARARGS,
+ "note_detected($self, wid, loaded, /)\n--\n\nMark a loaded content as one final candidate."
+ },
{ NULL }
};
diff --git a/src/analysis/loading.c b/src/analysis/loading.c
index 3a53657..0afc60f 100644
--- a/src/analysis/loading.c
+++ b/src/analysis/loading.c
@@ -113,6 +113,9 @@ typedef struct _exploring_group
GBinContent **contents; /* Contenus reconnus dispos. */
size_t count; /* Taille de cette liste */
+ GLoadedContent **loaded; /* Contenus reconnus à intégrer*/
+ size_t noted; /* Taille de cette liste */
+
} exploring_group;
/* Exploration de contenus binaires (instance) */
@@ -729,6 +732,9 @@ wgroup_id_t g_content_explorer_create_group(GContentExplorer *explorer, GBinCont
group->contents = NULL;
group->count = 0;
+ group->loaded = NULL;
+ group->noted = 0;
+
/* Alimentation du contenu initial */
work = g_exploring_work_new(content);
@@ -779,6 +785,15 @@ void g_content_explorer_delete_group(GContentExplorer *explorer, wgroup_id_t wid
for (i = 0; i < group->count; i++)
g_object_unref(G_OBJECT(group->contents[i]));
+ if (group->contents != NULL)
+ free(group->contents);
+
+ for (i = 0; i < group->noted; i++)
+ g_object_unref(G_OBJECT(group->loaded[i]));
+
+ if (group->loaded != NULL)
+ free(group->loaded);
+
/* Réorganisation de la liste */
index = group - explorer->groups;
@@ -850,6 +865,39 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, wgroup_id_t w
/******************************************************************************
* *
* Paramètres : explorer = gestionnaire d'explorations à consulter. *
+* wid = identifiant du groupe recherché. *
+* loaded = contenu chargé et pouvant être représenté. *
+* *
+* Description : Note un contenu chargé pour future intégration guidée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_content_explorer_note_detected(GContentExplorer *explorer, wgroup_id_t wid, GLoadedContent *loaded)
+{
+ exploring_group *group; /* Groupe d'opération concerné */
+
+ g_mutex_lock(&explorer->mutex);
+
+ group = g_content_explorer_find_group(explorer, wid);
+ assert(group != NULL);
+
+ group->loaded = (GLoadedContent **)realloc(group->loaded, ++group->noted * sizeof(GLoadedContent *));
+
+ group->loaded[group->noted - 1] = loaded;
+ g_object_ref(G_OBJECT(loaded));
+
+ g_mutex_unlock(&explorer->mutex);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : explorer = gestionnaire d'explorations à consulter. *
* wid = identifiant du groupe à parcourir. *
* count = nombre de contenus binaires retournés. [OUT] *
* *
@@ -889,7 +937,54 @@ GBinContent **g_content_explorer_get_all(GContentExplorer *explorer, wgroup_id_t
{
result[1 + i] = group->contents[i];
- g_object_ref(G_OBJECT(result[i + 1]));
+ g_object_ref(G_OBJECT(result[1 + i]));
+
+ }
+
+ g_mutex_unlock(&explorer->mutex);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : explorer = gestionnaire d'explorations à consulter. *
+* wid = identifiant du groupe à parcourir. *
+* noted = nombre de contenus chargés retournés. [OUT] *
+* *
+* Description : Fournit la liste de tous les contenus préalablement détectés.*
+* *
+* Retour : Liste de contenus chargés enregistrés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GLoadedContent **g_content_explorer_get_detected(GContentExplorer *explorer, wgroup_id_t wid, size_t *noted)
+{
+ GLoadedContent **result; /* Trouvailles à retourner */
+ exploring_group *group; /* Groupe d'opération concerné */
+ size_t i; /* Boucle de parcours */
+
+ g_mutex_lock(&explorer->mutex);
+
+ group = g_content_explorer_find_group(explorer, wid);
+ assert(group != NULL);
+
+ /* Allocation de la liste finale */
+
+ *noted = group->noted;
+ result = (GLoadedContent **)malloc(*noted * sizeof(GLoadedContent *));
+
+ /* On parcourt les éventuels contenus encapsulés découverts */
+
+ for (i = 0; i < group->noted; i++)
+ {
+ result[i] = group->loaded[i];
+
+ g_object_ref(G_OBJECT(result[i]));
}
@@ -1305,6 +1400,8 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w
* wid = identifiant du groupe de tâches réservé. *
* contents = contenus à analyser. *
* count = nombre de ces contenus. *
+* detected = contenus préalablement détectés. *
+* noted = nombre de contenus chargés. *
* *
* Description : Initie une nouvelle vague de résolution de contenus. *
* *
@@ -1314,7 +1411,7 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w
* *
******************************************************************************/
-void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid, GBinContent **contents, size_t count)
+void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid, GBinContent **contents, size_t count, GLoadedContent **detected, size_t noted)
{
resolving_group *group; /* Groupe ciblé par l'opération*/
GWorkQueue *queue; /* Gestionnaire de différés */
@@ -1336,6 +1433,21 @@ void g_content_resolver_create_group(GContentResolver *resolver, wgroup_id_t wid
group->loaded = NULL;
group->count = 0;
+ /* Insertion des résultats préalables */
+
+ if (noted > 0)
+ {
+ group->count = noted;
+ group->loaded = (GLoadedContent **)realloc(group->loaded, group->count * sizeof(GLoadedContent *));
+
+ for (i = 0; i < noted; i++)
+ {
+ group->loaded[i] = detected[i];
+ g_object_ref(G_OBJECT(detected[i]));
+ }
+
+ }
+
/* Alimentation du contenu initial */
queue = get_work_queue();
@@ -1423,6 +1535,7 @@ void g_content_resolver_add_detected(GContentResolver *resolver, wgroup_id_t wid
g_mutex_lock(&resolver->mutex);
group = g_content_resolver_find_group(resolver, wid);
+ assert(group != NULL);
group->loaded = (GLoadedContent **)realloc(group->loaded, ++group->count * sizeof(GLoadedContent *));
diff --git a/src/analysis/loading.h b/src/analysis/loading.h
index c7ede58..e2f7801 100644
--- a/src/analysis/loading.h
+++ b/src/analysis/loading.h
@@ -67,9 +67,15 @@ void g_content_explorer_delete_group(GContentExplorer *, wgroup_id_t);
/* Ajoute un nouveau contenu découvert au crédit d'un groupe. */
void g_content_explorer_populate_group(GContentExplorer *, wgroup_id_t, GBinContent *);
+/* Note un contenu chargé pour future intégration guidée. */
+void g_content_explorer_note_detected(GContentExplorer *, wgroup_id_t, GLoadedContent *);
+
/* Fournit la liste de tous les contenus disponibles. */
GBinContent **g_content_explorer_get_all(GContentExplorer *, wgroup_id_t, size_t *);
+/* Fournit la liste de tous les contenus préalablement détectés. */
+GLoadedContent **g_content_explorer_get_detected(GContentExplorer *, wgroup_id_t, size_t *);
+
/* ------------------- RESOLUTION DE CONTENUS BINAIRES EN CHARGES ------------------- */
@@ -97,7 +103,7 @@ GType g_content_resolver_get_type(void);
GContentResolver *g_content_resolver_new(void);
/* Initie une nouvelle vague de résolution de contenus. */
-void g_content_resolver_create_group(GContentResolver *, wgroup_id_t, GBinContent **, size_t);
+void g_content_resolver_create_group(GContentResolver *, wgroup_id_t, GBinContent **, size_t, GLoadedContent **, size_t);
/* Termine une vague de résolution de contenu. */
void g_content_resolver_delete_group(GContentResolver *, wgroup_id_t);
diff --git a/src/analysis/project.c b/src/analysis/project.c
index 66faa16..4a15ea0 100644
--- a/src/analysis/project.c
+++ b/src/analysis/project.c
@@ -1172,6 +1172,8 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
{
GBinContent **available; /* Contenus binaires présents */
size_t count; /* Quantité de ces contenus */
+ GLoadedContent **detected; /* Contenus chargés présents */
+ size_t noted; /* Quantité de ces contenus */
GContentResolver *resolver; /* Resolveur de contenus */
size_t i; /* Boucle de parcours */
@@ -1180,9 +1182,11 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
available = g_content_explorer_get_all(explorer, wid, &count);
assert(count > 0);
+ detected = g_content_explorer_get_detected(explorer, wid, &noted);
+
resolver = get_current_content_resolver();
- g_content_resolver_create_group(resolver, wid, available, count);
+ g_content_resolver_create_group(resolver, wid, available, count, detected, noted);
g_object_unref(G_OBJECT(resolver));
@@ -1191,6 +1195,12 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid,
free(available);
+ for (i = 0; i < noted; i++)
+ g_object_unref(G_OBJECT(detected[i]));
+
+ if (detected != NULL)
+ free(detected);
+
}
}