WEB开发网
开发学院软件开发VC PE文件格式详解(上) 阅读

PE文件格式详解(上)

 2006-07-20 11:43:30 来源:WEB开发网   
核心提示: 以上的宏返回了文件标志的偏移量,而不管它是哪种类型的可执行文件,PE文件格式详解(上)(5),所以,文件头部是在DWORD标志之后,就能得到原因了:除了操作系统版本规范的不同之外,Windows的可执行文件和OS/2的可执行文件实在没有什么区别,还是在WORD标志处,是由这个标志是否Win

以上的宏返回了文件标志的偏移量,而不管它是哪种类型的可执行文件。所以,文件头部是在DWORD标志之后,还是在WORD标志处,是由这个标志是否Windows NT文件标志所决定的。要解决这个问题,我编写了ImageFileType函数(如下),它返回了映像文件的类型:

//PEFILE.C
DWORD WINAPI ImageFileType (LPVOID lpFile)
{
 /* 首先出现的是DOS文件标志 */
 if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE)
 {
  /* 由DOS头部决定PE文件头部的位置 */
  if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
    IMAGE_OS2_SIGNATURE ||
    LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
    IMAGE_OS2_SIGNATURE_LE)
   return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile));
  else if (*(DWORD *)NTSIGNATURE (lpFile) ==
   IMAGE_NT_SIGNATURE)
  return IMAGE_NT_SIGNATURE;
  else
   return IMAGE_DOS_SIGNATURE;
 }
 else
  /* 不明文件种类 */
  return 0;
}
以上列出的代码立即告诉了你NTSIGNATURE宏有多么有用。对于比较不同文件类型并且返回一个适当的文件种类来说,这个宏就会使这两件事变得非常简单。WINNT.H之中定义的四种不同文件类型有: //WINNT.H
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
#define IMAGE_OS2_SIGNATURE 0x454E // NE
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
  
首先,Windows的可执行文件类型没有出现在这一列表中,这一点看起来很奇怪。但是,在稍微研究一下之后,就能得到原因了:除了操作系统版本规范的不同之外,Windows的可执行文件和OS/2的可执行文件实在没有什么区别。这两个操作系统拥有相同的可执行文件结构。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:PE 文件 格式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接