mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-12-23 11:56:21 +00:00
1. Optimization for WIMBOOT mode.
2. Add WIMBOOT for UEFI mode.
This commit is contained in:
105
wimboot/wimboot-2.7.3/src/efimain.c
Normal file
105
wimboot/wimboot-2.7.3/src/efimain.c
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* EFI entry point
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "wimboot.h"
|
||||
#include "cmdline.h"
|
||||
#include "efi.h"
|
||||
#include "efifile.h"
|
||||
#include "efiblock.h"
|
||||
#include "efiboot.h"
|
||||
|
||||
/**
|
||||
* Process command line
|
||||
*
|
||||
* @v loaded Loaded image protocol
|
||||
*/
|
||||
static void efi_cmdline ( EFI_LOADED_IMAGE_PROTOCOL *loaded ) {
|
||||
size_t cmdline_len = ( loaded->LoadOptionsSize / sizeof ( wchar_t ) );
|
||||
char cmdline[ cmdline_len + 1 /* NUL */ ];
|
||||
const wchar_t *wcmdline = loaded->LoadOptions;
|
||||
|
||||
/* Convert command line to ASCII */
|
||||
snprintf ( cmdline, sizeof ( cmdline ), "%ls", wcmdline );
|
||||
|
||||
/* Process command line */
|
||||
process_cmdline ( cmdline );
|
||||
}
|
||||
|
||||
/**
|
||||
* EFI entry point
|
||||
*
|
||||
* @v image_handle Image handle
|
||||
* @v systab EFI system table
|
||||
* @ret efirc EFI status code
|
||||
*/
|
||||
EFI_STATUS EFIAPI efi_main ( EFI_HANDLE image_handle,
|
||||
EFI_SYSTEM_TABLE *systab ) {
|
||||
EFI_BOOT_SERVICES *bs;
|
||||
union {
|
||||
EFI_LOADED_IMAGE_PROTOCOL *image;
|
||||
void *interface;
|
||||
} loaded;
|
||||
EFI_HANDLE vdisk = NULL;
|
||||
EFI_HANDLE vpartition = NULL;
|
||||
EFI_STATUS efirc;
|
||||
|
||||
/* Record EFI handle and system table */
|
||||
efi_image_handle = image_handle;
|
||||
efi_systab = systab;
|
||||
bs = systab->BootServices;
|
||||
|
||||
/* Initialise stack cookie */
|
||||
init_cookie();
|
||||
|
||||
/* Print welcome banner */
|
||||
printf ( "\n\nBooting wim file...... (This may take a few minutes, please wait)\n\n");
|
||||
// printf ( "\n\nwimboot " VERSION " -- Windows Imaging Format "
|
||||
// "bootloader -- https://ipxe.org/wimboot\n\n" );
|
||||
|
||||
/* Get loaded image protocol */
|
||||
if ( ( efirc = bs->OpenProtocol ( image_handle,
|
||||
&efi_loaded_image_protocol_guid,
|
||||
&loaded.interface, image_handle, NULL,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
|
||||
die ( "Could not open loaded image protocol: %#lx\n",
|
||||
( ( unsigned long ) efirc ) );
|
||||
}
|
||||
|
||||
/* Process command line */
|
||||
efi_cmdline ( loaded.image );
|
||||
|
||||
/* Extract files from file system */
|
||||
efi_extract ( loaded.image->DeviceHandle );
|
||||
|
||||
/* Install virtual disk */
|
||||
efi_install ( &vdisk, &vpartition );
|
||||
|
||||
/* Invoke boot manager */
|
||||
efi_boot ( bootmgfw, bootmgfw_path, vpartition );
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user