summaryrefslogtreecommitdiff
path: root/src/analysis/contents
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-09-27 22:50:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-09-27 22:50:50 (GMT)
commit32f7a1126f8ac5a602f60a29de18eb7c5683dcc2 (patch)
treef92189c4d5d8f164c4b666289dd40344d71d39f9 /src/analysis/contents
parentad4ae001fbb37bdccd99ef1e01404ae72c0a1318 (diff)
Read LEB128 values from binary contents.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@579 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/contents')
-rw-r--r--src/analysis/contents/file.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c
index 9f1c10c..f24e930 100644
--- a/src/analysis/contents/file.c
+++ b/src/analysis/contents/file.c
@@ -109,6 +109,12 @@ static bool g_file_content_read_u32(const GFileContent *, vmpa2t *, SourceEndian
/* Lit un nombre non signé sur huit octets. */
static bool g_file_content_read_u64(const GFileContent *, vmpa2t *, SourceEndian, uint64_t *);
+/* Lit un nombre non signé encodé au format LEB128. */
+static bool g_file_content_read_uleb128(const GFileContent *, vmpa2t *, uleb128_t *);
+
+/* Lit un nombre signé encodé au format LEB128. */
+static bool g_file_content_read_leb128(const GFileContent *, vmpa2t *, leb128_t *);
+
/* Indique le type défini par la GLib pour les contenus de données. */
@@ -193,6 +199,9 @@ static void g_file_content_interface_init(GBinContentInterface *iface)
iface->read_u32 = (read_u32_fc)g_file_content_read_u32;
iface->read_u64 = (read_u64_fc)g_file_content_read_u64;
+ iface->read_uleb128 = (read_uleb128_fc)g_file_content_read_uleb128;
+ iface->read_leb128 = (read_leb128_fc)g_file_content_read_leb128;
+
}
@@ -729,3 +738,77 @@ static bool g_file_content_read_u64(const GFileContent *content, vmpa2t *addr, S
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à venir lire. *
+* addr = position de la tête de lecture. *
+* val = lieu d'enregistrement de la lecture. [OUT] *
+* *
+* Description : Lit un nombre non signé encodé au format LEB128. *
+* *
+* Retour : Bilan de l'opération : true en cas de succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_file_content_read_uleb128(const GFileContent *content, vmpa2t *addr, uleb128_t *val)
+{
+ bool result; /* Bilan de lecture à renvoyer */
+ phys_t pos; /* Tête de lecture courante */
+ phys_t length; /* Taille de la surface dispo. */
+
+ pos = get_phy_addr(addr);
+
+ if (pos == VMPA_NO_PHYSICAL)
+ return false;
+
+ length = get_mrange_length(&content->range);
+
+ result = read_uleb128(val, content->data, &pos, length);
+
+ if (result)
+ advance_vmpa(addr, pos - get_phy_addr(addr));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à venir lire. *
+* addr = position de la tête de lecture. *
+* val = lieu d'enregistrement de la lecture. [OUT] *
+* *
+* Description : Lit un nombre signé encodé au format LEB128. *
+* *
+* Retour : Bilan de l'opération : true en cas de succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_file_content_read_leb128(const GFileContent *content, vmpa2t *addr, leb128_t *val)
+{
+ bool result; /* Bilan de lecture à renvoyer */
+ phys_t pos; /* Tête de lecture courante */
+ phys_t length; /* Taille de la surface dispo. */
+
+ pos = get_phy_addr(addr);
+
+ if (pos == VMPA_NO_PHYSICAL)
+ return false;
+
+ length = get_mrange_length(&content->range);
+
+ result = read_leb128(val, content->data, &pos, length);
+
+ if (result)
+ advance_vmpa(addr, pos - get_phy_addr(addr));
+
+ return result;
+
+}