Primeiro: por que se incomodar? Isso pode soar como um comentário malicioso e desdenhoso, mas é uma questão séria. Existem motivos legítimos para inicializar um SO de modo BIOS em um computador baseado em EFI, mas sua pergunta não apresenta motivação para isso. De uma perspectiva de programação, essa tarefa é uma dor; e como você diz que o sistema operacional de destino é o Windows 7, que suporta a inicialização no modo EFI, não está nem remotamente claro para mim que vale a pena o esforço. Além disso, existem três maneiras existentes de fazer isso, sem que um novo código seja escrito ...
A primeira maneira de fazer isso é usar o gerenciador de boot interno do seu computador. Ele deve apresentar opções para inicializar qualquer sistema operacional de modo EFI que você tenha instalado ou no modo BIOS / CSM / legado. Os detalhes de como acessar este menu variam de um computador para outro, porém, e os detalhes do que aparecerá no menu irão variar. Mais comumente, as inicializações do modo BIOS dos discos são identificadas pelo fabricante ou pelo número do modelo do disco, enquanto as entradas no modo EFI recebem nomes associados ao SO, como Windows boot manager
. O resultado do uso desse método não será exatamente o que você descreveu (ou seja, iniciar o Windows a partir do seu próprio aplicativo EFI), mas pode ser adequado às suas necessidades.
O segundo método é usar meu gerenciador de inicialização do rEFInd. Como o gerenciador de inicialização interno do computador, o rEFInd permite que você inicie Carregadores de inicialização no modo BIOS ou no modo EFI (desde que o firmware suporte ambos). Uma ressalva é que, em PCs baseados em UEFI, esse recurso está desabilitado por padrão; você deve editar refind.conf
para descomentar a linha scanfor
e garantir que hdbios
esteja entre as opções. (Se o SO de modo de BIOS de destino estiver em um disco ou CD externo, há outras palavras-chave para eles - consulte os comentários no arquivo refind.conf
para obter detalhes.) Como o gerenciador de inicialização interno, essa solução não exatamente faça o que você diz que quer, mas pode ser adequado. Além disso, você pode fazer com que seu aplicativo inicie o rEFInd, que você pode configurar com um tempo limite curto para iniciar o sistema operacional do modo BIOS por padrão. Essa abordagem teria exatamente o efeito desejado, embora o rEFInd tenha uma sobrecarga significativa, portanto, seria uma solução bastante deselegante.
rEFInd também é relevante para sua pergunta porque inclui código para fazer o que você deseja. Você deve se concentrar nos arquivos de código de origem refind/legacy.c
e EfiLib/legacy.c
. Esteja ciente, entretanto, de que o rEFInd inclui dois caminhos de inicialização no modo legado BIOS / CSM / totalmente distintos, um para Macs e outro para PCs baseados em UEFI. Como você se refere especificamente ao UEFI, é provável que você deseje o último, não o primeiro. No arquivo refind/legacy.c
, o código UEFI reside principalmente em funções cujos nomes incluem a string UEFI
; as outras funções são para o Mac. O arquivo EfiLib/legacy.c
contém o código do caminho UEFI exclusivamente; mas a maioria dessas funções são tiradas do TianoCore EDK2, então você pode não precisar duplicá-las. (Como o rEFInd é projetado para ser construído com EDK2 ou GNU-EFI, acabei extraindo muito código EDK2 para que ele possa ser construído com o GNU-EFI.) OTOH, essas funções podem ter sido modificadas a partir de suas origens EDK2 , então você pode precisar fazer mais ajustes para fazer as coisas funcionarem corretamente se você usar os originais do EDK2. Observe que o rEFInd usa a GPLv3, portanto, se você pretende distribuir seu programa, o uso do código rEFInd exigirá o uso da GPLv3 ou de uma licença compatível.
A terceira maneira de fazer o trabalho é usar o gerenciador de boot do Clover. Este é um gerenciador de boot do Hackintosh que, como rEFInd, é parcialmente derivado do mais antigo (e agora abandonado) gerenciador de inicialização do rEFIt. Como o rEFInd, o Clover inclui código para iniciar o SO do modo BIOS ; no entanto, o faz de uma maneira diferente do que o rEFInd faz. Você poderia usar o Clover como se usasse o rEFInd, seja como uma parte do caminho de inicialização ou como código de exemplo para extrair e incorporar em seu próprio programa. Embora a página Sourceforge da Clover diga que usa a licença BSD, isso não é inteiramente verdade; alguns dos arquivos de código-fonte especificam que ele usa o GPL.
Infelizmente, como você logo descobrirá se começar a examinar o código do rEFInd ou do Clover, a tarefa de iniciar um carregador de inicialização no modo BIOS a partir do EFI não é trivial; Eu não posso simplesmente jogar algumas linhas de código para você usar. Além disso, esteja ciente de que eu não escrevi este código eu mesmo; O código de rEFInd foi contribuído para o projeto por outra pessoa e, embora eu tenha lido o código de Clover, não posso afirmar que o entendi. Modifiquei um pouco o código de inicialização do BIOS no modo rEFInd, mas talvez não seja capaz de fornecer muita ajuda a você para adaptá-lo ao seu próprio programa.