diff options
Diffstat (limited to 'src/format')
-rwxr-xr-x | src/format/dex/dex.c | 46 | ||||
-rw-r--r-- | src/format/format-int.h | 3 | ||||
-rw-r--r-- | src/format/format.c | 24 | ||||
-rw-r--r-- | src/format/format.h | 3 |
4 files changed, 76 insertions, 0 deletions
diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c index e30ed7a..25482af 100755 --- a/src/format/dex/dex.c +++ b/src/format/dex/dex.c @@ -45,6 +45,9 @@ static void g_dex_format_class_init(GDexFormatClass *); /* Initialise une instance de format d'exécutable DEX. */ static void g_dex_format_init(GDexFormat *); +/* Détermine tous les fichiers source indiqués. */ +static void g_dex_format_find_all_sources(GDexFormat *); + /* Procède à la décompilation complète du format. */ static void g_dex_format_decompile(const GDexFormat *, GCodeBuffer *, const char *); @@ -191,6 +194,7 @@ GBinFormat *g_dex_format_new(const bin_t *content, off_t length) register_all_dex_class_methods(result); + g_dex_format_find_all_sources(result); return G_BIN_FORMAT(result); @@ -200,6 +204,48 @@ GBinFormat *g_dex_format_new(const bin_t *content, off_t length) /****************************************************************************** * * +* Paramètres : format = informations chargées à mettre à jour. * +* * +* Description : Détermine tous les fichiers source indiqués. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_dex_format_find_all_sources(GDexFormat *format) +{ + GBinFormat *bf; /* Instance parente */ + size_t i; /* Boucle de parcours #1 */ + const char *source; /* Fichier source trouvé */ + bool found; /* Présence dans la liste */ + size_t k; /* Boucle de parcours #2 */ + + bf = G_BIN_FORMAT(format); + + for (i = 0; i < format->classes_count; i++) + { + source = g_dex_class_get_source_file(format->classes[i], format); + found = false; + + for (k = 0; k < bf->src_count && !found; k++) + found = (strcmp(source, bf->src_files[k]) == 0); + + if (!found) + { + bf->src_files = (const char **)realloc(bf->src_files, + ++bf->src_count * sizeof(const char **)); + bf->src_files[bf->src_count - 1] = source; + } + + } + +} + + +/****************************************************************************** +* * * Paramètres : format = informations chargées à consulter. * * buffer = tampon mis à disposition pour la sortie. * * filename = nom du fichier source à cibler. * diff --git a/src/format/format-int.h b/src/format/format-int.h index 27d4129..5473e57 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -50,6 +50,9 @@ struct _GBinFormat GBinRoutine **routines; /* Liste des routines trouvées */ size_t routines_count; /* Nombre de ces routines */ + const char **src_files; /* Nom des fichiers source */ + size_t src_count; /* Taille de la liste */ + size_t def_source; /* Fichier source principal */ format_decompile_fc decompile; /* Décompilation d'un fichier */ }; diff --git a/src/format/format.c b/src/format/format.c index e618120..c104649 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -335,6 +335,30 @@ GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *format, GBi /****************************************************************************** * * +* Paramètres : format = informations chargées à consulter. * +* count = taille de la liste retournée. [OUT] * +* defsrc = fichier de code principal. [OUT] * +* * +* Description : Fournit la liste des fichiers source détectés. * +* * +* Retour : Liste de noms de fichier ou NULL si aucun. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char * const *g_binary_format_get_source_files(const GBinFormat *format, size_t *count, size_t *defsrc) +{ + *count = format->src_count; + *defsrc = format->def_source; + + return format->src_files; + +} + + +/****************************************************************************** +* * * Paramètres : format = informations chargées à consulter. * * buffer = tampon mis à disposition pour la sortie. * * filename = nom du fichier source à cibler. * diff --git a/src/format/format.h b/src/format/format.h index 5a8c684..90aabbc 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -75,6 +75,9 @@ GBinRoutine **g_binary_format_get_routines(const GBinFormat *, size_t *); /* Procède à la décompilation basique d'une routine donnée. */ GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *, GBinRoutine *); +/* Fournit la liste des fichiers source détectés. */ +const char * const *g_binary_format_get_source_files(const GBinFormat *, size_t *, size_t *); + /* Procède à la décompilation complète du format. */ void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *filename); |