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

Windows XP のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Windows XP のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

Windows Server 2003 のサポートは 2015 年 7 月 14 日で終了しています

Windows Server 2003 のサポートは 2015 年 7 月 14 日で終了しています。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響します。 この変更の意味および保護された状態を維持する方法について説明します。

現象
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 - 最終更新日: 09/29/2016 15:39:00 - リビジョン: 3.0

Microsoft Windows XP Home Edition, Microsoft Windows XP Professional, Microsoft Windows XP Professional x64 Edition, Microsoft Windows XP Service Pack 1, Microsoft Windows XP Service Pack 2, Microsoft Windows XP Service Pack 3, Windows Embedded Standard 2009, Microsoft Windows Server 2003 R2 Datacenter Edition (32-Bit x86), Microsoft Windows Server 2003 R2 Datacenter x64 Edition, Microsoft Windows Server 2003 R2 Datacenter x64 Edition with Service Pack 2, Microsoft Windows Server 2003 R2 Enterprise Edition (32-Bit x86), Microsoft Windows Server 2003 R2 Enterprise x64 Edition, Microsoft Windows Server 2003 R2 Standard Edition (32-bit x86), Microsoft Windows Server 2003 R2 Standard x64 Edition, Microsoft Windows Server 2003 Service Pack 1, Microsoft Windows Server 2003 Service Pack 2, Microsoft Windows Server 2003, Datacenter Edition (32-bit x86), Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems, Microsoft Windows Server 2003, Datacenter x64 Edition, Microsoft Windows Server 2003, Enterprise Edition (32-bit x86), Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems, Microsoft Windows Server 2003, Enterprise x64 Edition, Microsoft Windows Server 2003, Standard Edition (32-bit x86), Microsoft Windows Server 2003, Standard x64 Edition, Microsoft Windows Server 2003, Web Edition

  • kbbug kbfix KB2942036
フィードバック