Як відкрити advanced bios або розширений режим
Зазвичай питанням "як відкрити advanced bios чи розширений режим?" задаються для того, щоб зробити детальніші налаштування в базові системи введення-виведення або просто БІОС.
Перше що потрібно знати, перед тим як щось змінювати в БІОС, ви повинні розуміти, що робите, а тим більше часто прихований від новачків режим використання BIOS. Оскільки зміна деяких параметрів може ускладнити увімкнення комп'ютера та завантаження операційної системи.
Зразковий вигляд вікна Advanced bios Features
Як видно зі скріншотів, наведених у різних версіях та розробників BIOS, вкладка Advanced ... відрізняється. Одні в цій вкладці містять параметри пріоритету завантаження пристроїв.
Так саме ті установки необхідні для встановлення або переустановки Windows, тобто це параметри завантаження з пристрою, на якому є програма установки, відновлення, завантаження операційної системи з диска (Live CD, Live USB та ін.). Деякі виробники виносять параметри пріоритету завантаження пристроїв в одну вкладку з ім'ям Boot. Що швидше за все є правильним рішенням та логічним виділенням цих налаштувань.
Основні налаштування розширеного меню
Давайте розглянемо основні настройки, які можуть потрапити на вкладці Advanced.
Візьмемо для прикладу старий AMI BIOS – 3 версії. В інших версіях BIOS повинні бути схожі функції, можливо мати інші назви.
Quick Boot – Швидке завантаження, що означає увімкнути або вимкнути (Enabled – увімкнено, Disabled – вимкнено) швидке завантаження операційної системи, без витрати часу на перевірку пристроїв та тестування пам'яті базовою системою введення-виводу.
Boot Device Select – Улюблене меню та знайоме меню для тих, хто хоч раз стикався з переустановкою Windows, у цьому меню потрібно змінити, якщо не варто за умовчанням, пріоритет завантаження пристроїв.Інакше кажучи, тут вам слід вибрати перший пристрій, який перевірятиметься на наявність завантажувальної інформації (завантажувач Windows або Live Cd) зазвичай за умовчанням стоїть жорсткий диск (HDD), можна поміняти, наприклад, на CD\DVD USB та інші пристрої зі списку. Загалом кажучи, потрібно поставити так First Boot Device – CD\DVD, якщо програма встановлення знаходиться на диску, далі можна поставити жорсткий диск, а третій пристрій за пріоритетом залишити порожнім. (двох на повніше достатньо для зручності). За аналогією можна поставити Fist Boot Device – Flash\USB… якщо файли завантаження знаходяться на USB-flash.
Full Screen Logo Show – це рідкісне меню, що зустрічається не на всіх материнських платах і використовується теж рідко.
S.M.A.R.T for Hard Dist - це функція BIOS яка перевіряє жорсткий диск на працездатність, якщо говорити по іншому, то ця функція скаже заздалегідь, коли ваш жорсткий диск рекомендується замінити. Інформація перевірятиметься при кожному увімкненні комп'ютера. І коли термін служби жорсткого диска підійде до закінчення, вам порадять прямо в стартовому екрані скопіювати дані на новий жорсткий диск.
BootUp Numlock – це функція BIOS, яка автоматично включає праву цифрову клавіатуру прямий під час увімкнення комп'ютера.
Floppy … — це функції, пов'язані з застарілими дискетними накопичувачами та пристроями для їх читання.
Password Check – тут можна встановити пароль для входу до БІОС. Якщо забудете, доведеться виймати батарейку та скидати налаштування на заводські. Необхідно для захисту від «цікавих очей».
Hyper Threading - Це складна для пояснення технологія, суть якої полягає в тому, що операційна система буде вважати одне ядро комп'ютера як два і через цю технологію процесор використовується більш раціонально. Ця установка впливає на продуктивність.
MPS - Це опція потрібна якщо у вас багатопроцесорна материнська плата.
APIC ACPI SCI IRQ – використовуйте розширений режим, якщо у вас багатоядерний процесор, якщо розширений режим буде вимкнено, комп'ютер бачитиме лише одне ядро.
CPU L1 & L2 Cache – увімкнення та вимкнення швидкої пам'яті процесора. Краще ці установки не чіпати, особливо якщо не знаєте для чого.
System BIOS Cacheable - Старі операційні системи використовували частину готового функціоналу BIOS, тому ця опція могла прискорити роботу, але зараз розробники операційних систем їй не користуються, а отже, краще тримати її у вимкненому стані.
УВАГА: Якщо ви оновлюєте BIOS, ця опція повинна бути вимкнена (DISABLED). Інакше перепрошивка BIOS може пройти в повному обсязі, що призведе до непрацездатності BIOS.
C00 32k Shadow – ця опція могла прискорити роботу відеокарти шляхом копіювання BIOS відеокарти в оперативну пам'ять, на сучасних платформах не використовується.
Давайте коротко розглянемо інший вид розширеного меню BIOS
JumperFree Configuration – це набір налаштувань, необхідні для розгону комп'ютера.
УВАГА: В ЦИХ НАЛАШТУВАННЯХ ПОТРІБНО БУТИ ДУЖЕ АКУРАТНИМИ І ЗНАТИ, ЩО НАВІЩО ЗМІНЯЄТЕ. Так як розгін пов'язаний з збільшенням електроенергії і тепловиділення. НЕАДЕКВАТНЕ ЗМІНА ЦИХ ПАРАМЕТРІВ МОЖЕ СПОЛУЧИТИ НЕ КОРЕКТНУ РОБОТИ ОБЛАДНАННЯ КОМП'ЮТЕРА.
CPU Configuration – це інформація про процесор та його налаштування на даний момент.
CHIPSET – це зазвичай набір налаштувань розгону оперативної пам'яті. Рекомендації ті ж, що й у всіх параметрах розгону.
Onboard Device Configuration – це набір налаштувань щодо увімкнення та вимкнення портів, мережної карти.
PCIPNP – це набір налаштувань, пов'язаних з обслуговуванням та обробкою переривань компонентів на PCI.
USB Configuration – це набір налаштувань, пов'язаних із USB.
Висновок
Якщо у вас немає вкладки Advanced або вона прихована, то вам необхідно знайти в підказках, або з лівого боку, або внизу написано яку клавішу натиснути для переходу в режим Advanced.На практиці BIOS має схожу структуру, деякі функції можуть бути винесені в інші вкладки. Інформація, отримана тут, може бути використана для більшості материнських плат.
У деяких материнських платах будуть доступні інша функціональність і може бути трохи інше меню, (Наприклад, Asus UEFI та ін.)
Доступ до прихованих налаштувань UEFI BIOS від Insyde
Один із напрямків моєї компанії — продаж технологічних рішень у галузі віртуалізації. За обов'язком служби доводиться робити пілотні проекти або влаштовувати тестові стенди. Нещодавно компанія Citrix випустила новий продукт під назвою XenClient XT, який, по суті, є клієнтським гіпервізором першого рівня, тобто працює на чистому залозі. Основною ідеєю клієнтського гіпервізора є створення віртуальних машин на власному ноутбуці. Де і як це можна застосувати — опустимо.
Усі сучасні процесори Intel та AMD підтримують технологію апаратної віртулізації.
І так, у моєму розпорядженні був ноутбук з H77 чіпсетом та Intel Core i7-3820QM процесором. Згідно зі специфікацією від виробника, мій процесор підтримував Intel Virtualization Technology (VT-x) та Intel Virtualization Technology for Directed I/O (VT-d) технології. Якщо перша є майже на всіх нових ноутбуках, друга технологія зустрічається тільки на топових моделях. Але вона дає багато переваг, як наприклад пряме прокидання GDU у віртуальне середовище, відповідно клієнтська машина отримує повну підтримку 3D. Але давайте не заглиблюватимемося в технології, відмінні від тематики цієї статті.
У моєму біосі була можливість включення VT-x, але управління технологією VT-d не було передбачено спочатку.
У засмучених почуттях, я став блукати різними ресурсами в інтернеті і натрапив на два дуже цікаві ресурси: mydigitallife і bios-mods.
Виявилося, що більшість налаштувань біосу прихована від звичайного користувача.Причина зрозуміло — не давати користувачам длубатися в налаштуваннях ініціалізації заліза, щоб не створювати черги біля сервісних центрів з армії цікавих «бородатих» суб'єктів із «цеглинами» в руках.
Початкове знайомство з технологією призвело до мене в деяке замішання. Купа незнайомих мені утиліт, нові терміни, незрозумілі трактування… Я вирішив не мучитися і написав на обох ресурсах, що готовий заплатити тому, хто допоможе відкрити приховані від мене меню. Для цього необхідно було покопатися в асемблерному коді, прибрати кілька перевірок, прошити патчений біос і у вас повне меню вашого біосу.
Так я чекав тиждень, а заробити ніхто не схотів… ну чи не зміг.
Взявши себе в руки, я вирішив сам розібратися, як цей біос працює і зробити патч самому. Через два тижні і за допомогою російської спільноти IXBT я написав свій перший патч до біосу мого тестового ноутбука. Схрестивши пальці на руках і із завмиранням серця я прошив свій ноутбук.
Ви пам'ятаєте у кудлаті роки ми прошивали свої системні блоки новими біосами для материнських плат? Тоді на екрані красувався напис, мовляв, ні в якому разі не вимикайте комп'ютер до закінчення прошивання? Були випадки, коли за дивним збігом обставин саме в той момент відключалася електрика… У результаті отримували велику нефункціональну скриньку. Що робилося далі – історія замовчує.
Мій ноутбук не ввімкнувся. Перебої з електрикою з батареєю йому не страшні. Але я щось зробив неправильно. Душевному розладу не було меж. На мою велику радість виявилося, що біос має функцію recovery і шляхом нехитрих комбінацій клавіш і заздалегідь підготовленої флешки ноутбук можна оживити.
Я пішов іншим шляхом: пропатчив ті місця, які не могли вплинути на функціонал біосу, а точніше замінив логотип. Знову прошив і знову отримав цеглу.Розмірковуючи і радячись із досвідченими ділками у цій справі, ми дійшли висновку, що сучасні UEFI біоси мають вторинну перевірку на контрольну суму образу прошивки. Перша перевірка відбувається, коли ви намагаєтеся прошити, а друга коли біос запускається. Якщо в першому випадку я також пропатчив прошивальник, щоб він не перевіряв контрольну суму, то другу перевірку мені не подолати, оскільки вона зашита у самому залізі.
На даний момент маємо наступне: Можна патчити біоси EFI і не можемо UEFI. Мій, звичайно, другий випадок. Знову довгі пошуки в інтернеті і натикаюся на статтю Enable VT on InsydeH2O заснований Sony Vaio laptops, the EFI way.
Суть методу проста: ви завантажуєтеся в EFI режим за допомогою спеціального завантажувача та отримуєте доступ до VSS пам'яті, де налаштування вашого біосу та зберігаються. Я протестував що на моєму ноутбуці це працює, знову відкрив чудовий дизассемблер IDA, скачав останні специфікації та в повному озброєнні почав потрошити свій біос.
Успішним результатом двотижневої роботи стало випотрошене меню
╔══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╗ ║ FormSet: 'Main' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╝ ┌───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┐ │ Form Name: 'Main' [ ID: '0x0001' ]│ └───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┘ ┌- Grayout IF: | Question [ID: '0x08'] == 0x02 | Question [ID: '0x07'] == 0x01 | AND expression └- END IF Grayout; Time: 'System Time' [ QuestionId: '0x01', VarStore: '0xffff', Help: ' selects field.' ] Default value: '00:00:00', Type: 0x05 Date: 'System Date' [ QuestionId: '0x02', VarStore: '0xffff', Help: 'selects field.' ] Default value: '2010/05/01', Тип: 0x06 ┌- Grayout IF: | EQ == TRUE | Text: 'Notebook Model' Default: '[Not Detected]' Help: ' ' | Text: 'Product Number' Default: '[Not Detected]' Help: ' ' | Text: 'System Board ID' Default: '[Not Detected]' Help: ' ' | Text: 'Born On Date' Default: '[Not Detected]' Help: ' ' | Text: 'Processor Type' Default: '[Not Detected]' Help: ' ' | ┌- Suppress IF: | | Question [ID: '0x06'] == 0x00 | | Text: 'Processor Speed' Default: '[Not Detected]' Help: ' ' | └- END IF Suppress; | Text: 'Total Memory' Default: '[Not Detected]' Help: ' ' | Text: 'BIOS Version' Default: 'Fake Data' Help: ' ' | Text: 'BIOS Vendor' Default: 'Insyde' Help: ' ' | Text: 'Serial Number' Default: '[Not Detected]' Help: ' ' | Text: 'UUID Number' Default: '[Not Detected]' Help: ' ' | Text: 'Product configuration ID' Default: '[Not Detected]'Help: '' | Text: 'System Board CT Number' Default: 'C AAAA RR SS WW XXX' Help: ' ' | Text: 'Factory installed OS' Default: '[Not Detected]' Help: ' ' | ┌- Suppress IF: | | Question [ID: '0x05'] == 0x00 | | Text: 'Primary Battery SN' Default: 'N/A' Help: ' ' | └- END IF Suppress; | ┌- Suppress IF: | | Question [ID: '0x04'] == 0x00 | | Text: 'Secondary Battery SN' Default: '' Help: ' ' | └- END IF Suppress; | | | ┌- Suppress IF: | | EQ == TRUE | | | | | └- END IF Suppress; └- END IF Grayout; Reference: 'System Log' [ FormID: '0x0540', QuestionId: '0x03', VarStore: '0xffff' ] ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┐ │ Form Name: 'System Log' [ ID: '0x0540' ]│ └───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┘ Subtitle: 'System Log' Action: ' ' [ QuestionId: '0xfffe', VarStore: '0xffff', Help: View the system diagnostic failure results.] Text: 'Result:' Default: 'Time:' Help: 'View system diagnostic failure results.' ┌- Grayout IF: | EQ == TRUE | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' └- END IF Grayout; Text: ' ' Default: ' ' Help: 'View the system diagnostic failure results.'╔══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╗ ║ FormSet: 'Security' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╝ ┌───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┐ │ Form Name: 'Security' [ ID: '0x0001' ]│ └───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┘ Password: Administrator Password [ VarStore: '0x9d', Help: 'Administrator Password controls access to the setup utility.'] Password: Power-On Password [ VarStore: '0xa1', Help: 'Power-On Password controls access to the system at boot.'] ╔══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╗ ║ FormSet: 'Main' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╝ ┌───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┐ │ Form Name: 'Main' [ ID: '0x0001' ]│ └───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┘ ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'InsydeH2O Version' Default: 'Fake Data' Help: ' ' ┌- GrayoutIF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'System Memory Speed' Default: '[Not Detected]' Help: ' ' ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'Total Memory' Default: '[Not Detected]' Help: ' ' ┌- Grayout IF: | Question [ID: '0x05'] == 0x02 | Question [ID: '0x04'] == 0x01 | AND expression └- END IF Grayout; Time: 'System Time' [ QuestionId: '0x01', VarStore: '0xffff', Help: 'This is the help for the hour, minute, second field. Valid range is from 0 to 23, 0 to 59, 0 to 59. INCREASE/REDUCE : +/-.' ] Default value: '00:00:00', Type: 0x05 Date: 'System Date' field. Valid range is from 1 to 12, 1 to 31, 2000 to 2099.(Error error checking will be done against month/day/year combinations that are not supported.) INCREASE/REDUCE : +/-.' ] Default value: '05/01/2011', Тип: 0x06 Дія: 'Про цей Software' [ QuestionId: '0x1059', VarStore: '0xffff', Help: ] ┌- Suppress IF: | LIST [ID: '0x04'] in ('0x00','0x01') | Вибрати варіант: 'Debug Reclaim' [ VarStore: '0x1d7', QuestionId: '0x03', Help: ' '] | Option: 'Enabled' [ Value: '1' Default: 'false' Type: 'int8' ] | Option: 'Disabled' [ Value: '0' Default: 'true' Type: 'int8' ] └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ╔══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╗ ║ FormSet: 'Advanced' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚══════════════════════════ ════════════════════════════ ═══════════════════════════ ═══════════════════════════╝ ┌───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┐ │ Form Name: 'Advanced' [ ID: '0x0001' ]│ └───────────────────────────────────────────────── ───────── ────────────────────────────────────────────────── ────────┘ Reference: 'Boot Configuration' [ FormID: '0x0021', QuestionId: '0x01', VarStore: '0xffff' ] Reference: 'Peripheral Configuration' [ FormID: '0x0022', QuestionId: '0x02', VarStore: Reference: 'IDE Configuration' [ FormID: '0x0023', QuestionId: '0x03', VarStore: '0xffff' Reference: 'Thermal Configuration' [ FormID: '0x0024', QuestionId: '0x04', VarStore: '0xffff' FormID: '0x0025', QuestionId: '0x05', VarStore: '0xffff' ] Reference: 'USB Configuration' [ FormID: '0x0026', QuestionId: '0x06',VarStore: '0xffff' ] Reference: 'Chipset Configuration' [ FormID: '0x0027', QuestionId: '0x07', VarStore: '0xffff' ] Reference: 'ACPI Table/Features Control' [ FormID: '0x0028', ' 0x08', VarStore: '0xffff' ] Reference: 'PCI Express Configuration' [ FormID: '0x0030', QuestionId: '0x09', VarStore: '0xffff' ] Reference: 'Intel(R) Anti-Theft Technology Support' [ FormID: '0x0038 QuestionId: '0x0a', VarStore: '0xffff' ] Reference: 'Extended ICC' [ FormID: '0x1cc0', QuestionId: '0x0b', VarStore: '0xffff' ] Reference: 'DPTF Configuration' [ FormID: '0x3610', QuestionId: '0x0c '0xffff'] Reference: 'Intel(R) Smart Connect Technology Configuration' [FormID: '0x1e00', QuestionId: '0x0d', VarStore: '0xffff' ]
Я успішно завантажився в завантажувач з доступом до VSS пам'яті, прописав потрібні мені змінні і ввімкнув чи вимкнув чогось мені не вистачало або заважало в моїй роботі.
Ну а тепер про те, як це зробити вам.
Підготовка інструментарію
1. Необхідно завантажити PhoenixTool із цього форуму, де постійно викладається поточна версія. Він вам буде потрібен, щоб розкласти файл прошивки на його складові.
2. Вам потрібний perl. Якщо у вас є UNIX система, все просто, якщо ні, то ActivePerl або Cygwin під Windows.
3. Вам потрібний останній біос від вашого виробника.
4. Будь-який архіватор.
Отримання способу прошивки
1. Відкрийте архіватором exe файл вашої прошивки, знайдіть там файл із розширенням bin або fd і розпакуйте у зручне для вас місце. Найкраще в окрему папку.
2. Запустіть PhoenixTool і спробуйте відкрити файл прошивки.
3. Якщо при спробі відкрити ви бачите таке вікно
то швидше за все ваш образ від виробника зашифровано. Decrypt метод поки не придумали, але це лише справа часу. Якщо це ваш випадок, переходьте до наступного кроку, якщо ні, то пропускаємо і переходимо до пункту 8.
4. Розпакуйте програму прошивання у зручну для вас папку та запустіть оновлення вашого біосу до останньої версії.
5. Після того, як ваш ноутбук перезавантажиться, знову зайдіть у цю папку і знайдіть там файл platform.ini
6. Відкрийте текстовим редактором і зробіть наступні зміни:
[BackupROM] Flag=1 FilePath=c: FileName=0183AF24.BIN
Це дозволить вам прошити ще раз ваш біос, але при цьому буде створено резервну копію поточного біосу.
7. Після перезавантаження відкрийте отриману резервну копію за допомогою PhoenixTool
8. Через пару секунд ви повинні будете побачити віконце схоже на це:
9. Тепер можете закрити віконце.
10. У папці, де у вас лежав образ, з'явиться папка DUMP, а в ній безліч файлів. Нас цікавить, який починається на FE3542FE і має найбільший розмір:
11. Тепер завантажуємо вихідний код мого
#!/usr/bin/perl # # Copyright (c) 2013 Nurlan Mukhanov (aka Falseclock) # # Please inform me if you found error/mistakes or enhance this script. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), до deal # in the Software без обмеження, включаючи без обмеження права # використовувати, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to Permit persons to what the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR PARTICULAR PURPOSE AND N. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN ACTIVE OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECT OTHER DEALINGS IN THE # SOFTWARE.$| = 1 use strict; use utf8; $DEFAULT_LANGUAGE @STRINGS @TABS %TYPES); # $IFR_PACKAGE_SIG = '$IFRPKG!'; ################################################## ####### $DEFAULT_LANGUAGE = 'en-US'; ---------------- MAIN PROGRAMM ----------------------------# open($ROM, " #------------- -------------------------------------------------- ----- # 1. Search IFR віртуальний пакет my $header_offset = &IFR_PACKAGE_SIG(); (!$header_offset); #------------------------------------------- ------------------------- # 2. Search EFI_HII_PACKAGE_HEADERs @EFI_HII_PACKAGES = &EFI_HII_PACKAGES($header_offset); #print Dumper(\@EFI_HII_PACKAGES); head #------------------------------------------------- ------------------- # 3. Parse EFI_HII_PACKAGE_STRINGS #print "Parsing language tables..\n"; %LANGUAGES = &EFI_HII_PACKAGE_STRINGS(); languages: %s\n", scalar keys %LANGUAGES, join ', ', sort keys %LANGUAGES; @STRINGS = #print Dumper(\@STRINGS); <$LANGUAGES->> foreach (keys %LANGUAGES); %length) < next if $_ eq 'en-US'; \n", $length; $warn = 1; > printf "\t\t%s: (%d)\n", $_, $length - $length; > > =cut #---------------------------- ---------------------------------------- # 4.FORM packages parsing @EFI_HII_PACKAGE_FORMS = &EFI_HII_PACKAGE_FORMS(); close ($ ROM); #------------------------------------------------- ----------------------# #-------------------------- ---------------------------------------------# sub str2hex < return unpack ("H *", shift); >sub dec2bin < return unpack("B32", pack("N", shift)); >sub bin2dec < return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); > sub oplength < my $data = shift; my $length = unpack("C", $data); return bin2dec(substr &dec2bin($length), -7); >sub EFI_IFR < my $data = shift; my $ length = length ($ data); my @opcodes; #printf "length: %d, hex: %s\n", length($data), join ('', unpack("(H2)*",substr($data,0,10))); my $i = 0; while ($i < $length) < my %op; # Reading OPCODE $op= unpack("C", substr($data,$i,1)); $i++; # Reading length $op = oplength(substr($data,$i,1)); $i++; # Reading payload $op = substr($data,$i,$op-2); $i += $op -2; # Setting indent #$op = $INDENTS; push @opcodes, \% op; # printf "Opcode: %02X, Length: %d\n", $op, $op; # my $www =; > return \ @ opcodes; > sub EFI_HII_PACKAGE_FORMS < my @forms = (); foreach (@EFI_HII_PACKAGES) < my %pkg = %; my %form; if ($_-> == 0x02) < # printf "EFI_HII_PACKAGE_FORMS offset int : %d, hex: (0x%08x)\n",$pkg,$pkg; # Skeep 4 bytes of FULLL_PACKAGE_LENGTH my $FORM_PACKAGE_LENGTH = unpack('I', (data($pkg + 4, 3).pack("H",0)) ); my $FORM_PACKAGE_TYPE = unpack('C', (data($pkg + 7, 1)) ); $form = $FORM_PACKAGE_LENGTH; $form = $FORM_PACKAGE_TYPE; #printf "Form length: %s, type: %s\n", $FORM_PACKAGE_LENGTH, $FORM_PACKAGE_TYPE; my $ op_offset = $ pkg + 8; my $op_length = ($FORM_PACKAGE_LENGTH - 4); $form = &EFI_IFR(data($op_offset,$op_length)); $form = $_; push @forms, \% form; > > &EFI_IFR_FORM_SET(\@forms); #print Dumper(\@forms); return @forms; > sub EFI_IFR_FORM_SET < my $forms = shift; my @forms = @; #print Dumper(\@forms); foreach my $form (@forms) < my %form = %; my @ops = @; foreach (@ops) < my %op = %; &EFI_IFR_PRINT(\%op,\%); > print"\n"; > > sub fguid < my $guid = shift; my ($a, $b, $c, $d, $e); $a = unpack("H*",scalar reverse(substr($guid,0,4))); $b = unpack("H*",scalar reverse(substr($guid,4,2))); $c = unpack("H*",scalar reverse(substr($guid,6,2))); $d = unpack("H*",substr($guid,8,2)); $e = unpack("H*",substr($guid,10,6)); return sprintf("%s-%s-%s-%s-%s",$a,$b,$c,$d,$e); >sub EFI_HII_PACKAGE_STRINGS < my %pkg; foreach (@EFI_HII_PACKAGES) < % pkg = % and last if ($_-> == 0x04); > my $reader = 4; # current reading offset my %languages; while ($reader < $pkg) # read until we in package < my $LANG_PACKAGE_LENGTH = unpack('I', (data($pkg+ $reader, 3).pack("H",0)) ); my $LANG_PACKAGE_OFFSET = $pkg + $reader; #print $LANG_PACKAGE_LENGTH,"\n"; if ($LANG_PACKAGE_LENGTH) < $reader += (3 + 1 + 42); my $LANG_PACKAGE_NAME = (data($pkg+ $reader, 5)); # skip 00 - end of header $languages = $LANG_PACKAGE_OFFSET, 'length' => $LANG_PACKAGE_LENGTH, 'name' => $LANG_PACKAGE_NAME >; > $reader += $LANG_PACKAGE_LENGTH - (3 + 1 + 42); > foreach (keys %languages) < my %lang = %<$languages>; #print "Reading language from offset: ".$lang."\n"; #print "Language name is: ".$lang."\n"; my $table = data($lang+46+6, $lang - 46 - 6); my @table = unpack('(H2)*',$table); # Оскільки початок слова містить прапор типу рядка # і ми не можемо зробити спліт всього рядка, будемо читати побайтно my @strings; my $position=0; my $word = undef; my $eof = 0; my $last = undef; my $skip = 0; my $word_start = 0; push @strings, undef; # MEMEORY OFFSET CAN NOT BE 0 my %EFI_HII_STRING_BLOCK = map < $_ =>1 > ('10', '11', '12', '13', '15', '16', '17', '22 ', '30', '31', '32', '40'); for (my $l=0; $l < $#table; $l++) < my $byte = $table[$l]; if ( exists($EFI_HII_STRING_BLOCK) && !$word && $last ne '14') < print STDERR "Unexpected EFI_HII_STRING_BLOCK ->BlockType = $byte found!\n"; printf STDERR "String offset: %d (0x%08x)\n", $lang + $l, $lang + $l; exit 1; > $last = $byte and $word_start = 1 and next if ($byte eq '14'); #EFI_HII_SIBT_STRING_UCS2 if ($byte eq '21' && !$word && !$word_start ) # EFI_HII_SIBT_SKIP2 < #print "SKEEP FOUND\n"; $skip = hex($table[$l+1]); # number of skips $l += 2; # pass reading @table for next 2 bytes while ($skip) < push @strings, "EFI_HII_SIBT_SKIP2-$skip"; $skip--; >next; > if ($byte eq '20' && !$word && !$word_start ) # EFI_HII_SIBT_DUPLICATE < push @strings, $strings[$#strings]; $l += 3; next; ># If word end if ($byte eq '00' && $table[$l+1] eq '00') < #print $word."\n"; push @strings, $word; $word = undef; $word_start = 0; $l++; next; >$word .= decode('utf-16le',pack("H*",$byte).pack("H*",$table[$l+1])); $l++; > $languages-> = \@strings; > return %languages; #print Dumper(\%languages); > sub EFI_HII_PACKAGES < my $offset = shift; $ offset + = 8; my @ address = (); while (1) < my $ data = data ($ offset, 8); my $hex = unpack("H*", $data); last if $hex !~ /^[ABCDEF0-9]000000$/i; if ($hex =~ /^[ABCDEF0-9]8001000000$/i) < push @address, substr ((join '', (reverse ($hex =~ m/../g))), 10); #my $address = substr ((join '', (reverse ($hex =~ m/../g))), 10); #printf "$address - %s\n", hex($address); >$offset += 8; > my @ pkg = (); foreach (@address) < my % pkg; $ pkg = hex ($_); $ pkg = $_; $ pkg = unpack ( "I *", data (hex ($_), 4)); $pkg = unpack("C", data( hex($_)+7 , 1 )); $pkg = $EFI_HII_PACKAGE_TYPE<$pkg>->; $pkg = $EFI_HII_PACKAGE_TYPE<$pkg>->; push @ pkg, \ % pkg; > return @ pkg; > sub IFR_PACKAGE_SIG < my $i = 0; my $ offset = 0; my $seek = undef; my @ sig = split //, $ IFR_PACKAGE_SIG; while ($i if ($offset) # just to save CPU time < if (scalar grep $byte eq $_, @sig) < $seek .= $byte if ($IFR_PACKAGE_SIG =~ $seek.$byte ); last if ($IFR_PACKAGE_SIG eq $seek ); >else < $offset = 0; = undef; >> $i++; offset = shift; $data, $length; return $data;push @TABS, shift; return '' x (scalar @TABS - 1); >sub TabClose < my $length = scalar @TABS; my $return = ""; if ($length) < my $opcode = pop @TABS; if ($opcode == $EFI) < $return = sprintf "\xE2\x94\x94- END IF Grayout;\n"; >elsif ($opcode == $EFI) < $return = sprintf "\xE2\x94\x94- END IF Suppress;\n"; >else < $return = "What the fuck?"; >> return $return; > sub EFI_IFR_PRINT < my $op = shift; my $package = shift; my $TabSpace = ''; my %op = %; my %package = %; if ($op != $EFI and scalar @TABS) < if ($op== $EFI or $op == $EFI) < $TabSpace = sprintf "|"; >elsif ( $op == $EFI ) < $TabSpace = sprintf "%s",'| 'x (scalar @ TABS - 1); >else < $TabSpace = sprintf "%s",'| ' x (scalar @ TABS); >print $TabSpace; > if ($op == $EFI) < # 0x0E my $Guid = substr($op,0,16); my $FormSetTitle = unpack("S2",substr($op,16,2)); my $ Help = unpack ( "S2", substr ($ op, 18,2)); my $ Flags = substr ($ op, 20,2); my $ClassGuid = substr($op,22,16); printf "\nE2x95x94%sE2x95x97\n","xE2x95x90"x116; printf "\x\x\x FormSet: '%-62sGUID: %s \xE2\x95\x91\n", ($STRINGS[$FormSetTitle]."'", fguid($Guid)); printf "\x\x\x%s\x\x\x\n","\x\x\x"x116; if ($STRINGS[$Help] and $STRINGS[$Help] ne ' ') < printf " \Help text: '%s'\n", $STRINGS[$Help]; >> elsif ($op == $EFI) < # 0x5F my $Guid = substr($op,0,16); my $Data = unpack("H*", substr($op,16)); #printf "\x\x\x Operation data: '%-55sGUID: %s \xE2\x95\x91\n", $Data, &fguid($Guid); > elsif ($op == $EFI) < # 0x5C my $DefaultId = unpack("S2", substr($op,2,2)); my $DefaultName = unpack("S2", substr($op,2,2)); #printf "EFI_IFR_DEFAULTSTORE_OP, length: %d, DefaultId: %s, DefaultName: %s \n",length($op),$DefaultId,$DefaultName ; > elsif ($op == $EFI) < # 0x24 # typedef struct _EFI_IFR_VARSTORE < # EFI_IFR_OP_HEADER Header; # EFI_GUID Guid; # EFI_VARSTORE_ID VarStoreId; # UINT16 Size; # UINT8 Name[1]; # >EFI_IFR_VARSTORE; #printf "EFI_IFR_VARSTORE_OP, length: %d \n",length($op); my $Guid = substr($op,0,16); my $VarStoreId = unpack("S2",substr ($ op, 16,2)); my $Size = unpack("S2", substr($op,18,2)); my $ Name = substr ($ op, 20,12); printf "\x\x\x VarStore Id: '0x%x', Size: '%s', Name: '%s' GUID: %s \x\x\x\n", $VarStoreId, $Size, $Name, &fguid($Guid); printf "E2x95x9A%sE2x95x9Dn", "xE2x95x90"x116; > elsif ($op == $EFI) < # 0x01 my $FormId = unpack("S2",substr($op,0,2)); my $FormTitle = unpack("S2",substr($op,2,2)); printf "\x\x\x%s\x\x\x\n","\x\x\x"x116; printf "\x\x\x Form Name: '%-86s [ ID: '0x%04x' ]\x\x\x\n", ($STRINGS[$FormTitle]."'", $FormId); printf "\x\x\x%s\x\x\x\n","\x\x\x"x116; > elsif ($op == $EFI) < # 0x19 printf "%s\x\x\x- Grayout IF:\n",TabSpace($op); > elsif ($op == $EFI) < # 0x0A printf "%s\xE2\x94\x8C- Suppress IF:\n",TabSpace($op); > elsif ($op == $EFI) < # 0x29 printf "%s",&TabClose($op); > elsif ($op == $EFI) < # 0x12 my $QuestionId = unpack("S2",substr($op,0,2)); my $Value = unpack("S2",substr($op,2,2)); printf "Question [ ID: '0x%02x' ] == 0x%02x\n", $QuestionId, $Value,; > elsif ($op == $EFI) < # 0x15 printf "AND expression\n"; >elsif ($op == $EFI) < # 0x02 my $Prompt = unpack("S2",substr($op,0,2)); my $ Help = unpack ( "S2", substr ($ op, 2,2)); printf "Subtitle: '%s'\n", ($STRINGS[$Prompt]) if defined $STRINGS[$Prompt] and $STRINGS[$Prompt] ne ' '; > elsif ($op == $EFI) < # 0x5B my $DefaultId = unpack("S2",substr($op,0,2)); my $Type = unpack("C",substr($op,2,1)); my $value; if ($Type == 0) < $value = unpack("C",substr($op,3,1)); > elsif ($Type == 1) < $value = unpack("S2",substr($op,3,2)); > elsif ($Type == 2) < $value = unpack("S2",substr($op,3,2)); > elsif ($Type == 5) < $value = sprintf("%02d",unpack("C",substr($op,3,1))).':'.sprintf("%02d",unpack("C",substr($op,4,1) ))).':'.sprintf("%02d",unpack("C",substr($op,5,1)))); > elsif ($Type == 6) < $value = unpack("S2",substr($op,3,2)).'/'.sprintf("%02d",unpack("C",substr($) op,5,1))).'/'.sprintf("%02d",unpack("C",substr($op,6,1)))); > else < $value = unpack("S*",substr($op,3,4)); > printf " Default value: '%s', Type:0x%02x\n",$value, $Type; > elsif ($op == $EFI) < # 0x46 printf "EQ == TRUE\n"; >elsif ($op == $EFI) < # 0x03 my $Prompt = unpack("S2",substr($op,0,2)); unpack("S2",substr($op,2,2)); [$TextTwo] if (defined $STRINGS[$TextTwo]); printf "Text: '%-32.32sDefault: '%-32.32sHelp: '%s'\n", $STRINGS[$Prompt]."'", $t2."'", $STRINGS[$Help]; > elsif ($op == $EFI) < # 0x45 my $Value = $op; printf "VALUE = %s\n", unpack("S *", $Value) ($op == $EFI) < # 0x2F printf "EQUAL expression\n"; >elsif ($op == $EFI) < # 0x14 my $QuestionId = unpack("S2", substr($op,0,2 ));; unpack("(S4)*", substr($op,4)); @ValueList = map @ValueList; ",", @ValueList; > elsif ($op == $EFI) < # 0x16 printf "OR expression\n"; >elsif ($op == $EFI) < # 0x17 printf "NOT expression \n"; >elsif ($op == $EFI) <# 0x1b my $Prompt = unpack("S2",substr($op,0 ,2)); my $ Help = unpack ( "S2", substr ($ op, 2,2)); my $QuestionId = unpack("S2",substr($op,4,2)); my $VarStoreId = unpack("S2",substr($op,8,2)); #my $VarName = unpack("S2",substr($op,8,1)); #my $VarOffset = unpack("S2",substr($op,9,1)); #my $Flags = unpack("S2",substr($op,9,1)); printf "Time: '%s' [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: '%s' ]\n", $STRINGS[$Prompt],$QuestionId,$VarStoreId,$ STRINGS[$Help] ; > elsif ($op == $EFI) <# 0x1A my $Prompt = unpack("S2",substr($op,0,2)); my $ Help = unpack ( "S2", substr ($ op, 2,2)); my $QuestionId = unpack("S2",substr($op,4,2)); my $VarStoreId = unpack("S2",substr($op,8,2)); #my $VarName = unpack("S2",substr($op,8,1)); #my $VarOffset = unpack("S2",substr($op,9,1)); #my $Flags = unpack("S2",substr($op,9,1)); printf "Date: '%s' [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: '%s' ]\n", $STRINGS[$Prompt],$QuestionId,$VarStoreId,$ STRINGS[$Help] ; > elsif ($op == $EFI) <# 0x07 my $Prompt =unpack("S2",substr($op,0,2)); $op,4,2)); unpack("C",substr($op,10,1)); $op,12,1)); unpack("C",substr($op,14,1)); printf "Number question: Prompt: %s; if $Prompt; printf "%s \x\x\x- [ QuestionId: '0x%02x', VarStore: '0x%02x' , Type: '%02x', MinValue: '%d', MaxValue: '%d', Step: '%d' ]\n",($TabSpace,$QuestionId, $VarStoreId, $Type ,$MinValue, $MaxValue, $Step) if $Prompt;; == $EFI) <# 0x0F my $Prompt = unpack("S2",substr($op,0,2)); my $QuestionId = unpack("S2",substr($op,4,2)); unpack("S2",substr($op,8,2)); FormID: '0x%04x', QuestionId: '0x%02x', VarStore: '0x%02x' ]\n", $STRINGS[$Prompt], $FormId, $QuestionId, $VarStoreId; > elsif ($op == $EFI) <# 0x0C my $Prompt = unpack("S2",substr($op,0,2)); my $Help = unpack("S2",substr($op,2,2)); unpack("S2",substr($op,4,2)); ($op,8,1)); printf "Action: '%-32.32s [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: %s ] \n", ($STRINGS[$Prompt]."'", $QuestionId, $VarStoreId, $STRINGS[$Help]); #printf "%s \x \x\x- \n", ($TabSpace if $STRINGS[$Prompt]; > elsif ($op == $EFI) <# 0x08 my $Prompt = unpack("S2", substr($op,0,2)); S2", substr($op,8,2)); printf "Password: %-32.32s [ VarStore: '0x%02x', Help: '%s']\n", ($STRINGS[$Prompt], $VarStoreId, $STRINGS[$Help]); > elsif ($op == $EFI) < # 0x05 my $Prompt = unpack(" S2", substr($op,0,2)); my $Help = unpack("S2", substr($op,2,2)); my $QuestionId = unpack("S2",substr ($ op, 4,2)); my $VarStoreId = unpack("S2", substr($op,8,2)); # my $ VarOffset = unpack ( "S2", substr ($ op, 4,2)); printf "Select option: '%-32.32s[ VarStore: '0x%02x', QuestionId: '0x%02x', Help: '%s']\n", ($STRINGS[$Prompt]."'", $VarStoreId, $QuestionId (defined $STRINGS[$Help] ? $STRINGS[$Help] : '')); > elsif ($op == $EFI) < # 0x09 my $Option = unpack("S2", substr($op,0,2)); my $Flags = str2hex(substr($op,2,1)); my $Type = unpack("C", substr($op,3,1)); my $Value = unpack("C*", substr($op,4,8)); # oid, value, flags, key = struct.unpack("."'"); > else < printf "-->UNKNOWN OPCODE: %02X, length: %d\n", $op, $op; ; > > sub SPECIFICATION_LOAD < $EFI= 0x01; 0x03; $EFI = 0x0 = $EFI=0x07 0x0D; $EFI = 0x0E; $EFI = 0x10; $EFI = 0x19; 0x1A; $EFI = 0x20; 0x24; $ EFI = 0x25; $EFI = 0x26; $EFI = 0x30; 0x31; $EFI = 0x38; 0x3B; $EFI = 0x3C; $EFI = 0x3D; $EFI = 0x3F; $ EFI = 0x43; $ EFI = 0x44; $ EFI = 0x45; $ EFI = 0x46; $ EFI = 0x47; $ EFI = 0x48; $ EFI = 0x49; $ EFI = 0x4A; $ EFI = 0x4B; $ EFI = 0x4C; $ EFI = 0x4D; $ EFI = 0x4E; $ EFI = 0x4F; $ EFI = 0x50; $ EFI = 0x51; $ EFI = 0x52; $ EFI = 0x53; $ EFI = 0x54; $ EFI = 0x55; $ EFI = 0x56; $ EFI = 0x57; $ EFI = 0x58; $ EFI = 0x59; $ EFI = 0x5A; $ EFI = 0x5B; $ EFI = 0x5C; $ EFI = 0x5D; $ EFI = 0x5E; $ EFI = 0x5F; $ EFI = 0x60; %EFI_HII_PACKAGE_TYPE = ( 0x00 => < name =>'EFI_HII_PACKAGE_TYPE_ALL' , text =>'Pseudo-package type' >, 0x01 => < name =>'EFI_HII_PACKAGE_TYPE_GUID' , text => 'Package type where the format of the data is specified using a GUID immediately following the package header'>, 0x02 => < >'EFI_HII_PACKAGE_FORMS' , text => 'Forms package' >, 0x04 => < name =>'EFI_HII_PACKAGE_STRINGS' , text => 'Strings package' >, 0x05 => < name =>'EFI_HII_PACKAGE_FONTS' , text => 'Fonts package' >, => < name =>'EFI_HII_PACKAGE_IMAGES' , text => 'Images package' >, 0x07 => < name =>'EFI_HII_PACKAGE_SIMPLE_FONTS' , text => 'Simplified (8x19, 16x19) Fonts package' >> 0 =>'EFI_HII_PACKAGE_DEVICE_PATH' , text => 'Бінарний-відокремлений пристрій path' >, 0x09 => < name =>'EFI_HII_PACKAGE_KEYBOARD_LAYOUT' , text => 'Застосований до позначки packx list> > =>'EFI_HII_PACKAGE_ANIMATIONS' , text => 'Animations package' >, 0xDF => < name =>'EFI_HII_PACKAGE_END' , text => 'Package types reserved for use by platform firmware implementations' >, 0xE0 => < name =>'EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN' , text => 'Package types reserved for use by platform firmware implementations' >, ); %TYPES = ( 0x00 => 'int8', 0x01 => 'int16', 0x02 => 'int32', 0x03 => 'int64', 0x04 => 'bool', 0x05 => 'time', 0x06 => ' date', 0x07 => 'string', 0x08 => 'other', ); >
12. Зберігайте його собі на комп'ютер туди, де у вас лежить файл із пункту 10 і даєте йому зручну для вас назву, наприклад uefidump.pl
13. Перейдіть в консольний режим і даєте команду perl uefidump.pl FE3542FE-C1D3-4EF8-657C-8048606FF670_2_514.ROM > uefidump.log
14. Після закінчення ви знайдете дамп меню вашого біосу у файлі uefidump.log.
Підготовка завантажувальної дискети
1. Беремо флешку, розмір не важливий.
2. Форматуємо її у FAT32
3. Створюємо структуру каталогів EFI\Boot
4. Завантажуємо BOOTX64.EFI
5. Кладемо в папку Boot
6. Перевантажуємося в BIOS, включаємо Legacy та відключаємо Secure Boot.
7. Зберігаємось і завантажуємося через флешку.
8. Після завантаження ви маєте побачити жовтий текст на чорному екрані
> Welcome to GRUB! > > Entering rescue mode. > error: file not found > grub rescue >
9. До модифікації налаштування біосу все готово.
Зміна параметрів
Для змін використовуються поля VarStore і Value. Value у лозі в десятковому варіанті, при зміні необхідно вказувати шістнадцяткове значення.
1. Допустимо вам треба змінити режим роботи диска з IDE на AHCI. Комусь це треба для хакінтошів, а хтось купив собі жорсткий жорсткий диск, а ноутбук його не бачить. Шукаємо в лог файлі щодо сабжа і знаходимо наступні рядки:
Select option: 'HDC Configure As' [ VarStore: '0x39', QuestionId: '0x1a', Help: 'Set Harddisk Controller Configure Type'] Option: 'IDE' [ Value: '0' Default: 'true' Type: ' int8' ] Option: 'AHCI' [ Value: '1' Default: 'false' Type: 'int8' ] Option: 'RAID' [ Value: '2' Default: 'false' Type: 'int8' ]
Щоб змінити налаштування, необхідно спочатку дати команду setup_var 0x39 .
Результатом цієї команди буде поточне значення цієї змінної. Щоб її змінити та поставити в AHCI, треба дати команду setup_var 0x39 0x1. Зверніть увагу, що якщо у вас стоїть Windows, то буде потрібно його переустановка, так як одного разу налаштований Windows на IDE не зможе зрозуміти, що тепер йому треба працювати з AHCI. Як варіант – попередньо завантажившись у безпечний режим підредагувати реєстр, тоді встановлювати заново нічого не доведеться.
2. Наприклад, вам потрібно заборонити дискретний відеоадаптер. За цей пункт відповідає наступні рядки:
Select option: 'Special Features' [ VarStore: '0x1e6', QuestionId: '0x92', Help: 'Enable Switch Graphic Function'] Option: 'Disabled' [ Value: '0' Default: 'false' Type: 'int8' ] Option: 'Enabled' [ Value: '1' Default: 'true' Type: 'int8' ]
Команда setup_var 0x1e6 0x0 відключить дискретний і працюватиме лише вбудований.
3. Бажаємо щоб Numlock не включався
Select option: 'Numlock' [ VarStore: '0x08', QuestionId: '0x10', Help: 'Selects Power-on state for Numlock'] Option: 'Off' [ Value: '0' Default: 'false' Type: ' int8' ] Option: 'On' [ Value: '1' Default: 'true' Type: 'int8' ]
Команда setup_var 0x08 0x0 відключить його під час завантаження.
Епілог
Даний посібник складено як воно є і тому що я роблю це на практиці. Я не несу відповідальності за зіпсовані материнські плати чи втрачену інформацію. Все що ми можете зробити - ви робите на свій страх та ризик.
Якщо щось пішло не так, то першим рятувальним колом може бути вилучення батарейки біосу для стирання VSS пам'яті. Якщо не допомагає, то вам потрібно шукати спосіб recovery для вашого біосу. У випадку HP інструкцію можна переглянути тут. Для інших вендорів там же, але я не шукав.
Моя тема, де я ні, ні допомагаю стражденним тут. Подяки від користувачів на доказ того, що це все працює.
І останнє, не намагайтеся відключити обладнання, яке у вас є, або включити те, якого у вас немає, інакше збій ініціалізації обладнання призведе до повного краху та неможливості відновлення материнської плати.
І найостанніше, моя вам порада: перш ніж починати експериментувати з оверклокінгом та тюнінгом біосу, перевірте, що для вашого ноутбука працює спосіб відновлення біосу у разі його краху. Поки що таких випадків не було, але чи мало.
UPD 01.02.2021: У зв'язку з тим, що надходить дуже багато питань щодо потрошення, хороші люди написали готовий парсер github.com/donovan6000/Universal-IFR-Extractor
Розпаковуєте біос, знаходите файл, в якому знаходиться меню і згодовує програму.