PDA

Просмотр полной версии : [Hello boot screen]


0x0c0de
30.11.2008, 00:04
[Hello boot screen!]

[System]
Windows XP (SP3,SP2)

[Intro]

Где-то видела статью - не статью, заметку-не заметку про то, что при старте винды на экран можно вывести инфу с помощью функции
VidDisplayStringXY из bootvid.dll. Мне стало интересно, каким образом можно вывести какое-либо изображение. Проникшись этим делом, я написала простенький дров, который как раз-таки выводит на экран при загрузке винды надпись хелло. Возможно, это дело будет кому-то интересно

[Let's go]

Путем недолгих поисков нашла функцию VidSolidColorFill


VOID
VidSolidColorFill(
ULONG x1,
ULONG y1,
ULONG x2,
ULONG y2,
ULONG color
);


Эта функция так же экспортируется bootvid.dll.
Она закрашивает прямоугольную область (x1,y1) - координата левого верхнего угла, (x2,y2) - координата правого нижнего угла. color - цвет. Вообще прямоугольники вещь великая. Нарисуем прямоугольниками HELLO.

Итак, теперь откомментированный код функции... Она показывает надпись hello и 5 раз меняет цвет фона и надписи. Задержка

функцией KeDelayExecutionThread...

Я подписала где начинается какая буква для читабельности. Две буквы L в одном цикле для сокращения размеров кода. Так же как три горизонтальные палочки у буквы E и две вертикальные у H.


// Функция, выводящая надпись HELLO во время загрузки винды. Драйвер должен быть заинсталлен как boot!
// bg_color (color) + c - изменение цвета - так веселее)))
extern "C" VOID SayHello(ULONG x,ULONG y,ULONG color,ULONG bg_color){
int i,c;

LARGE_INTEGER s_time;
s_time.QuadPart = -10000000;

for(c=0;c<6;c++){
//фон

VidSolidColorFill(
0,
0,
800,
600,
bg_color+c
);

// буква Н
for(i=0;i<2;i++){
VidSolidColorFill(
x+i*40,
y,
x+20+i*40,
y+100,
color+c
);
}

VidSolidColorFill(
x+20,
y+40,
x+40,
y+60,
color+c
);


// буква Е
VidSolidColorFill(
x+80,
y,
x+100,
y+100,
color+c
);

for(i=0;i<3;i++){
VidSolidColorFill(
x+100,
y+i*40,
x+120,
y+20+i*40,
color+c
);
}


// две L

for(i=0;i<2;i++){

VidSolidColorFill(
x+160+i*80,
y,
x+180+i*80,
y+100,
color+c
);

VidSolidColorFill(
x+180+i*80,
y+80,
x+220+i*80,
y+100,
color+c
);

}

//O
// две вертикальные палочки
for(i=0;i<2;i++){
VidSolidColorFill(
x+320+i*40,
y,
x+340+i*40,
y+100,
color+c
);
}

//две горизонтальные палочки
for(i=0;i<2;i++){
VidSolidColorFill(
x+340,
y+i*80,
x+360,
y+20+i*80,
color+c
);
//Делаем задержку
KeDelayExecutionThread(KernelMode,FALSE,&s_time);

}
}

}



Вышеприведенный код надо вставить в драйвер и вызвать


SayHello(60,40,9,7);


например так.

в качестве аргументов кодес принимает начальные координаты x и y, цвет надписи и фона.

Итак, что же получилось?

а)до

http://img141.imageshack.us/my.php?image=dopi1.jpg


б)после

http://img136.imageshack.us/my.php?image=hello1lv3.jpg

и

http://img136.imageshack.us/my.php?image=hello2of9.jpg

[Compilation]

Для самостоятельной компиляции драйвера вам конечно потребуется DDK и либа bootvid.lib, для тех кому ее лень искать - положила в архив с сорцами и бинарем по ссылке ниже. Повторяю - драйвер должен быть инсталлирован как BOOT, иначе толку не будет.

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

[Download]
http://rapidshare.com/files/168641900/bootgraph.rar.html

(c)november 0x0c0de 2008

0verbreaK
30.11.2008, 00:21
Классная вещь.

Есть вопрос:
инсталировать как BOOT - как можно сделать?

0x0c0de
30.11.2008, 00:25
Вот так ~


SC_HANDLE hSCM = OpenSCManager(0,0, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hSRV = CreateService(hSCM, имя_сервиса, имя_сервиса,SERVICE_ALL_ACCESS,SERVICE_K ERNEL_DRIVER,SERVICE_BOOT_START,SERVICE_ERROR_NORM AL,путь_к_драйверу, 0, 0,0, 0, 0);


-----------добавлено-------
и еще забыла сказать - дров положите в
\windows\system32\drivers\ и заинстальте

sn0w
01.12.2008, 11:30
осталось ядерный pbrush зарелизить ;)

th13fnano
08.12.2008, 20:38
Вижу юзал Windows XP game edition норм сборка, даже boot урезан :)