C++ PIMAGE\U DOS\U标头上缺少MSDN文档?

C++ PIMAGE\U DOS\U标头上缺少MSDN文档?,c++,C++,我找不到任何关于\u IMAGE\u DOS\u HEADER/PIMAGE\u DOS\u HEADER/e\u magic/IMAGE\u DOS\u签名的文档 我正在尝试理解此代码的用法: pIDH=(PIMAGE_DOS_HEADER)buffer; if(pIDH->e_magic!=IMAGE_DOS_SIGNATURE) { printf("\nError: Invalid executable image.\n"); VirtualFree(buffer

我找不到任何关于
\u IMAGE\u DOS\u HEADER
/
PIMAGE\u DOS\u HEADER
/
e\u magic
/
IMAGE\u DOS\u签名的文档

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

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及其目的/意义?为什么要比较
图像\u DOS\u签名


我想这可能是为了确保
pIDH
是一个真正的DOS头,但我希望看到文档

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

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


因此,这段代码只是验证DOS存根可执行文件的头的开头是否存在。毫无疑问,
IMAGE\u DOS\u签名就是“MZ”,尽管它可能存储为一个16位的小端整数,以便在一条指令中进行比较。DOS.EXE文件必须以“MZ”开头,以表示它是什么(如果它以其他文件开头,DOS加载程序通常会假定它是.COM文件,但DOS存根必须是.EXE,而不是.COM)。

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

谢谢您提供的信息。你从哪里学来的?有什么文件我可以参考吗?我需要它来做更多的事情,比如
PIMAGE\u NT\u HEADERS
PIMAGE\u SECTION\u HEADER
不确定我是在哪里第一次学会的——可能是20世纪80年代左右的一些纸质杂志,但我甚至猜不出是哪一本(当时有很多)。MS至少在以下位置有一些文档:另请参见Huzzah!这是问题堆栈溢出的类型!投票不够!