По-перше: навіщо турбуватися? Це може здатися чудовим і зневажливим коментарем, але це серйозний запит. Там є законними причини для завантаження операційної системи BIOS режиму на комп'ютері EFI основи, але ваше запитання не представляє ніякої мотивації для цього. З точки зору програмування, це завдання - біль; і як ви кажете, цільова ОС - це Windows 7, яка підтримує завантаження в режимі EFI, мені навіть далеко не зрозуміло, що варто докласти зусиль. Крім того, є три існуючі способи зробити це, без нового коду.
Перший спосіб зробити це - використовувати вбудований менеджер завантаження вашого комп'ютера. У ньому повинні бути запропоновані варіанти для завантаження будь-якої ОС, встановленої в режимі EFI, або в режимі BIOS / CSM / спадщини. Однак відомості про доступ до цього меню відрізняються від комп'ютера до іншого, і деталі того, що з’явиться в меню, будуть різними. Найчастіше черевики в режимі BIOS з дисків ідентифікуються виробником або номером моделі, тоді як записи в режимі EFI надаються імена, пов'язані з ОС, наприклад Windows boot manager
. Результатом використання цього методу буде не саме те, що ви описуєте (а саме, запуск Windows із власного додатку EFI), але це може бути адекватним вашим потребам.
Другий метод - використовувати мій менеджер завантаження rEFInd. Як і вбудований менеджер завантаження комп'ютера, rEFInd дозволяє запускати завантажувачі завантажувачів у режимі BIOS або EFI (за умови, що вбудована програма підтримує обоє). Одне застереження полягає в тому, що на комп'ютерах, що базуються на UEFI, ця функція за замовчуванням відключена; ви повинні змінити, refind.conf
щоб не коментувати scanfor
рядок і переконатися, що hdbios
це один із варіантів. (Якщо цільова ОС в режимі BIOS знаходиться на зовнішньому диску або компакт-диску, є інші ключові слова для них - див. Коментарі у refind.conf
файлі для деталей.) Як і вбудований диспетчер завантаження, це рішення точно не буде.робіть те, що ви кажете, що хочете, але це може бути адекватним. Крім того, у вас може бути запуск програми rEFInd, який ви можете налаштувати за короткий час, щоб запустити ОС BI-режиму за замовчуванням. Такий підхід матиме саме той ефект, якого ви хочете, хоча rEFInd несе значні витрати, тому це було б досить неелегантним рішенням.
rEFInd також має відношення до вашого питання, оскільки він включає код, щоб робити те, що ви хочете. Ви повинні зосередитись на файлах refind/legacy.c
та EfiLib/legacy.c
вихідному коді. Будьте в курсі, що rEFInd включає два цілком різних BIOS / CSM / застарілих режимів завантажувальних шляхів, один для Mac і один для ПК на базі UEFI. Оскільки ви конкретно посилаєтесь на УЄФІ, швидше за все, хочете останнього, а не першого. У refind/legacy.c
файлі код UEFI розташований здебільшого у функціях, імена яких містять рядок UEFI
; інші функції призначені для Mac. TheEfiLib/legacy.c
файл містить виключно код шляху UEFI; але більшість цих функцій взяті з TianoCore EDK2, тому можливо вам не потрібно буде їх дублювати. (Оскільки rEFInd призначений для побудови з EDK2 або GNU-EFI, я закінчив витягнути багато коду EDK2, щоб його можна було побудувати за допомогою GNU-EFI.) , тож вам знадобиться зробити більше налаштувань, щоб правильно працювати, якщо ви використовуєте оригінали EDK2. Зауважте, що rEFInd використовує GPLv3, тому, якщо ви плануєте поширювати свою програму, для використання коду rEFInd буде потрібно використання GPLv3 або сумісної ліцензії.
Третій спосіб виконати роботу - використовувати диспетчер завантаження Clover. Це менеджер завантаження Hackintosh, який, як і rEFInd, частково походить від старого (і покинутого) менеджера завантаження rEFIt. Як і rEFInd, Clover включає код для запуску ОС BIOS-режиму; однак це робить це по-іншому, ніж те, що робить rEFInd. Ви можете використовувати Clover так само, як і rEFInd, або як фрагмент вашої завантажувальної контури, або як зразок коду для вилучення та включення у власну програму. Хоча на сторінці Sourceforge Clover зазначено, що він використовує ліцензію BSD, це не зовсім вірно; деякі файли вихідного коду вказують, що він використовує GPL.
На жаль, оскільки незабаром ви дізнаєтесь, якщо ви почнете вивчати код rEFInd або Clover, завдання запуску завантажувача BIOS-режиму від EFI нетривіально; Я не можу просто підкинути кілька рядків коду, якими ви користуєтесь. Також майте на увазі, що я сам не писав цей код; Код rEFInd внесли в проект хтось інший, і хоча я ознайомився з кодом Clover, я не можу стверджувати, що його розумію. Я трохи змінив завантажувальний код BIOS-режиму rEFInd, але, можливо, не зможу надати вам великої допомоги, адаптуючи його до вашої власної програми.