iTunes の診断を Windows 2000で実行できるようにするテスト
iTunes の診断テスト 7.4 から Windows 2000ではクラッシュするようになってしまいました
その原因を調べてみました
クラッシュ原因の itunes.dll のコード
103F510A L103F510A: 103F510A 8B86B4060000 mov eax,[esi+000006B4h] 103F5110 85C0 test eax,eax 103F5112 7412 jz L103F5126 103F5114 8B08 mov ecx,[eax] 103F5116 8B5108 mov edx,[ecx+08h] 103F5119 50 push eax 103F511A FFD2 call edx 103F511C C786B40600000 mov dword ptr [esi+6B4h],0 103F5126 L103F5126: 103F5126 8B86B0060000 mov eax,[esi+000006B0h] 103F512C 85C0 test eax,eax 103F512E 7412 jz L103F5142 103F5130 8B08 mov ecx,[eax] 103F5132 8B5108 mov edx,[ecx+08h] 103F5135 50 push eax 103F5136 FFD2 call edx |
103F523E 8B3F mov edi,[edi] 103F5240 8B07 mov eax,[edi] 103F5242 8B4808 mov ecx,[eax+08h] 103F5245 57 push edi 103F5246 FFD1 call ecx 103F5248 5E pop esi 103F5249 5F pop edi 103F524A B801000000 mov eax,1 103F524F 5D pop ebp 103F5250 59 pop ecx 103F5251 C3 retn |
どれも、 IUnknown_Release_Proxy をコールするんですが、コンポーネントがなくエラーが返ってきたときの想定をしてないため、変数の初期化、およびエラーの処理がないのが原因でクラッシュしています.
というわけで、変更後のコード
103F510A L103F510A: 103F510A 8B86B4060000 mov eax,[esi+000006B4h] 103F5110 85C0 test eax,eax 103F5112 7412 jz L103F5126 103F5114 8B08 mov ecx,[eax] 103F5116 8B5108 mov edx,[ecx+08h] test ecx,FFF00000h jz L103F5126 mov edx,[ecx+08h] test edx,edx jz L103F5126 103F5119 50 push eax 103F511A FFD2 call edx 103F511C C786B40600000 mov dword ptr [esi+6B4h],0 103F5126 L103F5126: 103F5126 8B86B0060000 mov eax,[esi+000006B0h] 103F512C 85C0 test eax,eax 103F512E 7412 jz L103F5142 103F5130 8B08 mov ecx,[eax] 103F5132 8B5108 mov edx,[ecx+08h] test ecx,FFF00000h jz L103F5142 mov edx,[ecx+08h] test edx,edx jz L103F5142 103F5135 50 push eax 103F5136 FFD2 call edx |
103F523E 8B3F mov edi,[edi] 103F5240 8B07 mov eax,[edi] 103F5242 8B4808 mov ecx,[eax+08h] test ecx,FFF00000h jz L103F5248 push edi call ecx 103F5245 57 push edi 103F5246 FFD1 call ecx 103F5248 5E pop esi 103F5249 5F pop edi 103F524A B801000000 mov eax,1 103F524F 5D pop ebp 103F5250 59 pop ecx 103F5251 C3 retn |
で起動してみた結果
ちゃんと動きました.
ただ、同期は失敗
Microsoft Windows 2000 Professional Service Pack 4 (Build 2195)
iTunes 10.6.0.40 iTunes シリアルnbsp; を実行中 **** Device Sync Tests **** 1 つまたは複数の同期テストに失敗しました。 |
実行結果はこんな感じ
ちなみに、同期プログラムも解析したら、致命的な不具合がありました
ライブラリの2重解放でコールしたときにクラッシュしてるのが原因、
XPだと、例外時にキャッチしてくれるので.そのままなんとか動いてる状態ひどい.
そちらはちょっと、手におえないので保留
Comments