DOS头,PE文件的开始
DOS由DOS MZ头和 DOS Stub(即指令字节码)组成。
注:由于DOS Stub大小不固定,所以DOS头大小也不固定
DOS头是用来兼容MS-DOS操作系统的,目的是当这个文件在MS-DOS上运行时提示一段文字,大部分情况下是:This program cannot be run in DOS mode.还有一个目的,就是指明NT头在文件中的位置。NT头包含windows PE文件的主要信息,其中包括一个‘PE’字样的签名,PE文件头(IMAGE_FILE_HEADER)和PE可选头(IMAGE_OPTIONAL_HEADER32),头部的详细结构以及其具体意义在PE文件头文章中详细描述。
#include<Windows.h>
#include<stdio.h>
int main()
{
HMODULE hModule = GetModuleHandleA(0);
DWORD dwhModule = (DWORD)hModule;
PIMAGE_DOS_HEADER pDosHeaders = (PIMAGE_DOS_HEADER)dwhModule;
printf("e_magic = %#x\t", pDosHeaders->e_magic);
printf("%c%c\n", pDosHeaders->e_magic, pDosHeaders->e_magic >> 8);
printf("e_cb1p = %#x\n", pDosHeaders->e_cblp);
printf("e_cp = %#x\n", pDosHeaders->e_cp);
printf("e_crlc = %#x\n", pDosHeaders->e_crlc);
printf("e_cparhdr = %#x\n", pDosHeaders->e_cparhdr);
printf("e_minalloc = %#x\n", pDosHeaders->e_minalloc);
printf("e_maxalloc = %#x\n", pDosHeaders->e_maxalloc);
printf("e_ss = %#x\n", pDosHeaders->e_ss);
printf("e_sp = %#x\n", pDosHeaders->e_sp);
printf("e_csum = %#x\n", pDosHeaders->e_csum);
printf("e_ip = %#x\n", pDosHeaders->e_ip);
printf("e_cs = %#x\n", pDosHeaders->e_cs);
printf("e_lfarlc = %#x\n", pDosHeaders->e_lfarlc);
printf("e_ovno = %#x\n", pDosHeaders->e_ovno);
printf("e_res = %#x\n", pDosHeaders->e_res);
printf("e_oemid = %#x\n", pDosHeaders->e_oemid);
printf("e_oeminfo = %#x\n", pDosHeaders->e_oeminfo);
printf("e_res2 = %#x\n", pDosHeaders->e_res2);
printf("e_lfanew = %#x\n", pDosHeaders->e_lfanew);
return 0;
}