Probleme de taille de structure [Résolu]

Signaler
Messages postés
17
Date d'inscription
lundi 7 juillet 2003
Statut
Membre
Dernière intervention
22 juillet 2008
-
Messages postés
17
Date d'inscription
lundi 7 juillet 2003
Statut
Membre
Dernière intervention
22 juillet 2008
-
Bonjour, je suis en train de programmer un lecteur de mémoire et j'ai un problème avec la taille d'une structure.

Voici ma structure :

<sub>struct QuestLog
{
    DWORD ql1;
    DWORD ql2[2];
};

struct Cplayer
{
    /*0x0000*/ WOWGUID GUID;
    /*0x0008*/ DWORD Type;
    /*0x000c*/ DWORD Entry;
    //tons of other ....

    /*0x03b0*/ QuestLog questLog[25];
    /*0x04dc*/ VisibleItem visibleItem[19];
        //others...
};
</sub>
Je rempli ma structure à l'aide de mon MemoryReader avec :

<sub>CPlayer player;

mem->read( playerptr.UnitData, &player, sizeof(CJoueur) ) ;</sub>


et
<sub>

bool CMemoryReader::read(const DWORD &addr, void * value, const DWORD &size_, SIZE_T * total)

{

    if( this->gHandle == INVALID_HANDLE_VALUE ) return false;

    BOOL ok = false;

    ok = ReadProcessMemory(this->gHandle, (LPCVOID)addr, value, size_, total);

    _error();

    return ok;

}</sub>

et mon code de test :

<sub>DWORD pos_GUID = (DWORD) &(j->GUID);
    DWORD pos_rel_questlog = (DWORD) &(j->questLog) - pos_GUID;
    DWORD normal_position_visibleitem = pos_rel_questlog + sizeof(j->questLog);

    DWORD pos_rel_visibleitem = (DWORD) &(j->visibleItem) - pos_GUID;
    ILogger::Log("relative adress QuestLog : %p", pos_rel_questlog);
    ILogger::Log("normal position (should be) of visibleItem : %p", normal_position_visibleitem);
    ILogger::Log("the value i get : %p", pos_rel_visibleitem);</sub>

Si je ne faisais aps d'erreur, je devrais avoir les même valeurs pour "normal_position_visibleitem" et  "pos_rel_visibleitem" mais j'ai une différence de 4 bytes (1 DWORD?)

En calculant manuellement la taille de questLog je trouve  (DWORD=4 *3 * 25) = 300 = 12C or 12C+3B0 = 4dc mais dans mon programme de test, ce n'est pas ce que je trouve.

Je ne comprend pas pourquoi j'ai une différence (ce qui décale les adresses de toute ma structure et toutes les autres membres sont donc faux.

   

2 réponses

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Salut regarde bien si ta structure est correctement alignée, si ce n'est pas le cas le compilateur peut rajouter des octets pour l'aligner a ta place, par defaut les structures sont alignés sur 4 octets, il est cependant possible de changer cette valeur grace a la directive pack: http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx
Un peu de doc sur l'alignement des structures:
http://msdn.microsoft.com/en-us/library/71kf49f1(VS.80).aspx
Cette doc s'applique pour les systemes 64bits donc les structures sont alignées sur 8 octets, mais le principe reste le meme..

Neo_Fr
Messages postés
17
Date d'inscription
lundi 7 juillet 2003
Statut
Membre
Dernière intervention
22 juillet 2008
1
je te remercie, je ne connaissait rien en alignement, d'ailleurs, ça me semble toujours un peu flou mais j'ai réussi à corriger mon erreur, en ajoutant juste un pack(4).

Mais je vois pas trop pourquoi le compilateur fais ce type d'arrangement c'est pour gagner de la vitesse?