LoadImage 関数で指定したビットマップ ファイルの代わりに OEM イメージが読み込まれる

現象

LoadImage 関数の第一引数に NULL、第二引数にファイル名を保持するバッファ、第三引数に IMAGE_BITMAP、さらに第六引数に LR_LOADFROMFILE を指定して呼び出したとき、本関数は第二引数に指定したファイル名のビットマップ ファイルをイメージ リソースとしてロードして、取得します。

しかしながら、これらの引数を指定しているにもかかわらず、第二引数に指定したファイル名のビットマップ ファイルとは異なるイメージ リソースがロードされ、取得されることがあります。

原因

LoadImage 関数の不具合が原因です。

Windows Vista より前の OS では、LoadImage 関数の第一引数に NULL を指定すると、第六引数に LR_LOADFROMFILE を指定しているかどうかに関わらず、第二引数に指定した値が OEM イメージの識別子 (WinUser.h で定義される OBM_、OIC_、OCR_ のプレフィックスで始まる固定値) であるかを確認する処理が LoadImage 関数内部で行われます。

このため、実際の第二引数にファイル名を保持するバッファへのポインタ アドレスを指定していたとしても、そのバッファ アドレスの最下位 2 バイトが OEM イメージの識別子のいずれかと偶然に一致した場合には、指定したファイル名のファイルではなく、識別子が一致した OEM イメージがロードされ、取得されるという問題が発生します。

回避策

LoadImage 関数の第一引数に NULL、第三引数に IMAGE_BITMAP、第六引数に LR_LOADFROMFILE を指定して呼び出すときには、ファイル名を保持するバッファ アドレスの最下位 2 バイトが、OEM イメージの固定値領域 (0x7F00 - 0x7FFF) に含まれないように、第二引数を指定することで回避が可能です。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

この問題は、Windows Vista ならびに Windows Server 2008 で修正済みです。


プロパティ

文書番号:2942036 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック