PDA

Показать полную графическую версию : LogonUI - изменение размеров аватаров


Boa Soft
31-01-2009, 20:00
В интернете очень много интересных модифицированных экранов приветствия (logonUI.exe). Многие авторы кардинально меняют дизайн экрана, и делают размер аватарок большим, по подобию висты. Но, вот беда - размер подложки (PictureFrame) изменить можно, а самой аватарки юзьверя - нет. Она всегда 48 на 48 точек. Поэтому, в этих логонах аватарки не отображаются, а на подложке нарисована жеско заданная аватарка. Она будет едина для всех пользователей. Что не очень красиво.

Найдя красивый логон http://raulwindows.deviantart.com/art/Windows-7-Default-Login-v3-10-111322984 я решил его доработать. После основных доработок ресурсов я покопался IDA в его потрошках. И, вот что получилось:

http://pic.ipicture.ru/uploads/090127/thumbs/uyu3yYW54U.jpg (http://ipicture.ru/Gallery/Viewfull/12311402.html)

Картинки отображаются реально размером 96х96 точек :).

Для этого необходимо пропатчить в 3 местах процедуру LogonAccount__OnTreeReady:



.text:01009948 push 24h ; nNumber
.text:0100994A call ?PointToPixel@LogonFrame@@SGHH@Z ; LogonFrame::PointToPixel(int)


.text:010099CB push 24h ; nNumber
.text:010099CD call ?PointToPixel@LogonFrame@@SGHH@Z ; LogonFrame::PointToPixel(int)
.text:010099D2 push eax ; __int16
.text:010099D3 push 24h ; nNumber
.text:010099D5 call ?PointToPixel@LogonFrame@@SGHH@Z ; LogonFrame::PointToPixel(int)



Здесь размер аватарки задается в внутренних модулях. 24h соответствует 48 пикселям. 48h - 96 пикселям. Т.е. 1 модуль примерно равен 1.333 пикселя.

Первое вхождение задает размер, когда аватарка грузится из bmp картинки, вторые два - когда невозможно загрузить картинку и загрузка идет из внутреннего ресурса №114.

Для патча нам надо в любом HEX - редакторе открыть LogonUI и найти и заменить следующее (3 вхождения):

6A 24 E8 -> 6A 48 E8

Внимание! Патчим только первые 3 вхождения. 4 не трогаем!

После сохранения файла проверяем, что теперь у нас тарки размером 96x96!


Но, иметься только проблема, даже две:

1. Менеджер учетных записей всегда создает картинки 48x48
2. При отсутствии картинки logonui сам создает какртинку тоже 48x48.

Ищем далее. Искомая функция сидит уже не в LogonUI а в Shell32.dll - без имени, №324.

В ее подпрограмме находим:

.text:7CAD3F3F jmp short loc_7CAD3F46
.text:7CAD3F41 ; ---------------------------------------------------------------------------
.text:7CAD3F41
.text:7CAD3F41 loc_7CAD3F41: ; CODE XREF: sub_7CAD3EAA+6Cj
.text:7CAD3F41 push 30h

Тут уже будет просто в точках:

Для патча нам надо в любом HEX - редакторе открыть Shell32.dllи найти и заменить следующее (1 вхождениу):

EB 05 6A 30 5F 8B -> EB 00 6A 60 5F 8B

Первый байт отключает вычисления размера модуля, а второй сразу задает размер в 96пикселей.

После подмены shell32 на патченную и перезагрузки аватарки создаются 96 px.

Только следует учесть, что эта функция только уменьшает картинки. Если же картинка была менее 96 пикселей, то такой она и останется.
Но, это не страшно - logonUi сам растянет при отображении до 96x96 точек.


При экспериментах учитывайте то, что при ошибке компьютер может не загрузится. Заранее имейте ERD диск или параллельно установленную систему.

Пример логона во вложении. Shell32 пропатчте при необходимости сами.

PS За основу был взят экран Logon User Interface created by RaulWindows.deviantart.com, правда тут от исходного мало чего осталось. Но, так что, если захотите включить в какие-либо публичные пакеты/сборки, желательно испросить разрешения у автора.

Так же хинт для отладки логона. Если неправильно что-то сделать, то после проверки по Win-L может не отобразится сам аккоунт. И войти обратно невозможно.

Завершаем работу с перезагрузкой и после загрузки до логона удерживая ctrl-alt жмем два раза del. В окне классического входа вводим имя и пароль и попадаем в виндовс.

Чтобы не повторять ошибку, запускаем любой сторонний менеджер, закрываем процесс explorer.exe и запускаем logonui. И. видим, как все отображается. LogonUI можно только прибить из менеджера процессов. Почему надо убивать проводник - потому, что LogonUI проверяет его запущенность.




© OSzone.net 2001-2012