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圧縮したものである。 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形式でのエクスポートができる。 [脚注の使い方] ^ a b “MSDN Metafile Format”. 2018年10月21日閲覧。 ^ a b “MSDN Enhanced Metafile Format”. 2016年11月24日閲覧。 ^ Microsoft Windows 3.1 Programmers Reference, Volume 4 Resources, Microsoft Press 1992, ISBN 1-55615-494-1, chapter 3 pp. 21-45 ^ “MS-WMF: Windows Metafile Format Specification”. 2008年6月1日閲覧。 ^ Officeサポート 挿入および保存できるグラフィックス ファイルの種類 ^ “fileformat.com”. 2022年7月22日閲覧。 ^ https://technet.microsoft.com/ja-jp/library/security/912840.aspx マイクロソフト セキュリティ アドバイザリ 912840 Graphics Rendering Engine の脆弱性によりコードが実行される可能性がある ^ 'Windows backdoor' theory causes kerfuffle CNET News - News Blogs Scalable Vector Graphics (SVG) PostScript メタファイル マイクロソフトによる仕様 [MS-WMF]: Windows Metafile Format [MS-EMF]: Enhanced Metafile Format Windows GDI-Metafiles Windows GDI File Format Summary at fileformat.info WMF operand documentation FAQ about Windows Metafile Batik Java library: WMF to SVG transcoder package WMFメタファイルからSVGへの変換が可能 FreeHEP Java library: Vector graphics package EMFメタファイルからSVGへの変換およびJava2DからEMFへの変換をサポート libWMF WMFメタファイルを読み込むライブラリ。表示やSVGへの変換が可能 libEMF POSIXシステム上でのベクター画像ファイルを生成するための描画ツールキットを提供するC/C++ライブラリ wmf2svg WMFメタファイルからSVGへの変換を実装したJava用クラス