Add a way to define custom boot menu handler
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 27s
Builds / ExectOS (i686) (push) Successful in 25s

This commit is contained in:
Rafal Kupiec 2023-12-23 10:43:00 +01:00
parent 57b6037dd6
commit ea5365dcfd
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
4 changed files with 42 additions and 7 deletions

View File

@ -66,12 +66,14 @@ typedef INT_PTR (*PBL_GET_SECURE_BOOT_STATUS)();
typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
typedef EFI_STATUS (*PBL_OPEN_XT_PROTOCOL)(OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_OPEN_XT_PROTOCOL)(OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize); typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize);
typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds); typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds);
typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message); typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
typedef VOID (*PBL_TUI_DISPLAY_INFO_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message); typedef VOID (*PBL_TUI_DISPLAY_INFO_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message);
typedef XTBL_DIALOG_HANDLE (*PBL_TUI_DISPLAY_PROGRESS_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN UCHAR Percentage); typedef XTBL_DIALOG_HANDLE (*PBL_TUI_DISPLAY_PROGRESS_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN UCHAR Percentage);
typedef VOID (*PBL_TUI_UPDATE_PROGRESS_BAR)(IN PXTBL_DIALOG_HANDLE Handle, IN PWCHAR Message, IN UCHAR Percentage); typedef VOID (*PBL_TUI_UPDATE_PROGRESS_BAR)(IN PXTBL_DIALOG_HANDLE Handle, IN PWCHAR Message, IN UCHAR Percentage);
typedef EFI_STATUS (*PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index); typedef EFI_STATUS (*PBL_WAIT_FOR_EFI_EVENT)(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index);
typedef VOID (*PBL_XT_BOOT_MENU)();
/* Boot menu list structure */ /* Boot menu list structure */
typedef struct _XTBL_BOOTMENU_ITEM typedef struct _XTBL_BOOTMENU_ITEM
@ -148,6 +150,7 @@ typedef struct _XTBL_LOADER_PROTOCOL
{ {
PBL_BOOTMENU_INITIALIZE_OS_LIST InitializeBootMenuList; PBL_BOOTMENU_INITIALIZE_OS_LIST InitializeBootMenuList;
PBL_OPEN_XT_PROTOCOL OpenProtocol; PBL_OPEN_XT_PROTOCOL OpenProtocol;
PBL_REGISTER_XT_BOOT_MENU RegisterBootMenu;
} Protocol; } Protocol;
struct struct
{ {
@ -168,6 +171,7 @@ typedef struct _XTBL_LOADER_PROTOCOL
/* XTLDR Status data */ /* XTLDR Status data */
typedef struct _XTBL_STATUS typedef struct _XTBL_STATUS
{ {
PBL_XT_BOOT_MENU BootMenu;
BOOLEAN BootServices; BOOLEAN BootServices;
ULONG DebugPort; ULONG DebugPort;
CPPORT SerialPort; CPPORT SerialPort;

View File

@ -126,6 +126,11 @@ BlOpenVolume(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath,
OUT PEFI_HANDLE DiskHandle, OUT PEFI_HANDLE DiskHandle,
OUT PEFI_FILE_HANDLE *FsHandle); OUT PEFI_FILE_HANDLE *FsHandle);
XTCDECL
EFI_STATUS
BlOpenXtProtocol(OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid);
XTCDECL XTCDECL
VOID VOID
BlQueryConsoleMode(OUT PUINT_PTR ResX, BlQueryConsoleMode(OUT PUINT_PTR ResX,
@ -144,12 +149,11 @@ BlReadKeyStroke(OUT PEFI_INPUT_KEY Key);
XTCDECL XTCDECL
VOID VOID
BlResetConsoleInputBuffer(); BlRegisterBootMenu(PVOID BootMenuRoutine);
XTCDECL XTCDECL
EFI_STATUS VOID
BlOpenXtProtocol(OUT PVOID *ProtocolHandler, BlResetConsoleInputBuffer();
IN PEFI_GUID ProtocolGuid);
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS

View File

@ -74,6 +74,24 @@ BlOpenXtProtocol(OUT PVOID *ProtocolHandler,
return STATUS_EFI_SUCCESS; return STATUS_EFI_SUCCESS;
} }
/**
* Registers a boot menu callback routine, that will be used to display alternative boot menu.
*
* @param BootMenuRoutine
* Supplies a pointer to the boot menu callback routine.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTCDECL
VOID
BlRegisterBootMenu(PVOID BootMenuRoutine)
{
/* Set boot menu routine */
BlpStatus.BootMenu = BootMenuRoutine;
}
/** /**
* This routine registers XTLDR protocol for further usage by modules. * This routine registers XTLDR protocol for further usage by modules.
* *
@ -109,8 +127,9 @@ BlpRegisterXtLoaderProtocol()
LdrProtocol.Memory.AllocatePool = BlMemoryAllocatePool; LdrProtocol.Memory.AllocatePool = BlMemoryAllocatePool;
LdrProtocol.Memory.FreePages = BlMemoryFreePages; LdrProtocol.Memory.FreePages = BlMemoryFreePages;
LdrProtocol.Memory.FreePool = BlMemoryFreePool; LdrProtocol.Memory.FreePool = BlMemoryFreePool;
LdrProtocol.Protocol.OpenProtocol = BlOpenXtProtocol;
LdrProtocol.Protocol.InitializeBootMenuList = BlInitializeBootMenuList; LdrProtocol.Protocol.InitializeBootMenuList = BlInitializeBootMenuList;
LdrProtocol.Protocol.OpenProtocol = BlOpenXtProtocol;
LdrProtocol.Protocol.RegisterBootMenu = BlRegisterBootMenu;
LdrProtocol.Tui.DisplayErrorDialog = BlDisplayErrorDialog; LdrProtocol.Tui.DisplayErrorDialog = BlDisplayErrorDialog;
LdrProtocol.Tui.DisplayInfoDialog = BlDisplayInfoDialog; LdrProtocol.Tui.DisplayInfoDialog = BlDisplayInfoDialog;
LdrProtocol.Tui.DisplayProgressDialog = BlDisplayProgressDialog; LdrProtocol.Tui.DisplayProgressDialog = BlDisplayProgressDialog;

View File

@ -191,8 +191,16 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle,
for(;;) for(;;)
{ {
/* Display boot menu */ if(BlpStatus.BootMenu != NULL)
BlDisplayBootMenu(); {
/* Display alternative boot menu */
BlpStatus.BootMenu();
}
else
{
/* Display default boot menu */
BlDisplayBootMenu();
}
} }
/* This point should be never reached, if this happen return error code */ /* This point should be never reached, if this happen return error code */