summaryrefslogtreecommitdiff
path: root/plugins/dex/pool.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/dex/pool.c')
-rw-r--r--plugins/dex/pool.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/plugins/dex/pool.c b/plugins/dex/pool.c
index e7dd205..c24617a 100644
--- a/plugins/dex/pool.c
+++ b/plugins/dex/pool.c
@@ -24,6 +24,7 @@
#include "pool.h"
+#include <assert.h>
#include <malloc.h>
#include <string.h>
@@ -282,6 +283,7 @@ uint32_t g_dex_pool_count_strings(const GDexPool *pool)
* *
* Paramètres : pool = table de resources pour format Dex à consulter. *
* index = index de la chaîne recherchée. *
+* mark = marque la chaîne comme structurelle si définie. *
* range = éventuelle couverture à renseigner ou NULL. [OUT] *
* *
* Description : Extrait une chaîne de caractères d'une table DEX. *
@@ -292,7 +294,7 @@ uint32_t g_dex_pool_count_strings(const GDexPool *pool)
* *
******************************************************************************/
-const char *g_dex_pool_get_string(const GDexPool *pool, uint32_t index, mrange_t *range)
+const char *g_dex_pool_get_string(const GDexPool *pool, uint32_t index, bool *mark, mrange_t *range)
{
uint32_t count; /* Nombre d'éléments présents */
GDexFormat *format; /* Format associé à la table */
@@ -322,6 +324,15 @@ const char *g_dex_pool_get_string(const GDexPool *pool, uint32_t index, mrange_t
if (!read_dex_string_data_item(format, &addr, &inter, &str_data))
return NULL;
+ if (mark != NULL)
+ {
+ assert(*mark);
+
+ assert(pool->strings[index] != NULL);
+ g_string_symbol_set_structural(G_STR_SYMBOL(pool->strings[index]), true);
+
+ }
+
if (range != NULL)
{
diff = compute_vmpa_diff(&inter, &addr);
@@ -367,7 +378,7 @@ GBinSymbol *g_dex_pool_get_string_symbol(GDexPool *pool, uint32_t index)
if (pool->strings[index] == NULL)
{
- string = g_dex_pool_get_string(pool, index, &range);
+ string = g_dex_pool_get_string(pool, index, NULL, &range);
if (string == NULL) goto gssfdp_error;
base = G_BIN_FORMAT(pool->format);
@@ -549,11 +560,7 @@ GDataType *g_dex_pool_get_type_(GDexPool *pool, uint32_t index)
{
GDataType *result; /* Instance à retourner */
type_id_item type_id; /* Définition de la classe */
- GDexFormat *format; /* Format associé à la table */
- phys_t pos; /* Tête de lecture */
- vmpa2t addr; /* Tête de lecture générique */
- string_id_item str_id; /* Identifiant de chaîne */
- string_data_item str_data; /* Description de chaîne */
+ const char *desc; /* Description de type */
result = NULL;
@@ -562,21 +569,10 @@ GDataType *g_dex_pool_get_type_(GDexPool *pool, uint32_t index)
if (!g_dex_pool_get_raw_type(pool, index, &type_id))
goto no_type_id;
- format = pool->format;
-
- pos = format->header.string_ids_off + type_id.descriptor_idx * sizeof(string_id_item);
- init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
-
- if (!read_dex_string_id_item(format, &addr, &str_id))
- goto type_error;
-
- pos = str_id.string_data_off;
- init_vmpa(&addr, pos, VMPA_NO_VIRTUAL);
-
- if (!read_dex_string_data_item(format, &addr, NULL, &str_data))
- goto type_error;
+ desc = g_dex_pool_get_string(pool, type_id.descriptor_idx, (bool []) { true }, NULL);
+ if (desc == NULL) goto type_error;
- pool->types[index] = g_binary_format_decode_type(G_BIN_FORMAT(format), (char *)str_data.data);
+ pool->types[index] = g_binary_format_decode_type(G_BIN_FORMAT(pool->format), desc);
}
@@ -760,9 +756,9 @@ GBinVariable *g_dex_pool_get_field(GDexPool *pool, uint32_t index)
type = g_dex_pool_get_type_(pool, field_id.type_idx);
if (type == NULL) goto type_error;
- name = g_dex_pool_get_string(pool, field_id.name_idx, NULL);
+ name = g_dex_pool_get_string(pool, field_id.name_idx, (bool []) { true }, NULL);
if (name == NULL) goto bad_name;
-
+
field = g_binary_variable_new(type);
g_binary_variable_set_name(field, name);
@@ -909,6 +905,13 @@ GBinRoutine *g_dex_pool_get_prototype(GDexPool *pool, uint32_t index)
* autres champs de la structure, donc l'information paraît redondante.
*/
+ /**
+ * On marque cependant la chaîne de description comme étant structurelle.
+ */
+
+ assert(pool->strings[proto_id.shorty_idx] != NULL);
+ g_string_symbol_set_structural(G_STR_SYMBOL(pool->strings[proto_id.shorty_idx]), true);
+
/* Type de retour */
type = g_dex_pool_get_type_(pool, proto_id.return_type_idx);