EXE
フォーマットとは
MS-DOSおよび
MS-DOSの後継
OSである
Windowsおよび
OS/2の実
行ファイルフォーマットである。
MS-DOSで実
行可能な
バイナリの
フォーマットには他に、
COMフォーマットと言う
ファイルフォーマットが存在する。
COMフォーマットは、コード、データ、
スタックの全ての
セグメントが同一であるモデルで、開始番地も固定の0x100であるメモリイメージそのものであり、シンボル再配置も無いのに対し、EXE
フォーマットは連続した一つのメモリイメージで、コード、データ、
スタックの全てが別々の複数の
セグメントを用いて
アクセスする必要のある場合に対応し、開始アドレスおよびその時の
セグメントレジスタの値を
ファイル先頭から相対指定することが可能で
セグメント指定の再配置エントリが存在する。
C言語による表記は以下の通りである。尚、この定義はWineで使われている
ヘッダファイルの定義から引用した。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_res4; /* 1c: Reserved words */ WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */ WORD e_oeminfo; /* 26: OEM information; e_oemid specific */ WORD e_res210; /* 28: Reserved words */ DWORD e_lfanew; /* 3c: Offset to extended header */ } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;COMフォーマットと区別するために、
MS-DOSにおいては
ファイル名には.EXEという
拡張子が付けられ、
ファイルの先頭には0x5A4D(
ASCIIコードで'MZ'という文字
列)のマジックナンバーが入っている。
また、拡張
ヘッダという概念が後に付け加えられ、そこから指定された
ヘッダに、
Windowsや
OS/2の実
行ファイルの情報を指定し、これらの
OS用に作られたプログラムが本来の
アーキテクチャで
OSで実
行された場合は、その拡張
ヘッダを解釈し、
MS-DOS上で実
行された場合、実
行できない事を表示し終了させる等のプログラムを置くことが可能である。このような
フォーマットにはPortable Executable (PE)やNew Executable (NE),Linear Executable(LE,LX)等が存在する。また、
Microsoft Windows 3.xの
386エンハンスドモードの
カーネルであるWIN
386.EXEや、
Microsoft Windows 95等の
カーネルであるVMM
386.VXDでは特殊な拡張
ヘッダで内部に存在するプロテクトモードの
カーネルコードや
仮想デバイスドライバ等への
オフセットを保持しており、リアルモードでの初期化を普通のDOSプログラムとして
行った上で、その
ヘッダにあるプロテクトモードのコードを実
行していた。(WIN
386.EXEではW3,VMM
386.VXDではW4という識別子。)