Windows Metafile

Windows Metafile（WMF、ウィンドウズ メタファイル）はMicrosoft Windows上の画像ファイルフォーマットの1つであり、1990年代初期に設計された。ベクトル画像フォーマットであり、ビットマップ画像を内部に含むことも可能となっている。基本的にWMFファイルはWindowsのグラフィックスAPI層であるGDIが実行すべき関数呼び出しのリストであって、それによって画像が再生される。GDI関数の中には例外処理のためにコールバック関数のポインタを引数にとるものがあるため、WMFファイルには実行可能コードが含まれることがある。その設計手法はUNIXにおけるPostScriptに似ている。
Windows 3.0で最初に導入されたWMFは16ビット形式であった。後に追加された32ビット版ではコマンドが追加されており、Enhanced Metafile (EMF) と呼ばれる。EMFはプリンタードライバーのグラフィックス言語としても使われている。
2018年現在、WMFのリビジョン15.0の仕様書及びEMFのリビジョン14.0の仕様書がオンラインで参照およびダウンロードできる。
仕様と特許.
オリジナルの16bit WMFファイル形式は1992年のWindows 3.1 SDKの4巻に定義された。しかし仕様の一部は詳細があいまいな部分があった。これらのマニュアルは書籍として買い求めることができる。EULAや特別なライセンスの制限などは課されていない。（ソフトウエアの一部であり...という一般的な文言のみがあった）
時が経つにつれてこの歴史的な仕様書の存在は忘れられ、WMFファイルに対するリバースエンジニアリングが行われるようになったが、これには困難が伴い、正確さも欠いていた。
2006年9月にMicrosoftは再度WMFファイル形式の仕様をMicrosoft Open Specification Promiseの一環として公開し、これを実装する者に対して特許権を行使しないことを約束した。
派生物.
1993年に32bit版のWin32/GDIによる"Enhanced Metafile" (EMF) が登場し、これには数点のコマンドの拡張が含まれた。EMFはプリンタドライバーとやりとりするグラフィックス言語としても利用された。Microsoftは、WMFはほぼ使用されず、拡張フォーマット (EMF) で代替することを推奨している。
Windows XPの公開に合わせて"Enhanced Metafile Format Plus Extensions" (EMF+) フォーマットが登場した。これにはGDI+ APIコールのシリアライズ機能が WMF/EMF と同様の方法で追加されている。
他に圧縮された形式の"Compressed Windows Metafile" (WMZ) と"Compressed Enhanced Windows Metafile" (EMZ) も存在する。
EMZはEMFファイル形式をgzip圧縮したものである。
SetAbortProcの脆弱性問題.
2005年11月、"SetAbortProc" GDI関数に脆弱性が発見された。この関数は印刷のスプーリングをキャンセルしたときのエラー処理ハンドラを登録するもので、ユーザーの許可なしで実行できる任意のコードをWMFファイルに追加可能にしている。
マイクロソフトは公式のパッチ (MS06-001) を2006年1月5日にリリースし、詳細は "マイクロソフト セキュリティ アドバイザリ 912840 Graphics Rendering Engine の脆弱性によりコードが実行される可能性がある" (912919)で見ることができる。
古いバージョンのWindowsについてはパッチを提供していない。
セキュリティ専門家のは、この脆弱性がマイクロソフトが故意にWMFに仕込んだバックドアであると主張した。しかし、他のセキュリティ専門家はこれに異を唱えており、バックドアと呼ぶにはマイクロソフトが実際にこの脆弱性を利用して秘密裏にコンピュータにアクセスしたことを実証しなければならないとしている。マイクロソフトの従業員であるMark Russinovichは、Gibsonの分析はいくつかの誤解に基づいていると説明している。
代替実装.
WMFフォーマットはWindowsのGDIで実行されることで画像を再生する。しかし、WMF形式のファイルにはその画像を構成するGDIのグラフィックプリミティブの定義も含まれているので、他のライブラリを使ってWMFのバイナリファイルを描画させたり、他の画像フォーマットに変換できる。
一例として、BatikライブラリはWMFファイルを描画したり、SVGに変換したりできる。FreeHEP JavaライブラリのVector Graphicsパッケージでは、Java 2Dで描画されたものをEMFファイルとして保存できる。InkscapeとXnViewもWMFとEMF形式でのエクスポートができる。