diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 7cdf24a..65f47a2 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -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_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 VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); 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_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 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 VOID (*PBL_XT_BOOT_MENU)(); /* Boot menu list structure */ typedef struct _XTBL_BOOTMENU_ITEM @@ -148,6 +150,7 @@ typedef struct _XTBL_LOADER_PROTOCOL { PBL_BOOTMENU_INITIALIZE_OS_LIST InitializeBootMenuList; PBL_OPEN_XT_PROTOCOL OpenProtocol; + PBL_REGISTER_XT_BOOT_MENU RegisterBootMenu; } Protocol; struct { @@ -168,6 +171,7 @@ typedef struct _XTBL_LOADER_PROTOCOL /* XTLDR Status data */ typedef struct _XTBL_STATUS { + PBL_XT_BOOT_MENU BootMenu; BOOLEAN BootServices; ULONG DebugPort; CPPORT SerialPort; diff --git a/xtldr2/includes/bootman.h b/xtldr2/includes/bootman.h index 6655df5..52ec0b6 100644 --- a/xtldr2/includes/bootman.h +++ b/xtldr2/includes/bootman.h @@ -126,6 +126,11 @@ BlOpenVolume(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); +XTCDECL +EFI_STATUS +BlOpenXtProtocol(OUT PVOID *ProtocolHandler, + IN PEFI_GUID ProtocolGuid); + XTCDECL VOID BlQueryConsoleMode(OUT PUINT_PTR ResX, @@ -144,12 +149,11 @@ BlReadKeyStroke(OUT PEFI_INPUT_KEY Key); XTCDECL VOID -BlResetConsoleInputBuffer(); +BlRegisterBootMenu(PVOID BootMenuRoutine); XTCDECL -EFI_STATUS -BlOpenXtProtocol(OUT PVOID *ProtocolHandler, - IN PEFI_GUID ProtocolGuid); +VOID +BlResetConsoleInputBuffer(); XTCDECL EFI_STATUS diff --git a/xtldr2/protocol.c b/xtldr2/protocol.c index 8b1b5fd..02793ce 100644 --- a/xtldr2/protocol.c +++ b/xtldr2/protocol.c @@ -74,6 +74,24 @@ BlOpenXtProtocol(OUT PVOID *ProtocolHandler, 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. * @@ -109,8 +127,9 @@ BlpRegisterXtLoaderProtocol() LdrProtocol.Memory.AllocatePool = BlMemoryAllocatePool; LdrProtocol.Memory.FreePages = BlMemoryFreePages; LdrProtocol.Memory.FreePool = BlMemoryFreePool; - LdrProtocol.Protocol.OpenProtocol = BlOpenXtProtocol; LdrProtocol.Protocol.InitializeBootMenuList = BlInitializeBootMenuList; + LdrProtocol.Protocol.OpenProtocol = BlOpenXtProtocol; + LdrProtocol.Protocol.RegisterBootMenu = BlRegisterBootMenu; LdrProtocol.Tui.DisplayErrorDialog = BlDisplayErrorDialog; LdrProtocol.Tui.DisplayInfoDialog = BlDisplayInfoDialog; LdrProtocol.Tui.DisplayProgressDialog = BlDisplayProgressDialog; diff --git a/xtldr2/xtldr.c b/xtldr2/xtldr.c index 956b4eb..ee896bc 100644 --- a/xtldr2/xtldr.c +++ b/xtldr2/xtldr.c @@ -191,8 +191,16 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle, for(;;) { - /* Display boot menu */ - BlDisplayBootMenu(); + if(BlpStatus.BootMenu != NULL) + { + /* Display alternative boot menu */ + BlpStatus.BootMenu(); + } + else + { + /* Display default boot menu */ + BlDisplayBootMenu(); + } } /* This point should be never reached, if this happen return error code */