Бинарные UIFILE-ресурсы в Win8+
От: 463C21E2  
Дата: 26.04.17 02:11
Оценка: 70 (2)
Изучая
Автор: 463C21E2
Дата: 21.04.17
новые (8+) винды, столкнулся с новыми (для меня) типами ресурсов, в т.ч. UIFILE. К сожалению, традиционные инструменты типа Resource Hacker или Restorator не поддержимают их, отображая попросту в hex'ах. А хотелось бы уметь заглянуть внутрь.

Вот что удалось понять. Не уверен, что все (или хотя бы что-то!) я понял правильно. Если вы знаете лучше, или понималка у вас сильнее, или я в трех соснах MSDN'а заблудился и прошел мимо раздела с документацией, не ругайтесь, пожалуйста, а поправьте меня или натыкайте мордой в ссылки

Итак...




Давным-давно, еще в WinXP, был введен механизм, аналогичный CSS. Он использовался для создания кастомных тем (themes). Конкретно, в ресурсах появился новый тип — UIFILE, который выглядел как-то так:

button [id=atom(header)]
{
   background: rcbmp(110,6,#FF00FF,0,0,1,0);
   borderthickness: rect(2,2,2,0);
   foreground: white;
   fontweight: rcint(10);
   padding: rect(10,0,0,0);
   animation: rectanglev | s | fast;
}


Немного деталей тут: https://www.codeproject.com/articles/7247/themed-windows-xp-style-explorer-bar#UIFILE

Документации по всему этому делу в MSDN не было.




В какой-то момент (Vista?) формат файла стал XML-based (и сменил название на DUIXML?). Во всяком случае, если открыть ресурсы shellstyle.dll от Win7, в группе UIFILE будет ресурс, начинающийся с:

<duixml>
<stylesheets>
<style resid="main">
...


Немного порывшись, можно легко найти кусок, соответствующий XP-шному:

<if id="atom(header)">

<Element 

Background     = "argb(0, 0, 0, 0)"

Font           = "gtf(TextStyle, 1, 0)"

Foreground     = "gtc(TextStyle, 1, 0, 3803)"

Overhang       = "false"

Padding        = "rect(0rp, 0rp, 0rp, 6rp)" 

/>

</if>


Документации по всему этому делу в MSDN не появилось.




ВОЗМОЖНО, где-то по пути XML стал XAML'ом. Во всяком случае, одно из немногих мест в MSDN, где я нашел упоминание UIFILE — риббоны.

https://msdn.microsoft.com/en-us/library/dd371471%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ff963530.aspx

В частности, IUIFramework::LoadUI (составная часть некоего Ribbon Framework) грузит шаблон (?) риббона из UIFILE, про который явно сказано, что он (забегая вперед — до превращения в бинарь) был XAML'ом.




Начиная то ли с Win8, то ли с Win8.1, этот формат сделали бинарным (и сменили его название на BML? или DUIB? или UIB?). Теперь не то, что надо изучать недокументированные свойства, сам процесс редактирования стал затруднен!

Дизайнеры возопили: https://superuser.com/questions/517786/windows-8-resource-hacking-encrypted-uifiles

In Windows 7 it was quite easy to modify resource files such as DLLs to make changes to the Windows interface. This was done by editing the UIFILE's using a program like Resource Hacker.

However, now in Windows 8 it seems like some of the UIFILE's are encrypted and are no longer in plain text form and editable in Resource Hacker like they were before.


За ними возопили инженеры, но существенно тише: http://fw.hardijzer.nl/?p=10

With Windows Live Messenger 9 Wave 3, Microsoft abandoned the XML-like UIFile format to describe their user-interface layout. Instead, a new proprietary binary format was introduced named UIB (named after the first three bytes in the files), which TheSteve and I are now reverse engineering.
What bothers me is that somehow people have misinterpreted this move, and are labelling it “protection”, insinuating that Microsoft did this intentionally to block skins and patches.

So allow me to clear that up. First of all, the new format is not actually a protection. The format is, once you figure out how it works, rather simple and elegant, in no way designed to mislead anyone trying to understand it. I personally think that the developers at Microsoft made the switch to a proprietary format because parsing XML for each and every window is just slow and quite a resource hog. Switching to their own optimized-for-this-purpose format allows them to make it faster and more memory efficient, and also smaller.


Как видите, допускают даже, что это не encrypted, а optimized

(И, кстати, в интересующем меня Taskmgr.exe, который я взял от 8.1, первые 4 байта обоих ресурсов UIFILE (из двух имеющихся) — duib, а не первые 3 байта — uib. Поэтому и имя формата может быть не UIB, а DUIB).

Если учесть такие вопросы: https://superuser.com/questions/494878/does-windows-8-have-a-status-bar-to-display-details-of-a-file, окажется, что бинарный формат в виндах не везде. Я проверил: в одной и той же 8.1 в shell32.dll в секции ресурсов UIFILE хранится DUIXML, в то время как в Taskmgr.exe — DUIB... или UIB... или BML... бинарь, короче!




Предположив, что XAML, про который рассказывается в упомянутой выше риббоновской документации, и DUIXML — одно и то же, мы получим, что DUIB это результат компиляции DUIXML/XAML:

Binding the BML Resource to the Executable

The only way to initialize a Ribbon control with the markup information is to call the IUIFramework::LoadUI method and pass the name of a UIFILE resource bound to the executable. To do this you must compile the XAML to produce a BML file and bind this to the executable. The tool to compile the XAML to BML is called uicc.exe and is provided as part of the Windows 7 Software Development Kit (SDK). This tool produces three outputs: the BML file that contains the markup information, a header file that contains the symbols that identify the commands, and a resource script that describes the string tables, bitmaps and the UIFILE resource for the BML file.


Предположение это основано только на том, что полученный бинарь должен включаться в ресурсы как UIFILE. Если оно верно, то надо найти утилиту, обратную uicc.exe (декомпилятор).




Еще может быть, что DUIXML это DirectUI XML. DirectUI это, как пишут, некая внутренняя библиотека в MS, но те исходники, которые я нашел на разных гитхабах-кодеплексах, ничего про duib не знают. Вообще, про этот DirectUI 90% материалов и репозиториев представлено иероглифами.




Как бы то ни было, хотелось бы иметь утилиту, преобразующую UIFILE в XML. К сожалению, ничего, кроме вышеизложенного, найти не удалось. Особое спасибо Qt (Там "uifile" значит что-то свое, постоянно попадает в результаты поиска).

Если кто знает, как или чем этот UIFILE читать — заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.