[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
Еще не встречал нигде подобной реализации - сам додумался несколько недель назад, но поделиться было некогда.
Все видели текстовое загрузочное меню на G4D в подпунктами. Типа:
HDD утилиты
LiveCD
Установка Windows
Выбор любого из пунктов приводит к загрузке другого файла меню(lst) со своими подпунктами. Например configfile /GRUB/LiveCD.lst
У такой структуры меню есть минусы:
1) На флешке хранится несколько файлов LST вместо одного, что создаёт "кашу"
2) Чтобы вернуться из меню Установка Windows в HDD утилиты нужно сначала перейти в основное menu.lst, а затем уже в нужное - лишние шаги.
У многоуровневого древовидного меню таких минусов нет. Всё в одном файле и все подпункты всегда под рукой.
Изначально оно имеет следующий вид:

После раскрытия пункта:

Ну и полностью "распахнутое" меню:

 Я использовал урезанный unicode шрифт с кириллицей (около 3 кб), в который добавил знаки ⊞, ⊟, ├ и └, чтобы облагородить менюшку.
Файл MENU.LST тоже должен быть в кодировке unicode. Так же столкнулся с тем, что малое количество шрифтов Windows может отображать эти символы, а потому для своего редактора (Akelpad) я еще использовал шрифт Droid Sans Mono - он тоже есть в архиве, можете установить в систему и юзать его при редактировании меню. На флешке он конечно же не нужен.
Выкладываю архив с необходимым минимумом для примера.Скачать с вирусами и СМС регистрациейВариант меню от nikzzzz с сохранением позиции курсора.Программка для автоматического создания меню от nikzzzz
Attachments

от 17.07.2016



Last edited by MBTY on 2016-07-29 08:52; edited 3 times in total

[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
SunOK, утечки памяти? Вы про строку "configfile (md)4+8" ? Эта строка заставляет GRUB перечитать ранее загруженный configfile. Чтобы каждый раз не писать configfile /GRUB/menu.lst
RAM всегда на скринах держится в 639Кб.
Пробуйте, мне так очень нравится.

[Quote]

    Adler
  • 1708
  • Longevity: 3 years 6 months
  • Posts: 869
  • REPUTATION:36

    [+] [-]
  • Location: Луганск
ANDREISM, ну по идее можно затереть по такому принципу:
write (md)0x220+1 !BAT\necho -n -P:0000 $[0107] Hiren's BootCD 15.1 RUS \0 && initscript (md)0x220+1
Это строка из меню HBCD и заполняется она поверх той надписи, которую хотите убрать.
По идее если забить пробелами, то можно затереть...
P.S. Как то так:
write (md)0x220+1 !BAT\necho -n -P:0000 $[0107]                                                                                \0 && initscript (md)0x220+1

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
Немного доработал меню теперь при сворачивании-разворачивании сохраняется позиция курсора.
debug off
font /GRUB/FONT
graphicsmode -1 800 100:1000 24:32
#timeout 16
default %n%
title Просто пункт меню 1\n
rootnoverify (hd0,0)
chainloader +1
iftitle [if not "%PUNKT2%"=="1"] ⊞ Пункт меню 2\n
set PUNKT2=1
set n=2
set n2=4
configfile (md)4+8
boot
iftitle [if "%PUNKT2%"=="1"] ⊟ Пункт меню 2\n
set PUNKT2=0
set n=1
set n2=0
configfile (md)4+8
boot
iftitle [if "%PUNKT2%"=="1"] ├ Подпункт 2.1\n
frootnoverify (hd0,0)
chainloader +1
iftitle [if "%PUNKT2%"=="1"] ├ Подпункт 2.2\n
frootnoverify (hd0,0)
chainloader +1
iftitle [if "%PUNKT2%"=="1"] ├ Подпункт 2.3\n
frootnoverify (hd0,0)
chainloader +1
iftitle [if "%PUNKT2%"=="1"] └ Последний подпункт 2.4\n
frootnoverify (hd0,0)
chainloader +1
title Пункт меню 3\n
rootnoverify (hd0,0)
chainloader +1
iftitle [if not "%PUNKT4%"=="1"] ⊞ Пункт меню 4\n
set PUNKT4=1
set /a n=4+%n2%-0
set n4=2
configfile (md)4+8
boot
iftitle [if "%PUNKT4%"=="1"] ⊟ Пункт меню 4\n
set PUNKT4=0
set /a n=3+%n2%-0
set n4=0
configfile (md)4+8
boot
iftitle [if "%PUNKT4%"=="1"] ├ Подпункт 4.1\n
frootnoverify (hd0,0)
chainloader +1
iftitle [if "%PUNKT4%"=="1"] └ Последний подпункт 4.2\n
frootnoverify (hd0,0)
chainloader +1
iftitle [if not "%ALLPUNKT%"=="1"] ⊞ Развернуть все подпункты ⊞\n
set ALLPUNKT=1
set PUNKT2=1
set PUNKT4=1
set n2=4
set n4=2
set /a n=4+%n2%-0+%n4%-0
configfile (md)4+8
boot
iftitle [if "%ALLPUNKT%"=="1"] -- Свернуть все подпункты --\n
set ALLPUNKT=0
set PUNKT2=0
set PUNKT4=0
set n2=0
set n4=0
set n=4
configfile (md)4+8
boot
title Перезагрузка\n
reboot
title Выключение ПК\n
halt


Last edited by nikzzzz on 2016-07-17 07:05; edited 2 times in total

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
Написал программку для автоматического создания меню.
пример работы
исходное меню
## Создание свернутой группы
#-begin Group 0
title -0
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
title -1
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
## Конец группы
#_end
## Создание развернутой группы
#+begin Group 1
title -2
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
title -3
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
title -4
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
## Конец группы
#_end
title -5
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
результат
debug off
font /boot/grub/font
graphicsmode -1 800 100:1000 24:32
default %s%
## Создание свернутой группы
#-begin Group 0
iftitle [if "%p0%"=="1"] ⊟ Group 0
set p0=0
set /a s=0
set l0=0
configfile (md)4+8
boot
iftitle [if not "%p0%"=="1"] ⊞ Group 0
set p0=1
set /a s=1
set l0=2
configfile (md)4+8
boot
iftitle [if "%p0%"=="1"] ├ -0
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
iftitle [if "%p0%"=="1"] └ -1
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
## Конец группы
#_end
## Создание развернутой группы
#+begin Group 1
iftitle [if not "%p1%"=="1"] ⊟ Group 1
set p1=1
set /a s=%l0%-0+1
set l1=0
configfile (md)4+8
boot
iftitle [if "%p1%"=="1"] ⊞ Group 1
set p1=0
set /a s=%l0%-0+2
set l1=3
configfile (md)4+8
boot
iftitle [if not "%p1%"=="1"] ├ -2
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
iftitle [if not "%p1%"=="1"] ├ -3
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
iftitle [if not "%p1%"=="1"] └ -4
map --unmap=0:255
root (bd)
chainloader /boot/ntldr
## Конец группы
#_end
title -5
map --unmap=0:255
root (bd)
chainloader /boot/ntldr

В архиве комплект с примером и описанием.
Attachments

[Quote]

    Joker-2013
  • 1039
  • Longevity: 3 years 9 months
  • Posts: 2660
  • REPUTATION:127

    [+] [-]
  • Location: из прошлого
MBTY, nikzzzz, А вшить в файл grldr, не получится? (каскадное меню)

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
Joker-2013,
Вшить то думаю, можно, но там проблема - количество символов в меню сильно ограничено, хотя может в последних версиях его сняли, надо будет проверить.

[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
Joker-2013, получилось банальным бинарным склеиванием.
Файл LOADER - это GRUB без меню в себе
Файл MENU - это menu.lst в кодировке UTF без BOM
Файл FONT - файл шрифта
В консоли выполняем copy /b LOADER + MENU !LDR! и на выходе получаем !LDR! - это загрузчик GRUB с меню.
Попытался вшить внутрь и шрифт, убрал в меню строку подгрузки шрифта выполнил комманду (@copy /b LOADER + MENU + FONT !LDR!), вышла бяка.
http://rgho.st/654v5B8nr - тут две папки.
1) Один скрипт сшивает груб+меню+шрифты (на флешке хватит файла !LDR!)
2) Второй сшивает груб+меню, а шрифты надо класть отдельно (на флешке должно быть два файла !LDR! и FONT)
Может кто победит косяк с неправильным алфавитом в 1 варианте.

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
Обновил утилиту:
поддержка команд timeout и default
патчилка grldr
Attachments

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
MBTY,
Файл меню должен оканчиваться нулевым байтом.может этом проблема?

[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
nikzzzz, не помогло. Причем 0-байт ставил и после меню (шрифты не подхватились вообще) и после шрифтов (никакого эффекта что с ним что без него)
Не грузится около 8 последних строк шрифта. Если вшиваемое меню сделать из меньшего количества пунктов - все шрифты подхватываются. Если сделать меню из адовой кучи пунктов (брал 200) - меню грузится полностью, шрифты не подхватываются вообще.
Разве что пихать шрифты в самое дно файла загрузчика, а потом как то мапить часть файла с определенного адреса в память и оттуда уже грузить. Хз как это делается.

[Quote]

    nikzzzz
  • 215
  • Longevity: 4 years 2 months
  • Posts: 2529
  • REPUTATION:127

    [+] [-]
MBTY,
Посмотрел, максимальный размер встроенного меню 4096 байт, а меню+фонты весят немного больше.

[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
nikzzzz, ну у меня только хватает фантазии запихнуть в GRLDR файл GZ, в котором будет храниться шрифт и основное меню.
А вот что написать в GRLDR, чтобы он из себя прочёл этот архив с определенного HEX адреса и замапил это в память - не знаю.

[Quote]

    sergeysvirid
  • 104
  • Longevity: 4 years 4 months
  • Posts: 1490
  • REPUTATION:95

    [+] [-]
  • Location: 65 регион (GMT+11)
MBTY, nikzzzz, Joker-2013,
Приветствую! aa
А зачем вообще вшивать содержимое menu.lst в GRLDR?
И как потом "простому смертному" редактировать это меню? (ну то, что с помощью BootIce можно - это я вкурсе)
Но для какой такой необходимости усложнять задачу? bw

[Quote]

    MBTY
  • 1499
  • Longevity: 3 years 7 months
  • Posts: 66
  • REPUTATION:5

    [+] [-]
sergeysvirid, я больше из спортивного интереса хотел это дело осуществить. До того как Joker-2013 спросил, я и не думал об этом


Display posts:    

Current time is: 21-Apr 23:14

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum