From 50eb8c462e7ad2b4e5b82d27b1af6e86091ea272 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 23 Jul 2018 19:38:17 +0200
Subject: Created a hook to act when loaded content analysis is over.

---
 plugins/pychrysalide/plugin.c |  2 +-
 src/analysis/loaded.c         |  4 ++++
 src/plugins/pglist.h          |  3 +++
 src/plugins/plugin-def.h      |  3 +++
 src/plugins/plugin-int.h      | 17 +++++++++++------
 src/plugins/plugin.c          | 30 ++++++++++++++++++++++++++++++
 src/plugins/plugin.h          |  3 +++
 7 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c
index 57891a6..b57794c 100644
--- a/plugins/pychrysalide/plugin.c
+++ b/plugins/pychrysalide/plugin.c
@@ -345,7 +345,7 @@ GPluginModule *g_python_plugin_new(const char *modname, const char *filename)
                             case PGA_CONTENT_EXPLORER:
                             case PGA_CONTENT_RESOLVER:
                                 if (!register_python_binding(instance, handle_content, \
-                                                             (pg_handle_content)g_python_plugin_handle_binary_content))
+                                                             (pg_handle_content_fc)g_python_plugin_handle_binary_content))
                                     goto gppn_bad_plugin;
                                 break;
 
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c
index 203868d..a035e5e 100644
--- a/src/analysis/loaded.c
+++ b/src/analysis/loaded.c
@@ -32,6 +32,7 @@
 #include "../core/queue.h"
 #include "../glibext/chrysamarshal.h"
 #include "../glibext/gloadedpanel.h"
+#include "../plugins/pglist.h"
 
 
 
@@ -665,6 +666,9 @@ static void g_loaded_analysis_process(GLoadedAnalysis *analysis, GtkStatusStack
 
     analysis->success = iface->analyze(analysis->content, gid, status);
 
+    if (analysis->success)
+        handle_loaded_content(PGA_CONTENT_ANALYZED, analysis->content, gid, status);
+
     g_work_queue_delete_work_group(queue, gid);
 
 }
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index 20f0031..c602839 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -93,6 +93,9 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *);
 #define handle_binary_content(a, c, i, s) \
     process_all_plugins_for(a, g_plugin_module_handle_binary_content, c, i, s)
 
+#define handle_loaded_content(a, c, i, s) \
+    process_all_plugins_for(a, g_plugin_module_handle_loaded_content, c, i, s)
+
 /* DPS_FORMAT */
 
 #define handle_binary_format(a, f, s) \
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h
index c32c9e3..a497517 100644
--- a/src/plugins/plugin-def.h
+++ b/src/plugins/plugin-def.h
@@ -121,6 +121,9 @@ typedef enum _PluginAction
     /* Conversion de contenus binaires en contenus chargés */
     PGA_CONTENT_RESOLVER = DPC_BINARY_PROCESSING | DPS_CONTENT | DEFINE_PLUGIN_ACTION(1),
 
+    /* Intervention en toute fin d'analyse de contenu chargé */
+    PGA_CONTENT_ANALYZED = DPC_BINARY_PROCESSING | DPS_CONTENT | DEFINE_PLUGIN_ACTION(2),
+
     /**
      * DPC_BINARY_PROCESSING | DPS_FORMAT
      */
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index 03040d1..04b87bb 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -32,6 +32,7 @@
 #include "plugin.h"
 #include "plugin-def.h"
 #include "../analysis/content.h"
+#include "../analysis/loaded.h"
 #include "../common/bits.h"
 #include "../core/logs.h"
 
@@ -47,13 +48,16 @@ typedef void (* pg_process_disassembly_fc) (const GPluginModule *, PluginAction,
 
 
 /* Procède à une opération liée à un contenu binaire. */
-typedef void (* pg_handle_content) (const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
+typedef void (* pg_handle_content_fc) (const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
+
+/* Procède à une opération liée à un contenu chargé. */
+typedef void (* pg_handle_loaded_fc) (const GPluginModule *, PluginAction, GLoadedContent *, wgroup_id_t, GtkStatusStack *);
 
 /* Procède à une opération liée au format de fichier uniquement. */
-typedef bool (* pg_handle_format) (const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *);
+typedef bool (* pg_handle_format_fc) (const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *);
 
 /* Procède à un préchargement de format de fichier. */
-typedef bool (* pg_preload_format) (const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *);
+typedef bool (* pg_preload_format_fc) (const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *);
 
 
 
@@ -115,9 +119,10 @@ struct _GPluginModule
     //execute_on_debugger_fc handle_debugger; /* Action liée à un débogueur  */
 
 
-    pg_handle_content handle_content;       /* Explorations ou résolutions */
-    pg_handle_format handle_format;         /* Manipulation du format      */
-    pg_preload_format preload_format;       /* Préchargement d'un format   */
+    pg_handle_content_fc handle_content;    /* Explorations ou résolutions */
+    pg_handle_loaded_fc handle_loaded;      /* Traitement de contenu chargé*/
+    pg_handle_format_fc handle_format;      /* Manipulation du format      */
+    pg_preload_format_fc preload_format;    /* Préchargement d'un format   */
 
 };
 
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index d1e90c8..58671b6 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -272,6 +272,13 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
                                     goto bad_plugin;
                                 break;
 
+                            case PGA_CONTENT_ANALYZED:
+                                if (!load_plugin_symbol(result->module,
+                                                        "chrysalide_plugin_handle_loaded_content",
+                                                        &result->handle_loaded))
+                                    goto bad_plugin;
+                                break;
+
                             default:
                                 log_variadic_message(LMT_WARNING,
                                                      _("Unknown action '0x%02x' in plugin '%s'..."),
@@ -707,6 +714,29 @@ void g_plugin_module_handle_binary_content(const GPluginModule *plugin, PluginAc
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : plugin  = greffon à manipuler.                               *
+*                action  = type d'action attendue.                            *
+*                content = contenu chargé à traiter.                          *
+*                wid     = identifiant du groupe de traitement.               *
+*                status  = barre de statut à tenir informée.                  *
+*                                                                             *
+*  Description : Procède à une opération liée à un contenu chargé.            *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void g_plugin_module_handle_loaded_content(const GPluginModule *plugin, PluginAction action, GLoadedContent *content, wgroup_id_t wid, GtkStatusStack *status)
+{
+    return plugin->handle_loaded(plugin, action, content, wid, status);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : plugin = greffon à manipuler.                                *
 *                action = type d'action attendue.                             *
 *                format = format de binaire à manipuler pendant l'opération.  *
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 17a9f33..d0aeb28 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -94,6 +94,9 @@ bool g_plugin_module_load(GPluginModule *, GPluginModule **, size_t);
 /* Procède à une opération liée à un contenu binaire. */
 void g_plugin_module_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
 
+/* Procède à une opération liée à un contenu chargé. */
+void g_plugin_module_handle_loaded_content(const GPluginModule *, PluginAction, GLoadedContent *, wgroup_id_t, GtkStatusStack *);
+
 /* Procède à une opération liée au format de fichier uniquement. */
 bool g_plugin_module_handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *);
 
-- 
cgit v0.11.2-87-g4458