VC++2013/2015 問題対応

例の PPL に関する VC++ を Windows 2000または Windows 2000互換モードで起動した場合に
アプリケーションがクラッシュする問題ですが、とんでもないことが判明しました。

ターゲットは、 PPL を利用可能になった、 VC++2010 からなので、 VC++2012 問題に含まれることがわかりました。
一般的にPPLが使われるようになったのが 最近になってからなので問題が出てきたのだと思います。

そこで、まず、Runtime の修正版の配布を行います
Win2000-PFW000001-x86-INTL.EXE

次に、パッチを当てる必要があるファイルの見分け方です。

まず、実行ファイルや DLLや AX や OCX ファイルを 『SetThreadGroupAffinity』 をキーワードに検索して下さい。
合致すれば、問題がある可能性があります

次に、デバッグ版と リリース版のライブラリでパッチの適用の方法が変わります
デバッグ版実行ファイルの場合は
"FFFF00742C83" で検索して "FFFF00742083" に書き換えればOKです。
これは、 VC++2010 プロジェクトから VC++2015プロジェクトまで全部共通です

リリース版の場合は
VC++2010
"8B 44 24 58 2B C7 0F 84 2B 03 00 00 48 74"
"8B 44 24 58 2B C7 0F 84 4E 00 00 00 48 74"

VC++2012
"8B 85 E8 FE FF FF 83 E8 00 74 36 48 74"
"8B 85 E8 FE FF FF 83 E8 00 74 1F 48 74"

VC++2013
"8B 85 E8 FE FF FF 83 E8 00 74 2C 48 74"
"8B 85 E8 FE FF FF 83 E8 00 74 1F 48 74"

VC++2015
"8B E5 5D C3 8B 85 E8 FE FF FF 83 E8 00 74 3E 83 E8 01 74"
"8B E5 5D C3 8B 85 E8 FE FF FF 83 E8 00 74 1D 83 E8 01 74"

となり、少し処理が異なります

プログラムを作る側は
lib\libcmt.lib 或いは lib\libcmtd.lib に対してパッチを適用する必要があります
VC++2015の場合は libconcrt.lib libconcrtd.lib libconcrt0.lib libconcrtd0.lib libconcrt1.lib libconcrtd1.libになります。

というわけで、 VC++2010にあることが判明したので、魔改造版 Windows 2000に対するピンポイントな嫌がらせではなく、Win2000アプリが作れないはずの VC++2010のライブラリに Win2000判定入れたエンジニアが間抜けだったというおちでした・ω・

おすすめ

2件のフィードバック

  1. tasukus より:

    VC2010のランタイムは、どのVersionですか?
    古いランタイムを使っていませんか?
    一般に使われている VC2010のランタイムは、かなり古いです。
    一般的には、KB2565063 (2011/08/09版)が使用されていますが、
    私が知る限りの最新は、KB2890375(2014/01/23版)です。
    ちなみに、VC2010ランタイムの一覧を、下に示します。
    KB2524860
    KB2544655
    KB2549743
    KB2565063 (2011/08/09版)
    KB2606060
    KB2608539
    KB2622699
    KB2627265
    KB2639283
    KB2689322
    KB2723430
    KB2821701
    KB2890375 (現行、最新版 2014/01/23版)

  2. 黒翼猫 より:

    バージョン確認されました?
    同梱の奴は10.0.40219.455なのでどう見てもKB2890375だと思うのですが
    なぜ古いと判断されました?
    2014年ではなく、2013年10月8日がリンク日です

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です