windows - DOS header præsenteret som en C datastruktur

Indlæg af Hanne Mølgaard Plasc

Problem



når jeg vil kende pe filens dos header.i får dette i wikibook (X86\_Disassembly/Windows\_Executable\_Files):


 Here is the DOS header presented as a C data structure:  
    struct DOS\_Header 
     {
    // short is 2 bytes, long is 4 bytes
         char signature[2] = "MZ";
         short lastsize;
         short nblocks;
         short nreloc;
         short hdrsize;
         short minalloc;
         short maxalloc;
         void *ss;
         void *sp;
         short checksum;
         void *ip;
         void *cs;
         short relocpos;
         short noverlay;
         short reserved1[4];
         short oem\_id;
         short oem\_info;
         short reserved2[10];
         long  e\_lfanew;
     }


der er en variabel definere i ugyldig *; jeg søger og får denne konklusion: 'Størrelse af VOID og CHAR-pointer på 16 bit Platform er: 2 byte, på 32 bit: 4 byte og på 64 bit: 8 byte. Størrelsen af ​​tomrummer og karbonpeger er begge af samme størrelse i C/C ++, men platformafhængige '

også jeg bygger en win32 program test.exe brug C + + (billede) og void * er 4byte;

og finde ud af dos header er: char + 25 * kort + lang + 4 * void *=56 + 4 * void *=72Byte; [4]


men åbn den med winhex (billede), DOS header=64Byte. [5]


I dette github-projekt (Sable/McCli/blob/master/CliKit/IO/PE/IMAGE\_DOS\_HEADER.cs) blev void * erstattet af ushort;


så hvordan understant void * størrelse i dos header? er det altid 2byte i 16bit, 32bit og 64bit platform?

Bedste reference


C-strukturen er kun et eksempel (og det skal opdateres på wiki). I winnt.h er der en fuld definition. Du kan se, at der ikke er nogen pointers i strukturen, men at de er 'oprindelige størrelser'. Definitionen er:


#pragma pack(push,2)
typedef struct \_IMAGE\_DOS\_HEADER {      // DOS .EXE header
    WORD   e\_magic;                     // Magic number
    WORD   e\_cblp;                      // Bytes on last page of file
    WORD   e\_cp;                        // Pages in file
    WORD   e\_crlc;                      // Relocations
    WORD   e\_cparhdr;                   // Size of header in paragraphs
    WORD   e\_minalloc;                  // Minimum extra paragraphs needed
    WORD   e\_maxalloc;                  // Maximum extra paragraphs needed
    WORD   e\_ss;                        // Initial (relative) SS value
    WORD   e\_sp;                        // Initial SP value
    WORD   e\_csum;                      // Checksum
    WORD   e\_ip;                        // Initial IP value
    WORD   e\_cs;                        // Initial (relative) CS value
    WORD   e\_lfarlc;                    // File address of relocation table
    WORD   e\_ovno;                      // Overlay number
    WORD   e\_res[4];                    // Reserved words
    WORD   e\_oemid;                     // OEM identifier (for e\_oeminfo)
    WORD   e\_oeminfo;                   // OEM information; e\_oemid specific
    WORD   e\_res2[10];                  // Reserved words
    LONG   e\_lfanew;                    // File address of new exe header
  } IMAGE\_DOS\_HEADER, *PIMAGE\_DOS\_HEADER;
#pragma pack(pop)

Andre referencer 1


En peger er en hukommelsesadresse, og det afhænger (som sagt) af arkitekturen. Hver arkitektur kan adressere en bestemt mængde hukommelse, og for det er pegerne defineret af en given størrelse.


Eksempler:



  • Mine stationære computere bruger 64bits til begge.

  • Min Pic16F1709 er 8-bit arkitektur, hukommelsesadressen er af forskellig længde afhængigt af typen) 12 bit til datalager, 15 bit til programhukommelse mv.




  hvordan understant void * størrelse i dos header? er det altid 2byte i 16bit, 32bit og 64bit platform?



Du kan ikke sige. Det meste af tiden ja, men intet tvinger det.


I din kode vil størrelsen af ​​den endelige struktur variere.