/* Chrysalide - Outil d'analyse de fichiers binaires * vmpa.h - prototypes des adressages virtuels ou physiques * * Copyright (C) 2014 Cyrille Bagard * * This file is part of Chrysalide. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #ifndef _ARCH_VMPA_H #define _ARCH_VMPA_H #include #include #include #include #include #include "archbase.h" #include "../common/cpp.h" /* Taille de la plus longue chaîne de représentation */ #define VMPA_MAX_LEN (sizeof(STR(ULLONG_MAX)) + 1) /* Constitution guidée de tampons pour impression */ #define VMPA_BUFFER(name) char name[VMPA_MAX_LEN] #define VMPA_NO_PHYSICAL ((off_t)-1) #define VMPA_NO_VIRTUAL ((uint64_t)-2) /* Adresse mémoire ou position physique */ typedef struct _vmpa2t { off_t physical; /* Position physique */ uint64_t virtual; /* Adresse virtuelle */ } vmpa2t; /* Initialise une localisation dans l'espace mémoire/physique. */ void init_vmpa(vmpa2t *, off_t, uint64_t); /* Crée une localisation dans l'adressage mémoire. */ vmpa2t *make_vmpa(off_t, uint64_t); #define delete_vmpa(a) free(a) /* Copie la définition d'un adressage dans un autre. */ void copy_vmpa(vmpa2t *, const vmpa2t *); /* Compare entre elles deux adresses physiques. */ int cmp_vmpa_by_phy(const vmpa2t *, const vmpa2t *); /* Compare entre elles deux adresses virtuelles. */ int cmp_vmpa_by_virt(const vmpa2t *, const vmpa2t *); #define are_equal(a, b) \ (cmp_vmpa_by_phy(a, b) == 0 && cmp_vmpa_by_virt(a, b) == 0) #define get_phy_addr(a) (a)->physical #define get_virt_addr(a) (a)->virtual #define dup_vmpa(src) \ make_vmpa(get_phy_addr(src), get_virt_addr(src)) /* Décalle une position d'une certaine quantité. */ void advance_vmpa(vmpa2t *, off_t); /* Calcule au mieux la distance entre deux coordonnées. */ off_t compute_vmpa_diff(const vmpa2t *, const vmpa2t *); /* Lit la définition d'une adresse depuis un flux réseau. */ bool recv_vmpa(vmpa2t *, int, int); /* Ecrit la définition d'une adresse dans un flux réseau. */ bool send_vmpa(const vmpa2t *, int, int); /* Transforme une adresse physique en chaîne de caractères. */ char *vmpa2_phys_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], size_t *); /* Transforme une adresse virtuelle en chaîne de caractères. */ char *vmpa2_virt_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], size_t *); #endif /* _ARCH_VMPA_H */