2009年06月09日
Windows 2000 の Setupapi.dllのバグ[2009/6/11修正]
先日リリースされた、iTunes 8.2に同梱されている、Apple Mobile Device Support 1.43 をインストールすると、状態が開始中で固まってしまう症状が起こるようになりました。
タスクマネージャーを見ると、CPU使用率が25%前後で動きっぱなしです。
SetServiceStatus による不具合の場合はもっと低くなるはずなのでソースを解析してみました。
どうやら、エラーコード 0x7aが返ってきた時に、延々と同じ処理を繰り返しているようです。
0x7a はシステムコール時に指定した領域のバッファー不足。
検索してみたところ、 KB888609 SetupDiGetDeviceRegistryProperty 関数が Windows 2000 で DBCS 文字に誤った RequiredSize 値を返します というバグ情報を発見しました。
どうやら、最新のHotFixであるQ812503 でも直っていない模様。
そこで、次のようにコードを書き換えてみました。
要するに KB888609 に書かれている3の解決方法である バッファーサイズ不足が発生したときに、必要なバッファーサイズを2倍を返すように変更してみました。
Apple Mobile Device Support 1.43はSetServiceStatusの問題も持っていたので、advapi32.dllのパッチを当てたものをKDWで簡易インストールしたところ動作させることができました。
注:当時のセットアップは日本語のフォルダ(デスクトップ)などに解凍すると実行できないので、必ずANSI名のフォルダで実行してください。
注:適用して、Services.exeのCPU使用率が異様に高くなる場合は、不適なアプリがあるので適用しないで下さい。 2009/6/10 不具合が起こる部分を修正しました
こちらではRealTekのタスクトレイアプリ(RTHDCPL.EXE)で不具合を確認しています。
SetServiceStatus による不具合の場合はもっと低くなるはずなのでソースを解析してみました。
L0041425B: lea eax,[ebp-14h] push eax push [ebp-14h] push [ebp-18h] lea eax,[ebp-04h] push eax mov eax,[ebp-08h] push [ebp+eax*4-10h] push [ebp+10h] push [ebp+0Ch] call [SETUPAPI.dll!SetupDiGetDeviceRegistryPropertyA] test eax,eax jnz L004142F3 call [KERNEL32.dll!GetLastError] mov [ebp-1Ch],eax cmp dword ptr [ebp-1Ch],0000007Ah jnz L004142AE cmp dword ptr [ebp-18h],00000000h jz L0041429E push [ebp-18h] call [KERNEL32.dll!LocalFree] L0041429E: push [ebp-14h] push 00000040h call [KERNEL32.dll!LocalAlloc] mov [ebp-18h],eax jmp L004142EE L004142AE: cmp dword ptr [ebp-1Ch],0000000Dh jnz L004142C5 mov eax,[ebp-08h] inc eax mov [ebp-08h],eax cmp dword ptr [ebp-08h],00000008h jnc L004142C5 jmp L0041425B |
0x7a はシステムコール時に指定した領域のバッファー不足。
検索してみたところ、 KB888609 SetupDiGetDeviceRegistryProperty 関数が Windows 2000 で DBCS 文字に誤った RequiredSize 値を返します というバグ情報を発見しました。
どうやら、最新のHotFixであるQ812503 でも直っていない模様。
add ecx,E0000209h mov [ebp-1Ch],ecx jmp L78337341 L78337328: mov dword ptr [ebp-1Ch],0000007Ah jmp L78337341 L78337331: mov dword ptr [ebp-1Ch],E000020Bh jmp L78337341 L7833733A: mov dword ptr [ebp-1Ch],E0000209h L78337341: or dword ptr [ebp-04h],FFFFFFFFh jmp L7833735E |
add ecx,E0000209h jmp L7833733D L78337325: mov ecx,0000007Ah shl dword ptr [ebp+20h],1 jmp L7833733D L78337331: mov ecx,E000020Bh jmp L7833733D L78337338: mov ecx,E0000209h L7833733D: mov [ebp-1Ch],ecx nop L78337341: or dword ptr [ebp-04h],FFFFFFFFh jmp L7833735E |
Apple Mobile Device Support 1.43はSetServiceStatusの問題も持っていたので、advapi32.dllのパッチを当てたものをKDWで簡易インストールしたところ動作させることができました。
Download: Q888609_v4_W2K_SP5_6Lang.zip Language: Multilingual (English/한국어/中文(简体)/中文(繁體)/日本語/NEC98) Date: 2011/10/28 Description: customized SETUPAPI 5.0.2195.6908 and support stub SetupUninstallOEMInfA and SetupUninstallOEMInfW Author: Customized by BlackWingCat besed setupapi.dll 5.0.2195.6739 |
Download: Q888609_v3_W2K_SP5_6Lang.zip Language: Multilingual (English/한국어/中文(简体)/中文(繁體)/日本語/NEC98) Date: 2009/6/11 Description: SETUPAPI 5.0.2195.6908 Author: Customized by BlackWingCat besed setupapi.dll 5.0.2195.6739 |
注:当時のセットアップは日本語のフォルダ(デスクトップ)などに解凍すると実行できないので、必ずANSI名のフォルダで実行してください。
注:適用して、Services.exeのCPU使用率が異様に高くなる場合は、不適なアプリがあるので適用しないで下さい。 2009/6/10 不具合が起こる部分を修正しました
こちらではRealTekのタスクトレイアプリ(RTHDCPL.EXE)で不具合を確認しています。
Twitter Feedback
トラックバックURL
この記事へのコメント
1. Posted by pko 2009年10月08日 19:38
「この Q888609-v3は異なるハードウェア プラットフォーム用です。」と出るんですけどどうにかなりませんか?
2. Posted by blackwingcat 2009年10月08日 20:50
Nec pc9821版入れようとしてませんか?
3. Posted by pko 2009年10月08日 21:07
確認したらそうでした。ありがとうございました。迷惑かけてすみません。
4. Posted by XXX 2009年11月08日 09:32
セットアップエラーがでて、インストールできません。
どうすれば、できますか?
どうすれば、できますか?
5. Posted by blackwingcat 2009年11月08日 11:15
コメントにあるように、全角文字が含まれるフォルダ上で実行していませんか?
6. Posted by yushi 2012年05月26日 17:32
これってどうやって使うんですか?
7. Posted by blackwingcat 2012年05月27日 14:00
> これってどうやって使うんですか?
解凍して日本語版の update.exe を実行します。
解凍して日本語版の update.exe を実行します。
8. Posted by yushi 2012年05月27日 18:29
ありがとうございます。 できました。