Unlogischer Fehler mit ReadProcessMemory und einer struct.



  • Hallo.
    Ich bin am Verzweifeln.

    Ich versuche gerade eine Datei aus einer Anwendung zur Laufzeit auszulesen. Ich weiß wie die Datei aufgebaut ist und wo die Datei im Speicher liegt und gebe dementsprechend die adresse an.

    Ich habe folgende struct:

    struct XM_PatternHeader_0103 
    {   
        DWORD HeaderSize; // size of this header (always 9)
    
        BYTE PackingType; // packing type (always 0)
        WORD NumberOfRows, // number of rows in pattern (1..256)
        DataSize; // packed pattern data size
    };
    

    Und hiermit will ich diese füllen:

    ReadProcessMemory(hProcess, (void *)dwTempAddress, &ModPatternHeader_0103, sizeof(ModPatternHeader_0103), &lpNumberOfBytesRead);
    

    Ich habe mal nen debugger angeschmissen. Im Speicher des Prozesses steht: 0x09 0x12 0x13 0x14 0x00 0x40 0x00 0xB6 0x04
    lustigerweise steht das hier nach ReadProcessMemory in der struct:
    **
    Headersize: 0x14131209 //Richtig (habe zum testen 121314 in den speicher geschrieben)
    PackingType: 0x00 //Richtig
    Number of Rows: 0xb600 //Falsch, ein byte wurde einfach übersprungen. Richtig wäre 0x0040
    DataSize: 0x8304 //Folgefehler, richtig wäre 0x04B6
    **
    Woran liegt das? Es wird jedesmal das 0x40 byte einfach übersprungen. Ich habe es mal probeweise in einen char einlesen lassen. Es wird korrekt eingelesen, nur bei beim kopieren in ModPatternHeader_0103 wird das byte dann einfach übersprungen. Hab es auch schon mit class anstatt struct probiert, ändert nix. Weiß jemand rat?



  • Muss die Struktur vielleicht packed compiliert werden?
    Probiers mal, z.B. mit

    #pragma pack(push, 1)
    struct YourStruct{
    }
    #pragma pack(pop)
    


  • ja kann sein. Ich habe den code aus nem delphi source konvertiert. Da stand was von packed record. Was ist dieses packed zeugs eigentlich?



  • Danke vielmals, es funktioniert. :)) hm, jetzt hab ich wohl umsonst die ganzen readprocessmemorys gemacht.
    Ich habe schon gemerkt dass er den speicher irgendwie versucht in blöcke einzuteilen.
    Ich konnte zwar einzelne bytes zwischenschieben, allerdings konnte ich nicht die kompletten datentypen verschieben.

    Ich dachte schon es sei ein bug. Aber so ist das beim Programmieren, man lernt immer dazu. 🙂


  • Mod

    Um es dem Prozessor leichter zu machen auf Daten zuzugreifen werden die auf bestimmte Boundaries (grenzen) aligned (asugerichtet). Meistens sind es 4 Byte Grenzen oder gar 8 Bytes. Definierst Du also zwei WORD's hintereinander, so wird entsprechend dem alignment 2 oder 6 Bytes aufgefüllt. mit pragma pack(1) schaltest Du dieses Alignment praktisch aus.



  • Exakt. Das Pendant zu #pragma pack( push, 1) ist in Delphi der packed record.


Anmelden zum Antworten