IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Software patches
-=CHE@TER=-
Oct 23 2010, 16:18
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



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, БД и прочего мусора.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=CHE@TER=-
Apr 1 2014, 14:58
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



И последнее дополнение на сегодня.
Не так давно (всего-то пару лет назад) начал слушать файлы в .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 установлен.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме
-=CHE@TER=-   Software patches   Oct 23 2010, 16:18
-=CHE@TER=-   Переименовал тему. FlashGet 1.73 Build 128 (2006)...   Nov 18 2010, 12:55
-=CHE@TER=-   Да, блин! Долбанный ACDSee! Добавил в перв...   Mar 27 2011, 11:14
-=CHE@TER=-   Как выяснилось, ACDSee 5 - самый лучший из ACDSee,...   Jan 11 2012, 21:52
-=CHE@TER=-   На Windows 7 она работает, но почему-то заваливает...   Jan 14 2012, 15:11
-=CHE@TER=-   Продолжаем разговор. На этот раз мы будем исправля...   Oct 12 2013, 10:42
-=CHE@TER=-   Многие знают, что ещё со времён MS-DOS есть такая ...   Nov 17 2013, 11:03
-=CHE@TER=-   И последнее дополнение на сегодня. Не так давно (в...   Apr 1 2014, 14:58
Axsis   Кстати, пара вопросов на тему. Я так понимаю, что ...   Apr 3 2014, 18:48
-=CHE@TER=-   Например foobar2000, которым я пользуюсь, играет и...   Apr 4 2014, 03:26
-=CHE@TER=-   Продублирую тут своё сообщение из другой темы. У м...   Mar 6 2016, 05:57
-=CHE@TER=-   Microsoft Games for Windows 8 v1.2 / Windows 10 fi...   Aug 10 2016, 18:39
-=CHE@TER=-   Переделал и сократил патч для ACDSee5 - сделал его...   Nov 3 2016, 13:28
useretail   А почему не 2.95? Вроде она последняя из вторых.....   Apr 19 2017, 00:42
-=CHE@TER=-   А почему не 2.95? Вроде она последняя из вторых......   Apr 19 2017, 05:19
useretail   Захожу раз в год и как всегда всякие полезняшки уз...   Apr 19 2017, 22:25
-=CHE@TER=-   Захожу раз в год и как всегда всякие полезняшки уз...   Apr 20 2017, 04:52
-=CHE@TER=-   Блин, чёртов ACDSee5! В который раз переделыва...   Aug 27 2017, 09:21
-=CHE@TER=-   Решил тут недавно пройтись UPX'ом по одной сво...   Nov 5 2023, 15:57


Reply to this topicStart new topic
13 чел. читают эту тему (гостей: 13, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 27th April 2024 - 22:07