在_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,但是我很想查看文档
答案 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模式下运行。