diff options
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/plugin-int.h | 29 | ||||
| -rw-r--r-- | src/plugins/plugin.c | 26 | 
2 files changed, 37 insertions, 18 deletions
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index acaf735..f786c08 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -39,37 +39,40 @@  /* Prend acte du [dé]chargement du greffon. */  typedef bool (* pg_management_fc) (GPluginModule *, GObject *); +/* Exécute une action pendant un désassemblage de binaire. */ +typedef void (* pg_process_disassembly_fc) (const GPluginModule *, PluginAction, GLoadedBinary *); + + + +  /* Indique si le format peut être pris en charge ici. */ -typedef bool (* pg_format_is_matching) (const GPluginModule *, GBinContent **); +//typedef bool (* pg_format_is_matching) (const GPluginModule *, GBinContent **);  /* Procède à une opération liée au format de fichier uniquement. */  typedef bool (* pg_handle_format) (const GPluginModule *, PluginAction, GBinFormat *); -/* Exécute une action pendant un désassemblage de binaire. */ -typedef void (* pg_process_disassembly) (const GPluginModule *, PluginAction, GLoadedBinary *); -  /* Précise le nom associé au greffon. */ -typedef char * (* get_plugin_name_fc) (void); +//typedef char * (* get_plugin_name_fc) (void);  /* Procède à l'initialisation du greffon. */ -typedef bool (* init_plugin_fc) (GPluginModule *, GObject *); +//typedef bool (* init_plugin_fc) (GPluginModule *, GObject *);  /* Procède à l'extinction du greffon. */ -typedef void (* exit_plugin_fc) (GPluginModule *); +//typedef void (* exit_plugin_fc) (GPluginModule *);  /* Fournit une indication sur le type d'opération(s) menée(s). */ -typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); +//typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *);  /* Identifie un format à associer à un contenu binaire. */  //typedef MatchingFormatAction (* is_matching_fc) (const GPluginModule *, char **, bin_t **, off_t *);  /* Exécute une action définie sur un binaire chargé. */ -typedef bool (* execute_action_on_binary_fc) (const GPluginModule *, GLoadedBinary *, PluginAction); +//typedef bool (* execute_action_on_binary_fc) (const GPluginModule *, GLoadedBinary *, PluginAction);  /* Exécute une action relative à un débogueur. */  //typedef bool (* execute_on_debugger_fc) (const GPluginModule *, GBinaryDebugger *, PluginAction); @@ -88,6 +91,7 @@ struct _GPluginModule      pg_management_fc init;                  /* Procédure d'initialisation  */      pg_management_fc exit;                  /* Procédure d'extinction      */ +    pg_process_disassembly_fc process_disass; /* Catégorie 'désassemblage' */      //char *name;                             /* Nom associé au greffon      */ @@ -95,18 +99,17 @@ struct _GPluginModule      //init_plugin_fc init;                    /* Procédure d'initialisation  */      //exit_plugin_fc exit;                    /* Procédure d'extinction      */ -    get_plugin_action_fc get_action;        /* Opération(s) menée(s)       */ +    //get_plugin_action_fc get_action;        /* Opération(s) menée(s)       */      //is_matching_fc is_matching;             /* Recherche de correspondance */ -    execute_action_on_binary_fc exec_on_bin;/* Action sur un binaire       */ +    //execute_action_on_binary_fc exec_on_bin;/* Action sur un binaire       */      //execute_on_debugger_fc handle_debugger; /* Action liée à un débogueur  */ -    pg_format_is_matching is_matching;      /* Recherche de correspondance */ +    //pg_format_is_matching is_matching;      /* Recherche de correspondance */      pg_handle_format handle_format;         /* Manipulation du format      */ -    pg_process_disassembly proc_disass;     /* Catégorie 'désassemblage'   */  }; diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 9322bcb..c0e9fd1 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -37,6 +37,9 @@  #include "plugin-int.h" +#include "../core/formats.h" + +  /* Initialise la classe des greffons. */  static void g_plugin_module_class_init(GPluginModuleClass *); @@ -162,8 +165,10 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)      GPluginModule *result;                  /* Structure à retourner       */      plugin_abi_version_t current;           /* Version de l'ABI actuelle   */      size_t i;                               /* Boucle de parcours          */ +    uint32_t action;                        /* Identifiant d'une action    */      uint32_t category;                      /* Catégorie principale        */      uint32_t sub;                           /* Sous-catégorie visée        */ +    format_match_fc matcher;                /* Routine de reconnaissance   */      result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL); @@ -215,8 +220,9 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)      for (i = 0; i < result->interface->actions_count; i++)      { -        category = MASK_PLUGIN_CATEGORY(result->interface->actions[i]); -        sub = MASK_PLUGIN_SUB_CATEGORY(result->interface->actions[i]); +        action = result->interface->actions[i]; +        category = MASK_PLUGIN_CATEGORY(action); +        sub = MASK_PLUGIN_SUB_CATEGORY(action);          switch (category)          { @@ -254,8 +260,18 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)                  {                      case DPS_FORMAT: -                        switch (result->interface->actions[i]) +                        switch (action)                          { +                            case PGA_FORMAT_MATCHER: + +                                if (!load_plugin_symbol(result->module, +                                                        "is_format_matching", &matcher)) +                                    goto bad_plugin; + +                                if (!register_format_matcher(matcher, result)) +                                    goto bad_plugin; + +                                break;                              case PGA_FORMAT_LOADER_LAST:                                  if (!load_plugin_symbol(result->module, @@ -275,7 +291,7 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)                      case DPS_DISASSEMBLY:                          if (!load_plugin_symbol(result->module, -                                                "process_binary_disassembly", &result->proc_disass)) +                                                "process_binary_disassembly", &result->process_disass))                              goto bad_plugin;                          break; @@ -504,6 +520,6 @@ bool g_plugin_module_handle_binary_format(const GPluginModule *plugin, PluginAct  void g_plugin_module_process_disassembly_event(const GPluginModule *plugin, PluginAction action, GLoadedBinary *binary)  { -    plugin->proc_disass(plugin, action, binary); +    plugin->process_disass(plugin, action, binary);  }  | 
