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が何の反応もなく瞬時に終了してしまう所からでした。
Profiling してみると、 chrome.dllのロード中に Error 998 (メモリ ロケーションへのアクセスが無効です。/ Invalid access to memory location.) が発生してる模様。
このエラーが発生した場合は、Debugger を使って、first-chance exception (初回の例外) を無効にしてやればいいわけです。
これが例外補足した直後。 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: |
そして、こちらが、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%の起動確率(^^;
ファイル壊れているみたいですが・・・
再アップしました。
25182982バイトが正しいサイズです。
パッチがダウンロードできません><
すみません。記事を再構築したときに、Livedoorの方でバグがあったようです。
修正しました。
ご報告までなのですが、これを適用したら起動時に何かのエラーダイアログがでました。
こんなやつ↓
NPSWF32_FlashUtil.exe – エントリポイントが見つかりません。
プロシージャエントリポイント GetSystemWow64DirectoryA がダイナミックリンクライブラリ KERNEL32.dll から見つかりませんでした。
適用したのが原因じゃないみたいですね|・ω・)
FlashPlayerのアップデータなので、該当フォルダにKDWのkernel32
を簡易インストールして見てください。
おそらく、今まで起動すらできていなかった部分が、バグ修正したせいで起動できるようになって、エラーダイアログが表示できるようになったようです。
いつも有難く利用させて頂いております。
.\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 一致
元のファイルとCRCが変わってるのは、CPUのコア数などが変わって、
マルチプロセッサ用のNTDLLに変わった可能性があります。
3~6は正常ですが、2がちゃんと切り替わってないみたいです。
もう一度インストールしてみて下さい。
有難うございます。再インストールで上手くいったようです。
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
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!!!
Why don’t you use google chrome installer for Windows 2000 ?
これらの改変されたモジュールの再配布はライセンス的に問題はないのでしょうか?
だから、あえて、メインサポートフェーズが終わってから配布してるのですよ・ω・
それまでは、バグ対応明言してますし、コンシューマ向けにOSのライセンス販売もされてますから。
XPの改変カーネルを配布しないのも、まだライセンス的に問題があるからと考えています。
DELPHI XE7のbds.exeが、ntdll.dll内のRtlTraceDatabaseEnumerateで
エラーを起こしてしまいます。
拡張カーネルはv17c,v18g,v20m,v22oなど試しましたがすべて同じでした。ntdll.dllの修正で対応できませんか。