Software patches |
Добро пожаловать, гость ( Вход | Регистрация )
Software patches |
-=CHE@TER=- |
Oct 23 2010, 16:18
Сообщение
#1
|
Walter Sullivan Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) |
ACDSee 5.0.0.0025 PowerPack (2002)
Disable database and Windows 7 compatability patch Отключение IDBSvr.exe и БД изображений Пользуюсь с незапамятных времён этой версией ACDSee. Тут нет огромного количества ненужных свистопыхтелок (или по крайней мере большую часть из них можно отключить или скрыть) которые наводнили другие версии этой программы. Зато всё остальное представлено в полном объёме. Единственная проблема, которую не удалось отключить штатными средствами - это опухание БД с изображениями. Дело в том что ACDSee для быстроты работы делает превью изображений и сохраняет их в свою БД. Последняя, в свою очередь, со временем пухнет всё больше и больше что мне на системном диске как бы нафиг не надо. Ещё, как выяснилось, программа не дружит с многоядерными процессорами и разваливается на них. И, наконец, при попытке открыть каталог содержащий .LNK или .URL файл с длинным адресом программа сразу падает. В общем решение всех проблем такое: 1) Отучаем ACDSee запускать свою БД. Для этого меняем в файле: C:\Program Files\ACD Systems\ACDSee\5.0\ACDSee5.exe ; uni-processor patch ; запускать только на 1 ядре 00000167: 01 -> 41 ; disable IDBSvr database service ; отключаем сервис базы данных изображений 000175D5: 86 -> AE 000175F2: 86 -> AE 0001760E: 29 -> 00 0001761B: 74 -> EB 0001761C: 08 -> 1B 0001B7E7: E8 -> B8 0001B7E8: 74 -> 00 0001B7E9: 8A -> 00 ; fix long URL crash - disable .LNK/.URL handling ; исправляем падение при длинных URL - отключаем их обработку 001E94E4: 2E -> 00 001EA254: 2E -> 00 2) Удаляем всё из каталога: C:\Documents and Settings\%USERNAME%\Application Data\ACD Systems\ После всего этого ACDSee даже быстрее стартует (на глаз), т.к. нет необходимости дожидаться загрузки "IDBSvr.exe", её .DLL, БД и прочего мусора. |
-=CHE@TER=- |
Apr 1 2014, 14:58
Сообщение
#2
|
Walter Sullivan Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) |
И последнее дополнение на сегодня.
Не так давно (всего-то пару лет назад) начал слушать файлы в .AAC формате (к примеру, дёргаешь звук из видео с YouTube и чтобы не перекодировать прямо в .AAC и слушаешь). К тому же благодаря переписке и небольшой помощи с моей стороны (а может и не только?) автор MP3DirectCut добавил возможность резать и .AAC файлы, так что всё ненужное можно отрезать и слушать любую понравившуюся музыку с YouTube. Как вы помните, я пользуюсь Winamp 2.81 Classic. Для него есть плагин in_mp4.dll (версии там нет, но датируется 2004.07.09), который проигрывает как обычные .AAC, так и .M4A/.MP4. Проблема в том, что последнего формата файлов у меня нет, есть только .AAC, причём после того как я проиграю какой-либо из этих файлов, то теряю к ним доступ - ни удалить, ни изменить, ни переместить не могу, пока не закрою Winamp. Вчера глянул в Unlocker один такой файл и аж офигел - оказывается Winamp держит штук 20 с лишним файловых дескрипторов, т.е. плагин in_mp4.dll каждый раз заново открывал файл при проигрывании, но не закрывал при остановке/переключении на другой трек. Охренев от такого безобразия полез в Интернет искать новую версию этой библиотеки. Но тут меня ждал облом, т.к. новых версий не было, а исходные коды menno (автор плагина, разработчик из Nero) удалил из репозитория с пометкой "OBSOLETE", потому что поддержка .AAC была в Winamp 5 нативной (через свою библиотеку), но в старых Winamp-то её не было! Начался адский квест по поиску исходных кодов этой бибиотеки. Нашёл вот тут, правда они старые (см. историю изменений), но хоть что-то. Можно, конечно, было собрать плагин заново, но я не был уверен, что мне для этого не придётся ставить 7-ую студию, плюс пришлось бы выковыривать из репозитория все изменения плагина, которые произошли до его удаления (а там было что). Короче, я решил поглядеть исходные коды и поправить косяк дописав нужный код на ассемблере в библиотеку. А теперь, вы можете офигевать вместе со мной. /bmp-faad/work/faad2/plugins/in_mp4/in_mp4.c:play() CODE if (!(mp4state.mp4file = MP4Read(mp4state.filename, 0))) { mp4state.filetype = 1; // это будет .AAC } else { MP4Close(mp4state.mp4file); mp4state.filetype = 0; // а это .M4A/.MP4 } Обратите внимание, что если что-то пошло не так, то класс автоматически выгружается. /bmp-faad/work/faad2/common/mp4v2/mp4.cpp CODE extern "C" MP4FileHandle MP4Read(const char* fileName, u_int32_t verbosity) { MP4File* pFile = NULL; try { pFile = new MP4File(verbosity); pFile->Read(fileName); return (MP4FileHandle)pFile; } catch (MP4Error* e) { VERBOSE_ERROR(verbosity, e->Print()); delete e; delete pFile; return MP4_INVALID_FILE_HANDLE; } } Ещё немножко ходим по коду, смотрим где что открывается - всё ок, но тут... /bmp-faad/work/faad2/common/mp4v2/mp4file.cpp CODE MP4File::~MP4File() { MP4Free(m_fileName); delete m_pRootAtom; for (u_int32_t i = 0; i < m_pTracks.Size(); i++) { delete m_pTracks[i]; } MP4Free(m_memoryBuffer); // just in case } ДА-ДА-ДА! Это именно то, про что вы подумали - в деструкторе НЕ закрывается открытый файловый дескриптор! Там адово нехватает: CODE if (m_pFile) { fclose(m_pFile); } Таким образом, когда MP4Read() возвращает ноль (MP4_INVALID_FILE_HANDLE), то класс уничтожается, но открытый файл не закрывается! А ведь ноль может вернуться не только в случае отсутствующего файла или невозможности его открыть, но и в случае неверного формата или не .M4A/.MP4 формата! В общем, пришлось впихивать в деструктор упомянутый выше код с fclose() - крови оно мне попортило изрядно, но, в итоге, всё работает. Особенно весело было получать адрес fclose(), с учётом того, что в библиотеке нет функций LoadLibrary(), GetProcAddress() и даже GetModuleHandle(), а также не стоит забывать, что все импортируемые адреса при загрузке .DLL меняются - выкрутился через получение EIP и ручное высчитывание смещения относительно известного у free() (несущественные инструкции я опустил): CODE @patch: call @func add eax, 035h; free() addr - [A8100610] - see below mov eax, [eax] sub eax, 034h; fclose() addr mov ecx, [ecx][4]; m_pFile test ecx, ecx; m_pFile == NULL ? jz @skip push ecx call d, [eax] pop eax; restore stack @skip: jmp @continue <start destructor proc> ... 8B1D [A8100610] mov ebx, free; MSVCRT <-- rebased value! ... jmps @patch @continue: ... </end> @func: pop eax; mov eax = esp (eip after return) push eax; put back ret; return: pop dd & jmp dd Так как в оригинале библиотека была сжата UPX 1.24, то я её распаковал (заодно Winamp будет грузить быстрее) и пропатчил - результат каждый может взять вот тут: in_mp4.dll (fixed) 275 Kb Для работы поместить "in_mp4.dll" в C:\Program Files\Winamp\Plugins\ или где там Winamp установлен. Спасибо сказали:
|
Упрощённая версия | Сейчас: 24th September 2024 - 08:41 |