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!这是问题堆栈溢出的类型!投票不够!