DOS标头表示为C数据结构

时间:2017-03-22 07:05:14

标签: c windows

当我想知道pe文件的dos header.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;
     }

在void *中有一些变量定义;我搜索并得出这个结论:" 16位平台上的VOID和CHAR指针的大小是:2字节,32位:4字节在64位:8个字节。 void指针和char指针的大小在C / C ++中都是相同的大小,但是,依赖于平台"
我也建立了一个win32程序test.exe使用C ++(picture)而void *是4byte;
并找出dos标题是:char + 25 * short + long + 4 * void * = 56 + 4 * void * = 72Byte;

但是用winhex(picture)打开它,DOS标头= 64Byte。

在这个github项目中(Sable / McCli / blob / master / CliKit / IO / PE / IMAGE_DOS_HEADER.cs),void *被ushort取代;

那么如何在dos标题中理解void * size?它在16bit,32bit和64bit平台上总是2byte?

2 个答案:

答案 0 :(得分:0)

指针是内存的地址,它取决于(如你所说)架构。每个体系结构都能够处理特定数量的内存,为此,指针定义为给定的大小。

示例:

  • 我的桌面计算机使用64位。
  • 我的Pic16F1709是8位架构,内存地址长度不同,具体取决于类型)数据存储器为12位,程序存储器为15位等。
  

如何在dos标题中理解void * size?在16bit,32bit和64bit平台上它总是2byte吗?

你不能说。大部分时间都是,但没有任何力量。

在您的代码中,最终结构的大小会有所不同。

答案 1 :(得分:0)

提供的C结构只是一个例子(它应该在维基上更新)。在winnt.h中有一个完整的定义。您会看到结构中没有指针,但它们是"初始大小"。定义是:

#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)