diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 5825d51..d8ab5c4 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -82,6 +82,7 @@ typedef VOID (*PBL_INITIALIZE_PAGE_MAP)(OUT PXTBL_PAGE_MAPPING PageMap, IN SHORT typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid); typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList); typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid); +typedef EFI_STATUS (*PBL_LOAD_EFI_IMAGE)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, IN PVOID ImageData, IN SIZE_T ImageSize, OUT PEFI_HANDLE ImageHandle); typedef EFI_STATUS (*PBL_MAP_EFI_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN OUT PVOID *MemoryMapAddress); typedef EFI_STATUS (*PBL_MAP_PAGE)(IN PXTBL_PAGE_MAPPING PageMap, IN UINT_PTR VirtualAddress, IN UINT_PTR PhysicalAddress, IN UINT NumberOfPages); typedef EFI_STATUS (*PBL_MAP_VIRTUAL_MEMORY)(IN OUT PXTBL_PAGE_MAPPING PageMap, IN PVOID VirtualAddress, IN PVOID PhysicalAddress, IN UINT NumberOfPages, IN LOADER_MEMORY_TYPE MemoryType); @@ -94,6 +95,7 @@ typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_G typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); typedef VOID (XTAPI *PBL_SET_MEMORY)(OUT PVOID Destination, IN UCHAR Byte, IN SIZE_T Length); typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds); +typedef EFI_STATUS (*PBL_START_EFI_IMAGE)(IN EFI_HANDLE ImageHandle); 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_INPUT_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message, IN PWCHAR *InputFieldText); @@ -298,9 +300,11 @@ typedef struct _XTBL_LOADER_PROTOCOL { PBL_EXIT_BOOT_SERVICES ExitBootServices; PBL_GET_SECURE_BOOT_STATUS GetSecureBootStatus; + PBL_LOAD_EFI_IMAGE LoadEfiImage; PBL_POWER_SYSTEM RebootSystem; PBL_POWER_SYSTEM ShutdownSystem; PBL_SLEEP_EXECUTION SleepExecution; + PBL_START_EFI_IMAGE StartEfiImage; PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent; } Util; } XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL; diff --git a/xtldr/efiutils.c b/xtldr/efiutils.c index 085f4f9..d51219f 100644 --- a/xtldr/efiutils.c +++ b/xtldr/efiutils.c @@ -99,6 +99,36 @@ BlGetSecureBootStatus() return SecureBootStatus; } +/** + * Loads an EFI image into memory. + * + * @param DevicePath + * Specifies a device path from which the image is loaded. + * + * @param ImageData + * Supplies a pointer to the memory are containing a copy of the EFI image. + * + * @param ImageSize + * Supplies the size (in bytes) of the EFI image. + * + * @param ImageHandle + * Supplies a pointer to the memory area, where an EFI_image handle will be stored. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlLoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, + IN PVOID ImageData, + IN SIZE_T ImageSize, + OUT PEFI_HANDLE ImageHandle) +{ + /* Load EFI image */ + return EfiSystemTable->BootServices->LoadImage(FALSE, EfiImageHandle, DevicePath, ImageData, ImageSize, ImageHandle); +} + /** * Reboots the machine. * @@ -146,6 +176,23 @@ BlSleepExecution(IN ULONG_PTR Milliseconds) EfiSystemTable->BootServices->Stall(Milliseconds * 1000); } +/** + * Executes a loaded EFI image entry point. + * + * @param ImageHandle + * Provides a handle of loaded image, that will be started. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlStartEfiImage(IN EFI_HANDLE ImageHandle) +{ + return EfiSystemTable->BootServices->StartImage(ImageHandle, NULL, NULL); +} + /** * Waits for one or more EFI events. * diff --git a/xtldr/includes/xtldr.h b/xtldr/includes/xtldr.h index 3e7937e..14c7586 100644 --- a/xtldr/includes/xtldr.h +++ b/xtldr/includes/xtldr.h @@ -178,6 +178,13 @@ XTCDECL EFI_STATUS BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList); +XTCDECL +EFI_STATUS +BlLoadEfiImage(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, + IN PVOID ImageData, + IN SIZE_T ImageSize, + OUT PEFI_HANDLE ImageHandle); + XTCDECL EFI_STATUS BlLoadModule(IN PWCHAR ModuleName); @@ -289,6 +296,10 @@ XTCDECL VOID BlSleepExecution(IN ULONG_PTR Milliseconds); +XTCDECL +EFI_STATUS +BlStartEfiImage(IN EFI_HANDLE ImageHandle); + XTCDECL VOID BlStartLoaderShell(); diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 2be52c0..32bb6d3 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -287,8 +287,7 @@ BlLoadModule(IN PWCHAR ModuleName) ModuleDevicePath[1].Header.SubType = EFI_END_ENTIRE_DP; /* Load EFI image */ - Status = EfiSystemTable->BootServices->LoadImage(FALSE, EfiImageHandle, (PEFI_DEVICE_PATH_PROTOCOL)ModuleDevicePath, - ModuleData, ModuleSize, &ModuleHandle); + Status = BlLoadEfiImage((PEFI_DEVICE_PATH_PROTOCOL)ModuleDevicePath, ModuleData, ModuleSize, &ModuleHandle); if(Status != STATUS_EFI_SUCCESS) { /* Check if caused by secure boot */ @@ -337,7 +336,7 @@ BlLoadModule(IN PWCHAR ModuleName) EfiSystemTable->BootServices->CloseProtocol(LoadedImage, &LIPGuid, LoadedImage, NULL); /* Start EFI image */ - Status = EfiSystemTable->BootServices->StartImage(ModuleHandle, NULL, NULL); + Status = BlStartEfiImage(ModuleHandle); if(Status != STATUS_EFI_SUCCESS) { /* Failed to start module image */ @@ -651,9 +650,11 @@ BlpInstallXtLoaderProtocol() BlpLdrProtocol.Tui.UpdateProgressBar = BlUpdateProgressBar; BlpLdrProtocol.Util.ExitBootServices = BlExitBootServices; BlpLdrProtocol.Util.GetSecureBootStatus = BlGetSecureBootStatus; + BlpLdrProtocol.Util.LoadEfiImage = BlLoadEfiImage; BlpLdrProtocol.Util.RebootSystem = BlRebootSystem; BlpLdrProtocol.Util.ShutdownSystem = BlShutdownSystem; BlpLdrProtocol.Util.SleepExecution = BlSleepExecution; + BlpLdrProtocol.Util.StartEfiImage = BlStartEfiImage; BlpLdrProtocol.Util.WaitForEfiEvent = BlWaitForEfiEvent; /* Register XTLDR loader protocol */