| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| A | B | C | D | E |
| F | G | H | I | J |
| K | L | M | N | O |
| P | Q | R | S | T |
| U | V | W | X | Y |
| Z | 数字 | 記号 | ||
MS-DOSやMicrosoft Windowsなどの実行ファイルなどのフォーマット。16ビット、32ビット、64ビットのいずれの値も利用可能。
詳細は後述するが、EXEフォーマットは拡張が自在であり、様々な種類が存在する。
使用されるオペレーティングシステムには、次のようなものがある。
OSが異なれば同じ実行ファイルは使えない。
またひとえにWindows用と言っても、Win16と、Win32/Win64/Windows CEで形式が抜本的に異なっている。
現在、EXEフォーマットで最も多いのはWindows用のEXEファイルであるので、それを例とする。
そのうち「PE」と呼ばれる、Win32用のファイルは、三つの部分から構成されている。
元々MS-DOS用だったものを、拡張してWindowsで使っている。その拡張の一つがPE(Portable Executable)という形式で、UNIXで開発されたCOFFをベースとして作られた。
以下に、Wineのソースwinnt.hより、IMAGE_DOS_HEADER構造体を引用する。WORDは16ビット、DWORDは32ビットである。なお、Visual C++にもほぼ同じ内容の純正版が同じファイル名で存在する。
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;
EXEファイルはCOMファイルとの区別のため、ファイルの先頭2バイトがマジックナンバーとなっており、0x5a4d(ASCIIで'MZ')または0x4d5a(同様に'ZM')のいずれかをe_magicとする。これは、MS-DOS 2.0の開発責任者の一人、Mark Zbikowskiのイニシャルに由来する。
Windowsでは、この構造体の情報は殆ど意味を持たない。なぜなら、e_lfanew以外のメンバーは全て16ビットであり、32ビットや64ビットのアドレス情報などを記述することが出来ないからである。
Windowsで使うのはe_magicとe_lfanewだけで、e_lfanewには後述するPEヘッダーの先頭アドレスを入れる。
EXEファイルが誤ってMS-DOS上で実行された時のためのプログラムが、MS-DOS用スタブプログラムである。
一般的には「This program cannot be run in DOS mode.」といった文字列を表示して終わる、簡単なプログラムである。
理論上は、ここにMS-DOSで機能するプログラムを入れれば、一つのファイルでMS-DOS・Windows共用の実行ファイルが出来る(はず)。
PE(Portable Executable)ヘッダーは、IMAGE_NT_HEADERS32構造体で定義されている。
以下に、WINEのソースwinnt.hより、IMAGE_NT_HEADERS32構造体を引用する。
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; /* "PE"\0\0 */ /* 0x00 */
IMAGE_FILE_HEADER FileHeader; /* 0x04 */
IMAGE_OPTIONAL_HEADER32 OptionalHeader; /* 0x18 */
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
Signatureは、PEヘッダーを表わすマジックナンバー「0x00004550」がリトルエンディアンで格納されている。
IMAGE_FILE_HEADER構造体がPEヘッダーのヘッダー情報になる。
続いてIMAGE_OPTIONAL_HEADER32構造体があり、この中に更にIMAGE_DATA_DIRECTORY構造体が16個定義されている。
以下に、WINEのソースwinnt.hより、IMAGE_FILE_HEADER構造体を引用する。
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Machineは、CPUの種類など、想定する環境を指定する番号である。
番号はCOFFと共通で、Microsoftの公式文書PE Format
によると、次のような番号が定義されている。
つまり、一般的なWindowsアプリケーションであれば、次のどれかということになる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます