diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/pychrysa/analysis/content.c | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/plugins/pychrysa/analysis/content.c b/plugins/pychrysa/analysis/content.c index 5565129..95f88f6 100644 --- a/plugins/pychrysa/analysis/content.c +++ b/plugins/pychrysa/analysis/content.c @@ -46,6 +46,9 @@ static PyObject *py_binary_content_get_checksum(PyObject *, PyObject *); /* Détermine le nombre d'octets lisibles. */ static PyObject *py_binary_content_compute_size(PyObject *, PyObject *); +/* Fournit une portion des données représentées. */ +static PyObject *py_binary_content_read_raw(PyObject *, PyObject *); + /* Lit un nombre non signé sur un octet. */ static PyObject *py_binary_content_read_u8(PyObject *, PyObject *); @@ -125,6 +128,52 @@ static PyObject *py_binary_content_compute_size(PyObject *self, PyObject *args) * Paramètres : self = contenu binaire à manipuler. * * args = non utilisé ici. * * * +* Description : Fournit une portion des données représentées. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_content_read_raw(PyObject *self, PyObject *args) +{ + PyObject *result; /* Instance à retourner */ + GBinContent *content; /* Version GLib du format */ + PyObject *addr_obj; /* Objet pour une position */ + vmpa2t *addr; /* Position interne associée */ + unsigned long long length; /* Quantité de données à lire */ + int ret; /* Bilan de lecture des args. */ + const bin_t *val; /* Valeur lue à faire suivre */ + + content = G_BIN_CONTENT(pygobject_get(self)); + assert(content != NULL); + + ret = PyArg_ParseTuple(args, "OK", &addr_obj, &length); + if (!ret) return NULL; + + addr = get_internal_vmpa(addr_obj); + assert(addr != NULL); + + val = g_binary_content_get_raw_access(content, addr, length); + if (val == NULL) + { + PyErr_SetString(PyExc_Exception, _("Invalid read access.")); + return NULL; + } + + result = PyBytes_FromStringAndSize((char *)val, length); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = contenu binaire à manipuler. * +* args = non utilisé ici. * +* * * Description : Lit un nombre non signé sur un octet. * * * * Retour : Bilan de l'opération. * @@ -159,7 +208,7 @@ static PyObject *py_binary_content_read_u8(PyObject *self, PyObject *args) return NULL; } - result = PyBytes_FromStringAndSize((char *)&val, 1); + result = PyLong_FromUnsignedLong(val); return result; @@ -206,7 +255,7 @@ static PyObject *py_binary_content_read_u16(PyObject *self, PyObject *args) return NULL; } - result = PyBytes_FromStringAndSize((char *)&val, 2); + result = PyLong_FromUnsignedLong(val); return result; @@ -253,7 +302,7 @@ static PyObject *py_binary_content_read_u32(PyObject *self, PyObject *args) return NULL; } - result = PyBytes_FromStringAndSize((char *)&val, 4); + result = PyLong_FromUnsignedLong(val); return result; @@ -299,7 +348,7 @@ static PyObject *py_binary_content_read_u64(PyObject *self, PyObject *args) return NULL; } - result = PyBytes_FromStringAndSize((char *)&val, 8); + result = PyLong_FromUnsignedLongLong(val); return result; @@ -332,6 +381,11 @@ PyTypeObject *get_python_binary_content_type(void) "compute_size($self, /)\n--\n\nCompute the quantity of readable bytes." }, { + "read_raw", py_binary_content_read_raw, + METH_VARARGS, + "read_raw($self, addr, length, /)\n--\n\nRead bytes from a given position." + }, + { "read_u8", py_binary_content_read_u8, METH_VARARGS, "read_u8($self, addr, /)\n--\n\nRead an unsigned byte from a given position." |