EXEフォーマット

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

EXEフォーマット(エグゼフォーマット)とはMS-DOSおよびMS-DOSの後継OSであるWindowsおよびOS/2実行ファイルフォーマットである。

MS-DOSで実行可能なバイナリのフォーマットには他に、COMフォーマットと言うファイルフォーマットが存在する。COMフォーマットは、コードデータスタックの全てのセグメントが同一であるモデルで、開始番地も固定の0x100であるメモリイメージそのものであり、シンボル再配置も無い。COMフォーマットは、ファイルヘッダを持たず拡張性がなかった。 これに対し、EXEフォーマットは連続した一つのメモリイメージで、コード、データ、スタックの全てが別々の複数のセグメントを用いてアクセスする必要のある場合に対応し、開始アドレスおよびその時のセグメントレジスタの値をファイル先頭から相対指定することが可能でセグメント指定の再配置エントリが存在する。

COMフォーマットと区別するために、MS-DOSにおいてはファイル名には.EXEという拡張子が付けられ、ファイルの先頭には0x5A4D(ASCIIコードで'MZ'という文字列)[1]マジックナンバーが入っている。これは、MS-DOS 2.0の開発責任者の一人、Mark Zbikowskiのイニシャルに由来する。

C言語による表記は以下の通りである。尚、この定義はWineで使われているヘッダファイル(winnt.h)の定義から引用した。WORDは16ビット整数であり、DWORDは32ビット整数である。

typedef struct _IMAGE_DOS_HEADER {
   WORD  e_magic;      /* 00: MZ Header signature */
   WORD  e_cblp;       /* 02: Bytes on last page of file */
   WORD  e_cp;         /* 04: Pages in file */
   WORD  e_crlc;       /* 06: Relocations */
   WORD  e_cparhdr;    /* 08: Size of header in paragraphs */
   WORD  e_minalloc;   /* 0a: Minimum extra paragraphs needed */
   WORD  e_maxalloc;   /* 0c: Maximum extra paragraphs needed */
   WORD  e_ss;         /* 0e: Initial (relative) SS value */
   WORD  e_sp;         /* 10: Initial SP value */
   WORD  e_csum;       /* 12: Checksum */
   WORD  e_ip;         /* 14: Initial IP value */
   WORD  e_cs;         /* 16: Initial (relative) CS value */
   WORD  e_lfarlc;     /* 18: File address of relocation table */
   WORD  e_ovno;       /* 1a: Overlay number */
   WORD  e_res[4];     /* 1c: Reserved words */
   WORD  e_oemid;      /* 24: OEM identifier (for e_oeminfo) */
   WORD  e_oeminfo;    /* 26: OEM information; e_oemid specific */
   WORD  e_res2[10];   /* 28: Reserved words */
   DWORD e_lfanew;     /* 3c: Offset to extended header */
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

また、拡張ヘッダという概念が後に付け加えられ、そこから指定されたヘッダに、WindowsOS/2の実行ファイルの情報を指定し、これらのOS用に作られたプログラムが本来のアーキテクチャでOSで実行された場合は、その拡張ヘッダを解釈し、MS-DOS上で実行された場合、実行できない事を表示し終了させる等のプログラムを置くことが可能である。このようなフォーマットにはPortable Executable (PE)やNew Executable (NE),Linear Executable(LE,LX)等が存在する。また、Microsoft Windows 3.xの386エンハンスドモードのカーネルであるWIN386.EXEや、Microsoft Windows 95等のカーネルであるVMM386.VXDでは特殊な拡張ヘッダで内部に存在するプロテクトモードのカーネルコードや仮想デバイスドライバ等へのオフセットを保持しており、リアルモードでの初期化を普通のDOSプログラムとして行った上で、そのヘッダにあるプロテクトモードのコードを実行していた。(WIN386.EXEではW3,VMM386.VXDではW4という識別子。)

関連項目[編集]

脚注[編集]

  1. ^ WORD型として読み込む時のリトルエンディアンの場合。バイト並びは低位から0x4D,0x5Aである。