From 0f1473cba267ad809c8e7d207b5ff5e3998745fc Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 11 Sep 2016 23:37:36 +0200 Subject: Displayed more details about the loading process in the status bar. --- ChangeLog | 28 ++++++++++++++++++++++++ plugins/readdex/class.c | 11 +++++++++- plugins/readdex/class.h | 2 +- plugins/readdex/ids.c | 55 ++++++++++++++++++++++++++++++++++++++++++----- plugins/readdex/ids.h | 10 ++++----- plugins/readdex/reader.c | 15 +++++++------ plugins/readdex/reader.h | 2 +- plugins/readelf/program.c | 13 ++++++++++- plugins/readelf/program.h | 2 +- plugins/readelf/reader.c | 7 +++--- plugins/readelf/reader.h | 2 +- plugins/readelf/section.c | 13 ++++++++++- plugins/readelf/section.h | 2 +- src/format/dex/dex.c | 8 +++---- src/format/dex/pool.c | 36 ++++++++++++++++++++++++++++--- src/format/dex/pool.h | 9 +++----- src/format/elf/elf.c | 9 +++++--- src/format/format-int.h | 2 +- src/format/format.c | 5 +++-- src/plugins/pglist.h | 6 +++--- src/plugins/plugin-int.h | 2 +- src/plugins/plugin.c | 5 +++-- src/plugins/plugin.h | 2 +- 23 files changed, 192 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index fc0f6cd..8a08249 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,33 @@ 16-09-11 Cyrille Bagard + * plugins/readdex/class.c: + * plugins/readdex/class.h: + * plugins/readdex/ids.c: + * plugins/readdex/ids.h: + * plugins/readdex/reader.c: + * plugins/readdex/reader.h: + * plugins/readelf/program.c: + * plugins/readelf/program.h: + * plugins/readelf/reader.c: + * plugins/readelf/reader.h: + * plugins/readelf/section.c: + * plugins/readelf/section.h: + * src/format/dex/dex.c: + * src/format/dex/pool.c: + * src/format/dex/pool.h: + * src/format/elf/elf.c: + Display more details about the loading process in the status bar. + + * src/format/format-int.h: + * src/format/format.c: + * src/plugins/pglist.h: + * src/plugins/plugin-int.h: + * src/plugins/plugin.c: + * src/plugins/plugin.h: + Update code. + +16-09-11 Cyrille Bagard + * src/format/dex/dex-int.c: Fix a bug when decoding some catch-all handlers in Dex code item. diff --git a/plugins/readdex/class.c b/plugins/readdex/class.c index d3ca197..64be347 100644 --- a/plugins/readdex/class.c +++ b/plugins/readdex/class.c @@ -54,6 +54,7 @@ static bool annotate_dex_encoded_method(const GDexFormat *, const encoded_method /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des classes pour la VM Dalvik. * * * @@ -63,13 +64,14 @@ static bool annotate_dex_encoded_method(const GDexFormat *, const encoded_method * * ******************************************************************************/ -bool annotate_dex_class_defs(const GDexFormat *format) +bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ @@ -90,6 +92,9 @@ bool annotate_dex_class_defs(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->class_defs_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex classes..."), + header->class_defs_size); + for (i = 0; i < header->class_defs_size && result; i++) { /* class_idx */ @@ -209,8 +214,12 @@ bool annotate_dex_class_defs(const GDexFormat *format) /* TODO : g_object_unref(G_OBJECT(class));*/ + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return result; diff --git a/plugins/readdex/class.h b/plugins/readdex/class.h index c2508e3..18b1e49 100644 --- a/plugins/readdex/class.h +++ b/plugins/readdex/class.h @@ -30,7 +30,7 @@ /* Commente les définitions des classes pour la VM Dalvik. */ -bool annotate_dex_class_defs(const GDexFormat *); +bool annotate_dex_class_defs(const GDexFormat *, GtkStatusStack *); diff --git a/plugins/readdex/ids.c b/plugins/readdex/ids.c index c9f1cb5..9319b7c 100644 --- a/plugins/readdex/ids.c +++ b/plugins/readdex/ids.c @@ -39,6 +39,7 @@ /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des chaînes de caractères. * * * @@ -48,12 +49,13 @@ * * ******************************************************************************/ -bool annotate_dex_string_ids(const GDexFormat *format) +bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ @@ -74,6 +76,9 @@ bool annotate_dex_string_ids(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->string_ids_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex strings..."), + header->string_ids_size); + for (i = 0; i < header->string_ids_size; i++) { /* Saut vers la définition */ @@ -125,8 +130,12 @@ bool annotate_dex_string_ids(const GDexFormat *format) ADD_STR_AS_SYM(format, symbol, instr); + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return true; @@ -137,6 +146,7 @@ bool annotate_dex_string_ids(const GDexFormat *format) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de types. * * * @@ -146,12 +156,13 @@ bool annotate_dex_string_ids(const GDexFormat *format) * * ******************************************************************************/ -bool annotate_dex_type_ids(const GDexFormat *format) +bool annotate_dex_type_ids(const GDexFormat *format, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ @@ -168,6 +179,9 @@ bool annotate_dex_type_ids(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->type_ids_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex types..."), + header->type_ids_size); + for (i = 0; i < header->type_ids_size; i++) { copy_vmpa(&start, &pos); @@ -184,8 +198,12 @@ bool annotate_dex_type_ids(const GDexFormat *format) if (i == 0) g_binary_symbol_define_as_block_start(symbol, true); + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return true; @@ -196,6 +214,7 @@ bool annotate_dex_type_ids(const GDexFormat *format) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de prototypes. * * * @@ -205,12 +224,13 @@ bool annotate_dex_type_ids(const GDexFormat *format) * * ******************************************************************************/ -bool annotate_dex_proto_ids(const GDexFormat *format) +bool annotate_dex_proto_ids(const GDexFormat *format, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ @@ -227,6 +247,9 @@ bool annotate_dex_proto_ids(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->proto_ids_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex prototypes..."), + header->proto_ids_size); + for (i = 0; i < header->proto_ids_size; i++) { /* shorty_idx */ @@ -271,8 +294,12 @@ bool annotate_dex_proto_ids(const GDexFormat *format) free(text); + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return true; @@ -283,6 +310,7 @@ bool annotate_dex_proto_ids(const GDexFormat *format) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de champs. * * * @@ -292,12 +320,13 @@ bool annotate_dex_proto_ids(const GDexFormat *format) * * ******************************************************************************/ -bool annotate_dex_field_ids(const GDexFormat *format) +bool annotate_dex_field_ids(const GDexFormat *format, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ @@ -314,6 +343,9 @@ bool annotate_dex_field_ids(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->field_ids_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex fields..."), + header->field_ids_size); + for (i = 0; i < header->field_ids_size; i++) { /* class_idx */ @@ -358,8 +390,12 @@ bool annotate_dex_field_ids(const GDexFormat *format) free(text); + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return true; @@ -370,6 +406,7 @@ bool annotate_dex_field_ids(const GDexFormat *format) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de méthodes. * * * @@ -379,13 +416,14 @@ bool annotate_dex_field_ids(const GDexFormat *format) * * ******************************************************************************/ -bool annotate_dex_method_ids(const GDexFormat *format) +bool annotate_dex_method_ids(const GDexFormat *format, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ const dex_header *header; /* En-tête principale */ SourceEndian endian; /* Boutisme utilisé */ vmpa2t pos; /* Tête de lecture des symboles*/ uint32_t i; /* Boucle de parcours */ + activity_id_t msg; /* Message de progression */ vmpa2t start; /* Localisation des symboles */ GArchInstruction *instr; /* Instruction décodée */ GArchOperand *operand; /* Opérande à venir modifier */ @@ -401,6 +439,9 @@ bool annotate_dex_method_ids(const GDexFormat *format) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->method_ids_off, &pos)) return false; + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Dex methods..."), + header->method_ids_size); + for (i = 0; i < header->method_ids_size; i++) { /* class_idx */ @@ -445,8 +486,12 @@ bool annotate_dex_method_ids(const GDexFormat *format) free(text); + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + g_object_unref(G_OBJECT(content)); return true; diff --git a/plugins/readdex/ids.h b/plugins/readdex/ids.h index bcbf6de..a3251b7 100644 --- a/plugins/readdex/ids.h +++ b/plugins/readdex/ids.h @@ -30,19 +30,19 @@ /* Charge tous les symboles de l'en-tête DEX. */ -bool annotate_dex_string_ids(const GDexFormat *); +bool annotate_dex_string_ids(const GDexFormat *, GtkStatusStack *); /* Commente les définitions des identifiants de types. */ -bool annotate_dex_type_ids(const GDexFormat *); +bool annotate_dex_type_ids(const GDexFormat *, GtkStatusStack *); /* Commente les définitions des identifiants de prototypes. */ -bool annotate_dex_proto_ids(const GDexFormat *); +bool annotate_dex_proto_ids(const GDexFormat *, GtkStatusStack *); /* Commente les définitions des identifiants de champs. */ -bool annotate_dex_field_ids(const GDexFormat *); +bool annotate_dex_field_ids(const GDexFormat *, GtkStatusStack *); /* Commente les définitions des identifiants de méthodes. */ -bool annotate_dex_method_ids(const GDexFormat *); +bool annotate_dex_method_ids(const GDexFormat *, GtkStatusStack *); diff --git a/plugins/readdex/reader.c b/plugins/readdex/reader.c index 8df489e..6494973 100644 --- a/plugins/readdex/reader.c +++ b/plugins/readdex/reader.c @@ -42,6 +42,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Etablit des symboles complémentaires dans un format DEX. * * * @@ -51,7 +52,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files * * ******************************************************************************/ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format) +G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GDexFormat *dex_fmt; /* Version DEX */ @@ -66,17 +67,17 @@ G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAct result = annotate_dex_header(dex_fmt); - result &= annotate_dex_string_ids(dex_fmt); + result &= annotate_dex_string_ids(dex_fmt, status); - result &= annotate_dex_type_ids(dex_fmt); + result &= annotate_dex_type_ids(dex_fmt, status); - result &= annotate_dex_proto_ids(dex_fmt); + result &= annotate_dex_proto_ids(dex_fmt, status); - result &= annotate_dex_field_ids(dex_fmt); + result &= annotate_dex_field_ids(dex_fmt, status); - result &= annotate_dex_method_ids(dex_fmt); + result &= annotate_dex_method_ids(dex_fmt, status); - result &= annotate_dex_class_defs(dex_fmt); + result &= annotate_dex_class_defs(dex_fmt, status); hbf_exit: diff --git a/plugins/readdex/reader.h b/plugins/readdex/reader.h index 8cccced..15fe873 100644 --- a/plugins/readdex/reader.h +++ b/plugins/readdex/reader.h @@ -32,7 +32,7 @@ /* Etablit des symboles complémentaires dans un format DEX. */ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *); +G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); diff --git a/plugins/readelf/program.c b/plugins/readelf/program.c index f380ce4..0c6574d 100644 --- a/plugins/readelf/program.c +++ b/plugins/readelf/program.c @@ -325,6 +325,7 @@ static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Charge tous les symboles liés aux en-têtes de programme ELF. * * * @@ -334,7 +335,7 @@ static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, * * ******************************************************************************/ -bool annotate_elf_program_header_table(GElfFormat *format) +bool annotate_elf_program_header_table(GElfFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const elf_header *header; /* En-tête principale */ @@ -342,6 +343,7 @@ bool annotate_elf_program_header_table(GElfFormat *format) phys_t offset; /* Tête de lecture du bbinaire */ vmpa2t pos; /* Localisation des symboles */ uint16_t e_phnum; /* Nombre d'éléments 'Program' */ + activity_id_t msg; /* Message de progression */ uint16_t i; /* Boucle de parcours */ result = true; @@ -356,9 +358,18 @@ bool annotate_elf_program_header_table(GElfFormat *format) e_phnum = ELF_HDR(format, *header, e_phnum); + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Elf program headers..."), e_phnum); + for (i = 0; i < e_phnum && result; i++) + { result = annotate_elf_program_header(format, endian, &pos); + gtk_status_stack_update_activity_value(status, msg, 1); + + } + + gtk_status_stack_remove_activity(status, msg); + return true; } diff --git a/plugins/readelf/program.h b/plugins/readelf/program.h index b1f3a6d..1ff26b5 100644 --- a/plugins/readelf/program.h +++ b/plugins/readelf/program.h @@ -30,7 +30,7 @@ /* Charge tous les symboles liés aux en-têtes de programme ELF. */ -bool annotate_elf_program_header_table(GElfFormat *); +bool annotate_elf_program_header_table(GElfFormat *, GtkStatusStack *); diff --git a/plugins/readelf/reader.c b/plugins/readelf/reader.c index 2d10540..875b568 100644 --- a/plugins/readelf/reader.c +++ b/plugins/readelf/reader.c @@ -42,6 +42,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Etablit des symboles complémentaires dans un format ELF. * * * @@ -51,7 +52,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files * * ******************************************************************************/ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format) +G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GElfFormat *elf_fmt; /* Version ELF */ @@ -66,9 +67,9 @@ G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAct result = annotate_elf_header(elf_fmt); - result &= annotate_elf_program_header_table(elf_fmt); + result &= annotate_elf_program_header_table(elf_fmt, status); - result &= annotate_elf_section_header_table(elf_fmt); + result &= annotate_elf_section_header_table(elf_fmt, status); hbf_exit: diff --git a/plugins/readelf/reader.h b/plugins/readelf/reader.h index 0080766..00f81d1 100644 --- a/plugins/readelf/reader.h +++ b/plugins/readelf/reader.h @@ -32,7 +32,7 @@ /* Etablit des symboles complémentaires dans un format ELF. */ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *); +G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); diff --git a/plugins/readelf/section.c b/plugins/readelf/section.c index bae4b4c..f7aa727 100644 --- a/plugins/readelf/section.c +++ b/plugins/readelf/section.c @@ -399,6 +399,7 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Charge tous les symboles liés aux en-têtes de section ELF. * * * @@ -408,7 +409,7 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, * * ******************************************************************************/ -bool annotate_elf_section_header_table(GElfFormat *format) +bool annotate_elf_section_header_table(GElfFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const elf_header *header; /* En-tête principale */ @@ -417,6 +418,7 @@ bool annotate_elf_section_header_table(GElfFormat *format) off_t offset; /* Tête de lecture du binaire */ vmpa2t pos; /* Localisation des symboles */ uint16_t e_shnum; /* Nombre d'éléments 'Program' */ + activity_id_t msg; /* Message de progression */ uint16_t i; /* Boucle de parcours */ result = true; @@ -433,9 +435,18 @@ bool annotate_elf_section_header_table(GElfFormat *format) e_shnum = ELF_HDR(format, *header, e_shnum); + msg = gtk_status_stack_add_activity(status, _("Writing annotations for all Elf section headers..."), e_shnum); + for (i = 0; i < e_shnum && result; i++) + { result = annotate_elf_section_header(format, endian, &strings, &pos); + gtk_status_stack_update_activity_value(status, msg, 1); + + } + + gtk_status_stack_remove_activity(status, msg); + return true; } diff --git a/plugins/readelf/section.h b/plugins/readelf/section.h index ab0e50b..a40c5c5 100644 --- a/plugins/readelf/section.h +++ b/plugins/readelf/section.h @@ -30,7 +30,7 @@ /* Charge tous les symboles liés aux en-têtes de section ELF. */ -bool annotate_elf_section_header_table(GElfFormat *); +bool annotate_elf_section_header_table(GElfFormat *, GtkStatusStack *); diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c index 3388861..582390a 100755 --- a/src/format/dex/dex.c +++ b/src/format/dex/dex.c @@ -265,16 +265,16 @@ GBinFormat *g_dex_format_new(GBinContent *content, GExeFormat *parent, GtkStatus /* TODO : vérifier que les *_id ne se chevauchent pas */ - if (!load_all_dex_types(result)) + if (!load_all_dex_types(result, status)) goto gdfn_error; - if (!load_all_dex_fields(result)) + if (!load_all_dex_fields(result, status)) goto gdfn_error; - if (!load_all_dex_classes(result)) + if (!load_all_dex_classes(result, status)) goto gdfn_error; - if (!g_binary_format_complete_loading(base)) + if (!g_binary_format_complete_loading(base, status)) goto gdfn_error; return base; diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c index 3842aa9..f624ff3 100644 --- a/src/format/dex/pool.c +++ b/src/format/dex/pool.c @@ -28,6 +28,9 @@ #include +#include + + #include "dex-int.h" #include "../mangling/demangler.h" #include "../mangling/dex/context.h" @@ -122,6 +125,7 @@ const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * + status = barre de statut à tenir informée. * * * * Description : Charge en mémoire l'ensemble des types du format DEX. * * * @@ -131,9 +135,10 @@ const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index) * * ******************************************************************************/ -bool load_all_dex_types(GDexFormat *format) +bool load_all_dex_types(GDexFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ GDataType *type; /* Type récupéré */ @@ -141,6 +146,9 @@ bool load_all_dex_types(GDexFormat *format) format->types = (GDataType **)calloc(format->header.type_ids_size, sizeof(GDataType *)); + msg = gtk_status_stack_add_activity(status, _("Loading all types from the Dex pool..."), + format->header.type_ids_size); + for (i = 0; i < format->header.type_ids_size && result; i++) { type = get_type_from_dex_pool(format, i); @@ -150,8 +158,12 @@ bool load_all_dex_types(GDexFormat *format) else result = false; + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + return result; } @@ -223,6 +235,7 @@ GDataType *get_type_from_dex_pool(GDexFormat *format, uint32_t index) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Charge en mémoire l'ensemble des champs du format DEX. * * * @@ -232,9 +245,10 @@ GDataType *get_type_from_dex_pool(GDexFormat *format, uint32_t index) * * ******************************************************************************/ -bool load_all_dex_fields(GDexFormat *format) +bool load_all_dex_fields(GDexFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ GBinVariable *field; /* Champ récupéré */ @@ -242,6 +256,9 @@ bool load_all_dex_fields(GDexFormat *format) format->fields = (GBinVariable **)calloc(format->header.field_ids_size, sizeof(GBinVariable *)); + msg = gtk_status_stack_add_activity(status, _("Loading all fields from the Dex pool..."), + format->header.field_ids_size); + for (i = 0; i < format->header.field_ids_size && result; i++) { field = get_field_from_dex_pool(format, i); @@ -251,8 +268,12 @@ bool load_all_dex_fields(GDexFormat *format) else result = false; + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + return result; } @@ -495,6 +516,7 @@ GDexMethod *get_method_from_dex_pool(GDexFormat *format, uint32_t index) /****************************************************************************** * * * Paramètres : format = représentation interne du format DEX à compléter. * +* status = barre de statut à tenir informée. * * * * Description : Charge toutes les classes listées dans le contenu binaire. * * * @@ -504,9 +526,10 @@ GDexMethod *get_method_from_dex_pool(GDexFormat *format, uint32_t index) * * ******************************************************************************/ -bool load_all_dex_classes(GDexFormat *format) +bool load_all_dex_classes(GDexFormat *format, GtkStatusStack *status) { bool result; /* Bilan à retourner */ + activity_id_t msg; /* Message de progression */ uint32_t i; /* Boucle de parcours */ GDexClass *class; /* Classe récupérée */ @@ -514,6 +537,9 @@ bool load_all_dex_classes(GDexFormat *format) format->classes = (GDexClass **)calloc(format->header.class_defs_size, sizeof(GDexClass *)); + msg = gtk_status_stack_add_activity(status, _("Loading all classes from the Dex pool..."), + format->header.class_defs_size); + for (i = 0; i < format->header.class_defs_size && result; i++) { class = get_class_from_dex_pool(format, i); @@ -523,8 +549,12 @@ bool load_all_dex_classes(GDexFormat *format) else result = false; + gtk_status_stack_update_activity_value(status, msg, 1); + } + gtk_status_stack_remove_activity(status, msg); + return result; } diff --git a/src/format/dex/pool.h b/src/format/dex/pool.h index 8043153..4b804cc 100644 --- a/src/format/dex/pool.h +++ b/src/format/dex/pool.h @@ -43,13 +43,13 @@ const char *get_string_from_dex_pool(const GDexFormat *, uint32_t); /* Charge en mémoire l'ensemble des types du format DEX. */ -bool load_all_dex_types(GDexFormat *); +bool load_all_dex_types(GDexFormat *, GtkStatusStack *); /* Extrait une représentation de type d'une table DEX. */ GDataType *get_type_from_dex_pool(GDexFormat *, uint32_t); /* Charge en mémoire l'ensemble des champs du format DEX. */ -bool load_all_dex_fields(GDexFormat *); +bool load_all_dex_fields(GDexFormat *, GtkStatusStack *); /* Extrait une représentation de champ d'une table DEX. */ GBinVariable *get_field_from_dex_pool(GDexFormat *, uint32_t); @@ -57,14 +57,11 @@ GBinVariable *get_field_from_dex_pool(GDexFormat *, uint32_t); /* Extrait une représentation de routine d'une table DEX. */ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *, uint32_t); -/* Charge toutes les méthodes listées dans le contenu binaire. */ -bool load_all_dex_methods(GDexFormat *); - /* Extrait une représentation de méthode d'une table DEX. */ GDexMethod *get_method_from_dex_pool(GDexFormat *, uint32_t); /* Charge toutes les classes listées dans le contenu binaire. */ -bool load_all_dex_classes(GDexFormat *); +bool load_all_dex_classes(GDexFormat *, GtkStatusStack *); /* Extrait une représentation de classe d'une table DEX. */ GDexClass *get_class_from_dex_pool(GDexFormat *, uint32_t); diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c index d09b845..7ea9417 100644 --- a/src/format/elf/elf.c +++ b/src/format/elf/elf.c @@ -243,10 +243,13 @@ static void g_elf_format_finalize(GElfFormat *format) GBinFormat *g_elf_format_new(GBinContent *content, GExeFormat *parent, GtkStatusStack *status) { GElfFormat *result; /* Structure à retourner */ + GBinFormat *base; /* Version basique du format */ result = g_object_new(G_TYPE_ELF_FORMAT, NULL); - g_binary_format_set_content(G_BIN_FORMAT(result), content); + base = G_BIN_FORMAT(result); + + g_binary_format_set_content(base, content); if (!read_elf_header(result, &result->header, &result->is_32b, &result->endian)) { @@ -302,10 +305,10 @@ GBinFormat *g_elf_format_new(GBinContent *content, GExeFormat *parent, GtkStatus } - if (!g_binary_format_complete_loading(G_BIN_FORMAT(result))) + if (!g_binary_format_complete_loading(base, status)) goto gefn_error; - return G_BIN_FORMAT(result); + return base; gefn_error: diff --git a/src/format/format-int.h b/src/format/format-int.h index b19749d..9282b3c 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -84,7 +84,7 @@ struct _GBinFormatClass /* Effectue les ultimes opérations de chargement d'un binaire. */ -bool g_binary_format_complete_loading(GBinFormat *); +bool g_binary_format_complete_loading(GBinFormat *, GtkStatusStack *); /* Définit le contenu binaire à analyser. */ void g_binary_format_set_content(GBinFormat *, GBinContent *); diff --git a/src/format/format.c b/src/format/format.c index ef8258f..5e5755c 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -107,6 +107,7 @@ static void g_binary_format_init(GBinFormat *format) /****************************************************************************** * * * Paramètres : format = instance à traiter. * +* status = barre de statut à tenir informée. * * * * Description : Effectue les ultimes opérations de chargement d'un binaire. * * * @@ -116,9 +117,9 @@ static void g_binary_format_init(GBinFormat *format) * * ******************************************************************************/ -bool g_binary_format_complete_loading(GBinFormat *format) +bool g_binary_format_complete_loading(GBinFormat *format, GtkStatusStack *status) { - handle_binary_format(PGA_FORMAT_LOADER_LAST, format); + handle_binary_format(PGA_FORMAT_LOADER_LAST, format, status); g_binary_format_delete_duplicated_symbols(format); diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h index 071dc6c..33e7001 100644 --- a/src/plugins/pglist.h +++ b/src/plugins/pglist.h @@ -61,12 +61,12 @@ const GPluginModule **get_all_plugins_for_action(PluginAction, size_t *); while (0) -/* DPS_FORMAT / PGA_FORMAT_MATCHER */ +/* DPS_FORMAT */ #define find_matching_format() -#define handle_binary_format(a, f) \ - process_all_plugins_for(a, g_plugin_module_handle_binary_format, f) +#define handle_binary_format(a, f, s) \ + process_all_plugins_for(a, g_plugin_module_handle_binary_format, f, s) diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index f786c08..f644f05 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -49,7 +49,7 @@ typedef void (* pg_process_disassembly_fc) (const GPluginModule *, PluginAction, //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 *); +typedef bool (* pg_handle_format) (const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index c0e9fd1..d6dc891 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -488,6 +488,7 @@ void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessag * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * format = format de binaire à manipuler pendant l'opération. * +* status = barre de statut à tenir informée. * * * * Description : Procède à une opération liée au format de fichier uniquement.* * * @@ -497,9 +498,9 @@ void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessag * * ******************************************************************************/ -bool g_plugin_module_handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format) +bool g_plugin_module_handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status) { - return plugin->handle_format(plugin, action, format); + return plugin->handle_format(plugin, action, format, status); } diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index b974ca8..33c4a2e 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -62,7 +62,7 @@ const plugin_interface *g_plugin_module_get_interface(const GPluginModule *); /* Procède à une opération liée au format de fichier uniquement. */ -bool g_plugin_module_handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *); +bool g_plugin_module_handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); /* Exécute une action pendant un désassemblage de binaire. */ void g_plugin_module_process_disassembly_event(const GPluginModule *, PluginAction, GLoadedBinary *); -- cgit v0.11.2-87-g4458