QuickTime 7.6x の Plugin インストールの仕組み
QuickTime 7.64.17.73 7.65.17.80 は Windows 2000にインストールすると、Plugin がインストールされない場合があります。
そこで、Pluginのインストールの仕組みについて解析してみました。
まず、QuickTime.msiを解凍して、npqtplugin 絡みのファイルを探してみたのですが、見つかりませんでした。
quicktime のプラグインがインストールされると、qtplugin.logというファイルが生成され、そこにインストールログが記録されるのですが、それすらありません。
そこで、qtplugin.logで生成される『Plug-in installer called with paths:』の文字がどこで生成されるか調べてみました。
すると、qtsystem内のQuickTimeEssentials.qtxがその役割をになっていたので、追跡して見ると
67CF1C60 L67CF1C60: 67CF1C60 53 push ebx 67CF1C61 8B5C2410 mov ebx,[esp+10h] 67CF1C65 56 push esi 67CF1C66 33F6 xor esi,esi 67CF1C68 F6C340 test bl,40h 67CF1C6B 7419 jz L67CF1C86 67CF1C6D 8B44240C mov eax,[esp+0Ch] 67CF1C71 53 push ebx 67CF1C72 50 push eax 67CF1C73 E8F8DAFFFF call SUB_L67CEF770 67CF1C78 83C408 add esp,00000008h 67CF1C7B E860D4FFFF call SUB_L67CEF0E0 67CF1C80 0FBFC6 movsx eax,si 67CF1C83 5E pop esi 67CF1C84 5B pop ebx 67CF1C85 C3 retn |
ここがエントリーポイントのようで、第3引数に 0x40のビットが立っている場合アンインストールされることがわかりました。
というわけで次のようなコードを書いて強引に実行してみる実験をしてみたところ…。
int main(){ HINSTANCE hDll; hDll=LoadLibraryA("QuickTimeEssentials.qtx"); if(hDll==NULL)return 0; _asm{ push 0 push offset test2 push offset test1 mov eax, 0x67CF1C60 call eax add esp,0xc } return 1; } |
コードを追ってみると、QTCF.DLL が Apple Application Support の CoreFoundation.dll(shell32.dllのラッパーが必要)を呼び、そこからobjc.dll(kernel32.dllのラッパーが必要)がコールされていました。
Apple Application Support が Quicktimeに追加されてから、インストールされなくなったのも納得って感じですが、原因がわかった所で、解決編へと続きます。
関連記事:
QuickTime 7.65.17.80 がリリース
QuickTimeなどのインストールに関するトラブル
Mozilla Firefox 3 で QuickTime Pluginが使えない問題
Comments