Probleme de taille de structure

Résolu
hisoka56 Messages postés 17 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 22 juillet 2008 - 22 juil. 2008 à 10:57
hisoka56 Messages postés 17 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 22 juillet 2008 - 22 juil. 2008 à 12:05
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

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
22 juil. 2008 à 11:48
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
3
hisoka56 Messages postés 17 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 22 juillet 2008 1
22 juil. 2008 à 12:05
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?
0