Windows の NTDLL.DLLの RtlCaptureStackBackTrace の バグ

Google Chrome 2.0.180.0 をWin2000でテストをしていて気づいたのですが、Windows 2000の NTDLL.DLL 内のRtlCaptureStackBackTraceにはバグがあって、これが原因で 動作しないアプリケーションがかなりあることがわかりました。

どうも、NTDLL.DLL内で 0xc0000005 で例外が発生しているか、 LoadLibraryEx や、LoadLibrary で GetLastError の値が 998 ( 0x3e6 ) だったら、ほとんど、これが原因といっていい程のかなり広範囲に影響を与えていたバグのようです。

最新版の、NTDLL.DLLである 5.0.2195.7080 でも直っていません。


事の始まりは、Chrome.exeが何の反応もなく瞬時に終了してしまう所からでした。
ntdllbug
Profiling してみると、 chrome.dllのロード中に Error 998 (メモリ ロケーションへのアクセスが無効です。/ Invalid access to memory location.) が発生してる模様。

ntdllbug2
このエラーが発生した場合は、Debugger を使って、first-chance exception (初回の例外) を無効にしてやればいいわけです。

ntdllbug3
これが例外補足した直後。 ecxが 0なのに、ecxが示すアドレスのデータを取りに行っていますね。
これは、RtlCaptureStackBackTrace 内部の処理で、ecxが参照した [ebp+0x14]というのは、関数の 第4パラメータで、BackTraceHash というオプションパラメータです。
MSDNには NULLの場合はハッシュを使用しないとだけかかれています。

          add    esi,00000004h
          cmp    edx,[ebp+0Ch]
          jc     L7C99F227
 L7C99F23D:
          mov    eax,[ebp+14h]
          test    eax,eax
          jz     L7C99F246
          mov    [eax],ebx
 L7C99F246:
          push    00000040h
          pop    ecx
          lea    eax,[ebp-00000100h]
          pop    ebx
 L7C99F250:
          mov    dword ptr [eax],00000000h
          add    eax,00000004h
          dec    ecx
          jnz    L7C99F250
          mov    ax,dx
 L7C99F25F:
          pop    edi
          pop    esi
          leave
          retn    0010h

まず、こちらがXP。ちゃんとNULLの場合はスキップしています。

          add    edx,00000004h
          add    [ebp+08h],ecx
          mov    [esi],ecx
          inc    eax
          add    esi,00000004h
          cmp    eax,[ebp+0Ch]
          jc     L77FA2EEB
 L77FA2F06:
          mov    ecx,[ebp+14h]
          mov    edx,[ebp+08h]
          mov    [ecx],edx
 L77FA2F0E:
          pop    edi
          pop    esi
          leave
          retn    0010h

 SSZ77FA2F14_Unexcepted_exception_in_RtlWalkFrameChai:
          db    'Unexcepted exception in RtlWalkFrameChain ...',0Ah,0
 RtlWalkFrameChain:
          push    ebp

そして、こちらが、Windows 2000。

というわけで、パッチを当ててみました。

          add    edx,00000004h
          add    [ebp+08h],ecx
          mov    [esi],ecx
          inc    eax
          add    esi,00000004h
          cmp    eax,[ebp+0Ch]
          jc     L77FA2EEB
 L77FA2F06:
          mov    ecx,[ebp+14h]
          mov    edx,[ebp+08h]
          test    ecx,ecx
 L77FA2F0E:
          jz     L77FA2F12
          mov    [ecx],edx
 L77FA2F12:
          pop    edi
          pop    esi
          leave
          retn    0010h
;------------------------------------------------------------------------------
          Align    4
 SSZ77FA2F1C_An_exception_in_RtlWalkFrameChai:
          db    'An exception in RtlWalkFrameChain ...',0Ah,0
 RtlWalkFrameChain:
          push    ebp

というわけで、全言語パッチを当てたものを配布してみる実験

Download: Win2000-KB915985-v2-ALL.zip
Language: Multilingual (Spanish/Finnish/français/Norwegian/Greek/English/한국어/Dutch/Hebrew/Hungarian/Italian/Czech/Danish/German/Arabic/Brazilian/中文(简体)/Swedish/Turkish/中文(繁體)/Polish/Português/Русский/日本語/NEC98)
Description: NTDLL 5.0.2195.7081
Author: Customized by BlackWingCat besed ntdll.dll 5.0.2195.7080

ちなみに、Chrome 2.0.180.0 は起動はしたけど、相変わらず、10%の起動確率(^^;

関連記事:
Chrome v3 Beta を Windows 2000で!

おすすめ

14件のフィードバック

  1. 通りすがり より:

    ファイル壊れているみたいですが・・・

  2. blackwingcat より:

    再アップしました。
    25182982バイトが正しいサイズです。

  3. 7743 より:

    パッチがダウンロードできません><

  4. blackwingcat より:

    すみません。記事を再構築したときに、Livedoorの方でバグがあったようです。
    修正しました。

  5. 別の通りすがり より:

    ご報告までなのですが、これを適用したら起動時に何かのエラーダイアログがでました。
    こんなやつ↓
    NPSWF32_FlashUtil.exe – エントリポイントが見つかりません。
    プロシージャエントリポイント GetSystemWow64DirectoryA がダイナミックリンクライブラリ KERNEL32.dll から見つかりませんでした。

  6. blackwingcat より:

    適用したのが原因じゃないみたいですね|・ω・)
    FlashPlayerのアップデータなので、該当フォルダにKDWのkernel32
    を簡易インストールして見てください。
    おそらく、今まで起動すらできていなかった部分が、バグ修正したせいで起動できるようになって、エラーダイアログが表示できるようになったようです。

  7. L.Palmer より:

    いつも有難く利用させて頂いております。
    .\JPN\update\update.exe を実行、OS 再起動したところ
    C:\WINNT\system32\ntdll.dll が 5.0.2195.7006 のままなのですが、
    この結果は正常なのでしょうか? 以下、詳細です。
    .\JPN\update\update.exe 実行前:
    (1) C:\WINNT\system32\NTDLL.DLL
    サイズ: 483,600
    更新日: 2005/08/16 02:17:36
    VER: 5.0.2195.7006
    MD5: E8A30667F719D81B3613D17E88121884
    OS 再起動後:
    (2) C:\WINNT\system32\ntdll.dll
    サイズ: 483,600
    更新日: 2005/06/02 23:46:44
    VER: 5.0.2195.7006
    MD5: 647A0B1284535A03A4776A3FF2133787
    (3) C:\WINNT\$NtUninstallKB915985-v2$\ntdll.dll
    ↑ (1) と MD5 一致
    (4) C:\WINNT\$NtUninstallKB915985-v2$\ntdll.dll.000
    ↑ (2) と MD5 一致
    (5) C:\WINNT\Driver Cache\i386\ntdll.dll
    サイズ: 484,112
    更新日: 2009/05/14 18:50:12
    VER: 5.0.2195.7081
    MD5: CC41188822FF4177B0841ED50B862124
    (6) C:\WINNT\system32\dllcache\ntdll.dll
    ↑ (5) と MD5 一致

  8. blackwingcat より:

    元のファイルとCRCが変わってるのは、CPUのコア数などが変わって、
    マルチプロセッサ用のNTDLLに変わった可能性があります。
    3~6は正常ですが、2がちゃんと切り替わってないみたいです。
    もう一度インストールしてみて下さい。

  9. L.Palmer より:

    有難うございます。再インストールで上手くいったようです。
    bbLean という代替シェル使用中のまま更新を行なったことが
    初回インストール失敗の原因だったように思います。
    Microsoft Update の利用時など、
    シェルが Explorer でないと更新に失敗するケースを過去に経験していました。
    BEFORE:
    C:\WINNT\system32\ntdll.dll
    サイズ: 483,600
    更新日: 2005/06/02 23:46:44
    VER: 5.0.2195.7006
    MD5: 647A0B1284535A03A4776A3FF2133787
    AFTER:
    C:\WINNT\system32\ntdll.dll
    サイズ: 484,112
    更新日: 2009/05/14 18:50:16
    VER: 5.0.2195.7081
    MD5: D11A27F9BE67E7CC59A453F97FD6974C

  10. kua より:

    please I have the same problem with trying to run Google Chrome at windows2000, the Kernell32.dll is misstin this RtlCaptureTackBackTrace.. can some one help me in english? 🙂 thankyou!!!

  11. blackwingcat より:

    Why don’t you use google chrome installer for Windows 2000 ?

  12. Joe より:

    これらの改変されたモジュールの再配布はライセンス的に問題はないのでしょうか?

  13. 黒翼猫 より:

    だから、あえて、メインサポートフェーズが終わってから配布してるのですよ・ω・
    それまでは、バグ対応明言してますし、コンシューマ向けにOSのライセンス販売もされてますから。
    XPの改変カーネルを配布しないのも、まだライセンス的に問題があるからと考えています。

  14. 名無しさん より:

    DELPHI XE7のbds.exeが、ntdll.dll内のRtlTraceDatabaseEnumerateで
    エラーを起こしてしまいます。
    拡張カーネルはv17c,v18g,v20m,v22oなど試しましたがすべて同じでした。ntdll.dllの修正で対応できませんか。

コメントを残す

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