在PIMAGE_DOS_HEADER上缺少MSDN文档吗?

时间:2018-08-03 05:08:34

标签: c++

_IMAGE_DOS_HEADER / PIMAGE_DOS_HEADER / e_magic / IMAGE_DOS_SIGNATURE上找不到任何文档。

我正在尝试了解此代码的用法:

pIDH=(PIMAGE_DOS_HEADER)buffer;

if(pIDH->e_magic!=IMAGE_DOS_SIGNATURE)
{
    printf("\nError: Invalid executable image.\n");

    VirtualFree(buffer,0,MEM_RELEASE);
    return -1;
}

e_magic是什么,它的目的/意义是什么?为什么要比较IMAGE_DOS_SIGNATURE

我想可能是要确保pIDH是真正的DOS HEADER,但是我很想查看文档

2 个答案:

答案 0 :(得分:1)

每个Windows程序都有一个DOS存根程序,因此,如果您尝试在MS-DOS下执行该程序,通常会打印出“此程序需要Microsoft Windows”或类似的内容。

因此,它以实际的DOS可执行标头和几十个字节的代码/数据开始。回到16位的日子里,链接器使您可以指定要使用的DOS存根程序,因此,如果您想变得聪明一点,可以(例如)让DOS存根执行Windows,并在上传递可执行文件的名称。该命令行,因此Windows将在启动时运行它。

因此,此代码只是在验证至少存在DOS存根可执行文件的标头的开头。 IMAGE_DOS_SIGNATURE毫无疑问只是“ MZ”,尽管它可能存储为16位的Little-endian整数,但是它很容易在一条指令中进行比较。 DOS .EXE文件必须以“ MZ”开头来表示它是什么(如果以其他内容开头,则DOS加载程序通常会假定它是.COM文件,但是DOS存根必须是.EXE,不是.COM)。

答案 1 :(得分:0)

这意味着该程序无法在DSO模式下运行。