iteg
|
Posted: Thu Nov 07, 2024 01:08 Post subject: |
|
|
Destiny
Не смог оперативно ответить, т.к. в процессе детального анализа описанных проблем (за которые вам благодарность!), потребовалось сделать несколько доработок, а также всё перепроверять.
1) Описание типов ресурсов добавил в их свойства. До 25 - стандартные, после 25 - мои собственные.
2) Доработал разбор записей структуры VarFileInfo. Ранее выводилась только одна пара Language и CodePage, теперь все, даже неполные.
3) Доработал функцию получения имени кодовой страницы. Теперь корректно обрабатывается значение 1200.
4) Значение кодовой странице 0 (CP_ACP) определяет, что кодовая страница будет получаться через WinAPI функцию GetACP - извлекает текущий идентификатор кодовой страницы Windows ANSI для операционной системы, по которому и получаю в ОС имя.
5) Каждый ресурс состоит из нескольких уровней и несет в своей структуре Lang и SubLang. Смотрите https://lief.re/doc/latest/tutorials/07_pe_resource.html.
Разберем на примере структуры VERSIONINFO. Согласно документации versionID должен быть равен '1'. Тогда для мультиязычности нам необходимо сделать несколько структур VERSIONINFO с единым идентификатором '1'.
Наглядный пример с другими вложенными ресурсами можно увидеть в mediacreationtool.exe (https://www.microsoft.com/en-us/software-download/windows11 и выбрать "Create Windows 11 Installation Media").
В плагине реализовано упрощение по глубине вложенности. Если ресурс имеет только один элемент "Level 3: Language", то в визуальное дерево переношу его как лист с именем идентификатора "Level 2: ID", т.е. '1'. Если элементов "Level 3: Language" несколько, то сохраняю оригинальную вложенность, т.е. элемент '1' ("Level 2: ID") будет узлом, в котором будут все элементы "Level 3: Language".
Также на вкладке "Инфо" выбор версионного ресурса происходит по алгоритму (т.к. версионных блоков может быть несколько десятков и пользователю необходимо предоставить только блок на его локали ОС, все остальные он может посмотреть на вкладке "Ресурсы"):
- находим directory с типом RT_VERSION.
- далее из неё получаем первую subdirectory, т.к. в документации идентификатор должен быть только один '1'.
- если в данной subdirectory несколько вхождений ресурсов, то шаг 1 - получаем идентификатор локализации свой ОС (GetUserDefaultLCID), если такого ресурса нет, то шаг 2 - ищем ресурс с '0 (Language Neutral)', если такого ресурса нет, то шаг 3 - берем самый первый ресурс.
Как раз на mediacreationtool.exe и переключении локали ОС в плагине на вкладке "Инфо" можно увидеть, что будет выбираться соответствующий версионный ресурс.
Данные изменения реализованы в тестовой сборке. По возможности протестируйте.
Тестовая версия 3.0.16.1:
- Устранена ошибка распаковки UPX. Если открыть исполняемый файл из архива, то totalcmd поместит его в "%TEMP%\_tc", которую также использует плагин для распаковки UPX. Чтобы не было коллизий с путями директорий для плагина установлена временная директория "%TEMP%\_tc\pv".
- Для компонента TMemo устранена ошибка установки мелкого размера шрифта для светлой темы.
- Для параметра UPXPath реализована поддержка переменных среды. Например, UPXPath=%COMMANDER_PATH%\Utils\upx\upx.exe.
- Доработан вывод структуры VarFileInfo с выводом всех пар "Language" и "Code Page".
- Расширен вывод структуры VS_FIXEDFILEINFO.
- Доработана функция вывода имени кодовой страницы. Корректно обрабатывается 1200.
https://www.upload.ee/files/17357210/PEViewer_3.0.16.1.rar.html |
|