summaryrefslogtreecommitdiff
path: root/src/format/dex/pool.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/dex/pool.c')
-rw-r--r--src/format/dex/pool.c114
1 files changed, 46 insertions, 68 deletions
diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c
index 1724dd9..056443e 100644
--- a/src/format/dex/pool.c
+++ b/src/format/dex/pool.c
@@ -342,44 +342,6 @@ GBinVariable *get_field_from_dex_pool(GDexFormat *format, uint32_t index)
/******************************************************************************
* *
-* Paramètres : format = représentation interne du format DEX à compléter. *
-* *
-* Description : Charge tous les prototypes listés dans le contenu binaire. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool load_all_dex_prototypes(GDexFormat *format)
-{
- bool result; /* Bilan à retourner */
- uint32_t i; /* Boucle de parcours */
- GBinRoutine *proto; /* Prototype récupéré */
-
- result = true;
-
- format->prototypes = (GBinRoutine **)calloc(format->header.proto_ids_size, sizeof(GBinRoutine *));
-
- for (i = 0; i < format->header.proto_ids_size && result; i++)
- {
- proto = get_prototype_from_dex_pool(format, i);
-
- if (proto != NULL)
- g_object_unref(G_OBJECT(proto));
- else
- result = false;
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : format = représentation interne du format DEX à consulter. *
* index = index de la routine recherchée. *
* *
@@ -405,56 +367,72 @@ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *format, uint32_t index)
result = NULL;
- if (index >= format->header.method_ids_size)
+ /**
+ * Les prototypes sont personnalisés après chargement.
+ * Donc on ne peut pas conserver de version globale comme pour
+ * les autres éléments de la table des constantes.
+ */
+
+ if (index >= format->header.proto_ids_size)
goto grfdp_error;
- if (format->prototypes[index] == NULL)
- {
- pos = format->header.proto_ids_off + index * sizeof(proto_id_item);
- init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
+ pos = format->header.proto_ids_off + index * sizeof(proto_id_item);
+ init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
- if (!read_dex_proto_id_item(format, &addr, &proto_id))
- goto grfdp_error;
+ if (!read_dex_proto_id_item(format, &addr, &proto_id))
+ goto grfdp_error;
- /* Type de retour */
+ /* Type de retour */
- type = get_type_from_dex_pool(format, proto_id.return_type_idx);
+ type = get_type_from_dex_pool(format, proto_id.return_type_idx);
- /* Nom de la méthode */
+ /* Nom de la méthode */
- name = get_string_from_dex_pool(format, proto_id.shorty_idx);
+ name = get_string_from_dex_pool(format, proto_id.shorty_idx);
- /* Liste des arguments */
+ /* Liste des arguments */
- pos = proto_id.parameters_off;
- init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
+ pos = proto_id.parameters_off;
+ init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
- if (read_dex_type_list(format, &addr, &args))
- for (i = 0; i < args.size; i++)
- {
- type = get_type_from_dex_pool(format, args.list[i].type_idx);
- if (type == NULL) continue;
+ result = g_binary_routine_new();///////////////////////
- arg = g_binary_variable_new(type);
- //g_binary_routine_add_arg(result, arg);
+ if (read_dex_type_list(format, &addr, &args))
+ for (i = 0; i < args.size; i++)
+ {
+ type = get_type_from_dex_pool(format, args.list[i].type_idx);
+ if (type == NULL) continue;
- }
+ printf(" ++ PROTO POOL ++ type '%s'\n", g_data_type_to_string(type));
- /* Mise en place finale */
+ arg = g_binary_variable_new(type);
+ g_binary_routine_add_arg(result, arg);///////////////////////
- format->prototypes[index] = demangle_routine(G_TYPE_DEX_DEMANGLER, name);
+ printf(" ++ PROTO POOL ++ arg '%s'\n", g_binary_variable_to_string(arg, true));
-#if 0
- if (format->prototypes[index] != NULL)
- g_binary_routine_set_return_type(format->prototypes[index], type);
-#endif
+ }
- }
+ /* Mise en place finale */
- result = format->prototypes[index];
+ ///////result = demangle_routine(G_TYPE_DEX_DEMANGLER, name);
+
+ g_binary_routine_set_name(result, strdup("..."));
+
+ printf(" PROTO POOL // from %s to %s\n",
+ name,
+ result == NULL ? NULL :
+ g_binary_routine_to_string(result));
+
+
+#if 1
+ if (result != NULL)///////////////////////
+ g_binary_routine_set_return_type(result, type);
+#endif
+ /*
if (result != NULL)
g_object_ref(G_OBJECT(result));
+ */
grfdp_error: