diff options
Diffstat (limited to 'plugins/pychrysalide')
-rw-r--r-- | plugins/pychrysalide/arch/vmpa.c | 125 |
1 files changed, 122 insertions, 3 deletions
diff --git a/plugins/pychrysalide/arch/vmpa.c b/plugins/pychrysalide/arch/vmpa.c index 605b04d..20784cd 100644 --- a/plugins/pychrysalide/arch/vmpa.c +++ b/plugins/pychrysalide/arch/vmpa.c @@ -76,6 +76,12 @@ static bool convert_pyobj_to_vmpa(PyObject *, vmpa2t *); /* Effectue une opération de type 'add' avec le type 'vmpa'. */ static PyObject *py_vmpa_nb_add(PyObject *, PyObject *); +/* Effectue une opération de type 'sub' avec le type 'vmpa'. */ +static PyObject *py_vmpa_nb_subtract(PyObject *, PyObject *); + +/* Effectue une opération de type 'add' sur une instance 'vmpa'. */ +static PyObject *py_vmpa_nb_inplace_add(PyObject *, PyObject *); + /* ------------------------ DEFINITION D'UNE ZONE EN MEMOIRE ------------------------ */ @@ -499,6 +505,8 @@ static PyObject *py_vmpa_nb_add(PyObject *o1, PyObject *o2) vmpa2t addr1; /* Première adresse à traiter */ vmpa2t addr2; /* Seconde adresse à traiter */ PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */ + phys_t new_phys; /* Nouvelle position */ + virt_t new_virt; /* Nouvelle adresse */ if (!convert_pyobj_to_vmpa(o1, &addr1)) return NULL; @@ -510,9 +518,117 @@ static PyObject *py_vmpa_nb_add(PyObject *o1, PyObject *o2) result = PyObject_CallObject((PyObject *)py_vmpa_type, NULL); - init_vmpa(&((py_vmpa_t *)result)->addr, - addr1.physical + addr2.physical, - addr1.virtual + addr2.virtual); + if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL) + new_phys = addr1.physical + addr2.physical; + else + new_phys = NO_PHYSICAL; + + if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL) + new_virt = addr1.virtual + addr2.virtual; + else + new_virt = NO_VIRTUAL; + + init_vmpa(&((py_vmpa_t *)result)->addr, new_phys, new_virt); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : o1 = premier élément concerné par l'opération. * +* o2 = second élément concerné par l'opération. * +* * +* Description : Effectue une opération de type 'sub' avec le type 'vmpa'. * +* * +* Retour : Résultat de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_vmpa_nb_subtract(PyObject *o1, PyObject *o2) +{ + PyObject *result; /* Résultat à retourner */ + vmpa2t addr1; /* Première adresse à traiter */ + vmpa2t addr2; /* Seconde adresse à traiter */ + PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */ + phys_t new_phys; /* Nouvelle position */ + virt_t new_virt; /* Nouvelle adresse */ + + if (!convert_pyobj_to_vmpa(o1, &addr1)) + return NULL; + + if (!convert_pyobj_to_vmpa(o2, &addr2)) + return NULL; + + py_vmpa_type = get_python_vmpa_type(); + + result = PyObject_CallObject((PyObject *)py_vmpa_type, NULL); + + if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL) + new_phys = addr1.physical - addr2.physical; + else + new_phys = NO_PHYSICAL; + + if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL) + new_virt = addr1.virtual - addr2.virtual; + else + new_virt = NO_VIRTUAL; + + init_vmpa(&((py_vmpa_t *)result)->addr, new_phys, new_virt); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : o1 = premier élément concerné par l'opération. * +* o2 = second élément concerné par l'opération. * +* * +* Description : Effectue une opération de type 'add' sur une instance 'vmpa'.* +* * +* Retour : Résultat de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_vmpa_nb_inplace_add(PyObject *o1, PyObject *o2) +{ + PyObject *result; /* Résultat à retourner */ + vmpa2t addr1; /* Première adresse à traiter */ + vmpa2t addr2; /* Seconde adresse à traiter */ + phys_t new_phys; /* Nouvelle position */ + virt_t new_virt; /* Nouvelle adresse */ + vmpa2t *inplace; /* Données à modifier */ + + if (!convert_pyobj_to_vmpa(o1, &addr1)) + return NULL; + + if (!convert_pyobj_to_vmpa(o2, &addr2)) + return NULL; + + if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL) + new_phys = addr1.physical + addr2.physical; + else + new_phys = NO_PHYSICAL; + + if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL) + new_virt = addr1.virtual + addr2.virtual; + else + new_virt = NO_VIRTUAL; + + inplace = get_internal_vmpa(o1); + + inplace->physical = new_phys; + inplace->virtual = new_virt; + + result = o1; + Py_INCREF(result); return result; @@ -536,6 +652,9 @@ PyTypeObject *get_python_vmpa_type(void) static PyNumberMethods py_vmpa_nb_proto = { .nb_add = py_vmpa_nb_add, + .nb_subtract = py_vmpa_nb_subtract, + + .nb_inplace_add = py_vmpa_nb_inplace_add, /* binaryfunc nb_add; |