[Hello boot screen]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 0x0c0de, 29 Nov 2008.

  1. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    [Hello boot screen!]

    [System]
    Windows XP (SP3,SP2)

    [Intro]

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

    [Let's go]

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

    Code:
    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.

    Code:
    // Функция, выводящая надпись 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);
      
      }
      }
     
    }
    
    
    Вышеприведенный код надо вставить в драйвер и вызвать

    Code:
    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
     
    #1 0x0c0de, 29 Nov 2008
    Last edited: 30 Nov 2008
    5 people like this.
  2. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Классная вещь.

    Есть вопрос:
    инсталировать как BOOT - как можно сделать?
     
    1 person likes this.
  3. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Вот так ~

    Code:
    SC_HANDLE hSCM = OpenSCManager(0,0, SC_MANAGER_ALL_ACCESS);
    SC_HANDLE hSRV = CreateService(hSCM, имя_сервиса, имя_сервиса,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_BOOT_START,SERVICE_ERROR_NORMAL,путь_к_драйверу, 0, 0,0, 0, 0);
    
    -----------добавлено-------
    и еще забыла сказать - дров положите в
    \windows\system32\drivers\ и заинстальте
     
    #3 0x0c0de, 29 Nov 2008
    Last edited: 30 Nov 2008
    4 people like this.
  4. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,301
    Reputations:
    327
    осталось ядерный pbrush зарелизить ;)
     
  5. th13fnano

    th13fnano New Member

    Joined:
    8 Dec 2008
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Вижу юзал Windows XP game edition норм сборка, даже boot урезан :)