Первый: зачем? Это может звучать как грубый и пренебрежительный комментарий, но это серьезный вопрос. Есть законные причины для загрузки операционной системы BIOS режима на компьютере EFI основы, но ваш вопрос не представляет никакой мотивации для этого. С точки зрения программирования, эта задача - боль; и, как вы говорите, целевой операционной системой является Windows 7, которая поддерживает загрузку в режиме EFI, мне даже отдаленно не ясно, стоит ли это усилий. Кроме того, существует три способа сделать это без написания нового кода ....
Первый способ сделать это - использовать встроенный менеджер загрузки вашего компьютера. В нем должны быть представлены варианты загрузки любой установленной ОС в режиме EFI или в режиме BIOS/CSM/legacy. Однако информация о том, как получить доступ к этому меню, может быть разной на разных компьютерах, а информация о том, что будет отображаться в меню, будет разной. Чаще всего загрузка в режиме BIOS с дисков определяется по производителю диска или номеру модели, а записи в режиме EFI - это имена, связанные с ОС, например Windows boot manager
. Результатом использования этого метода будет не совсем то, что вы описываете (а именно, запуск Windows из вашего собственного приложения EFI), но он может соответствовать вашим потребностям.
Второй способ - использовать мой менеджер загрузки rEFInd. Как и встроенный в компьютер менеджер загрузки, rEFInd позволяет запускать загрузчики в режиме BIOS или EFI (при условии, что прошивка поддерживает оба). Одно предостережение заключается в том, что на ПК на основе UEFI эта функция по умолчанию отключена; Вы должны отредактировать refind.conf
чтобы раскомментировать строку scanfor
и убедиться, что hdbios
является одним из вариантов. (Если целевая ОС в режиме BIOS находится на внешнем диске или компакт-диске, для этого есть другие ключевые слова - подробности см. В комментариях в файле refind.conf
.) Как и встроенный менеджер загрузки, это решение не будет точно выполнять то, что вы говорите, но оно может быть адекватным. Кроме того, у вас может быть запуск приложения rEFInd, который можно настроить с коротким тайм-аутом для запуска ОС в режиме BIOS по умолчанию. Такой подход будет иметь именно тот эффект, который вы желаете, хотя rEFInd несет значительные накладные расходы, поэтому это будет довольно не элегантное решение.
rEFInd также имеет отношение к вашему вопросу, потому что он содержит код для выполнения того, что вы хотите. Вы должны сосредоточиться на файлах исходного кода refind/legacy.c
и EfiLib/legacy.c
. Имейте в виду, однако, что rEFInd включает в себя два совершенно разных пути загрузки BIOS/CSM/legacy-mode, один для Mac и один для ПК на основе UEFI. Поскольку вы имеете в виду именно UEFI, скорее всего, вы хотите второе, а не первое. В refind/legacy.c
код UEFI находится в основном в функциях, имена которых включают строку UEFI
; другие функции для Mac. EfiLib/legacy.c
содержит исключительно код пути UEFI; но большинство этих функций взято из TianoCore EDK2, поэтому вам может не понадобиться дублировать их. (Поскольку rEFInd предназначен для сборки либо с EDK2, либо с GNU-EFI, я закончил тем, что извлек большую часть кода EDK2, чтобы его можно было собрать с помощью GNU-EFI.) OTOH, эти функции могли быть изменены по сравнению с оригинальными EDK2, поэтому вам может потребоваться дополнительная настройка для правильной работы, если вы используете оригиналы EDK2. Обратите внимание, что rEFInd использует GPLv3, поэтому, если вы собираетесь распространять свою программу, использование кода rEFInd потребует использования GPLv3 или совместимой лицензии.
Третий способ сделать это - использовать менеджер загрузки Clover. Это менеджер загрузки Hackintosh, который, как и rEFInd, частично получен из более старого (и теперь заброшенного) менеджера загрузки rEFIt. Как и rEFInd, Clover включает код для запуска ОС в режиме BIOS; однако это происходит не так, как rEFInd. Вы можете использовать Clover так же, как вы используете rEFInd, либо как часть вашего пути загрузки, либо как пример кода для извлечения и включения в вашу собственную программу. Хотя на странице Sourceforge Clover говорится, что она использует лицензию BSD, это не совсем так; некоторые файлы исходного кода указывают, что он использует GPL.
К сожалению, как вы вскоре узнаете, если вы начнете просматривать код rEFInd или Clover, задача запуска загрузчика в режиме BIOS из EFI нетривиальна; Я не могу просто бросить несколько строк кода для вас, чтобы использовать. Также помните, что я сам не писал этот код; Код rEFInd был внесен в проект кем-то еще, и хотя я просмотрел код Кловера, я не могу утверждать, что понял его. Я немного изменил загрузочный код rEFInd в режиме BIOS, но, возможно, я не смогу оказать вам большую помощь в адаптации его к вашей собственной программе.