[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

    [+] [-]
Еще не встречал нигде подобной реализации - сам додумался несколько недель назад, но поделиться было некогда.
Все видели текстовое загрузочное меню на 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
Вложение

от 17.07.2016



Последний раз редактировалось: MBTY (2016-07-29 08:52), всего редактировалось 3 раз(а)

[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

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

[Цитировать]

    Adler
  • 1708
  • Стаж: 9 лет 1 месяц
  • Сообщений: 1214
  • Репутация:65

    [+] [-]
  • Откуда: Луганск
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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация: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


Последний раз редактировалось: nikzzzz (2016-07-17 07:05), всего редактировалось 2 раз(а)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация: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
В архиве комплект с примером и описанием.
Вложение

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 5 месяцев
  • Сообщений: 2053
  • Репутация:120

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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

    [+] [-]
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 варианте.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

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

[Цитировать]

    sergeysvirid
  • 104
  • Стаж: 9 лет
  • Сообщений: 2584
  • Репутация:127

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

[Цитировать]

    MBTY
  • 1499
  • Стаж: 9 лет 2 месяца
  • Сообщений: 86
  • Репутация:9

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

Страница 1 из 2


Показать сообщения:    

Текущее время: 03-Дек 20:17

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы