diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-09-19 22:28:42 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-09-19 22:28:42 (GMT) |
commit | 0e3059731d9687027c913135b3b856596c49a689 (patch) | |
tree | d3c3754f95c90ae50168817e6248afee6873fbf3 /src/plugins | |
parent | 18648e4e8763a3bc005d6fae51eae3d1528d7d29 (diff) |
Extended the prototype for matching formats in order to get it suitable for plugins.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@577 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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); } |