diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 0817d28..3d27fe4 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -98,6 +98,7 @@ typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT 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_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_OPEN_PROTOCOL_HANDLE)(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); +typedef EFI_STATUS (*PBL_POWER_SYSTEM)(); 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_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid); typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); @@ -291,6 +292,8 @@ typedef struct _XTBL_LOADER_PROTOCOL { PBL_EXIT_BOOT_SERVICES ExitBootServices; PBL_GET_SECURE_BOOT_STATUS GetSecureBootStatus; + PBL_POWER_SYSTEM RebootSystem; + PBL_POWER_SYSTEM ShutdownSystem; PBL_SLEEP_EXECUTION SleepExecution; PBL_WAIT_FOR_EFI_EVENT WaitForEfiEvent; } Util; diff --git a/xtldr/efiutils.c b/xtldr/efiutils.c index f1d0ab0..84618dd 100644 --- a/xtldr/efiutils.c +++ b/xtldr/efiutils.c @@ -99,6 +99,36 @@ BlGetSecureBootStatus() return SecureBootStatus; } +/** + * Reboots the machine. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlRebootSystem() +{ + /* Reboot machine */ + return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetCold, STATUS_EFI_SUCCESS, 0, NULL); +} + +/** + * Shuts down the machine. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlShutdownSystem() +{ + /* Shutdown machine */ + return EfiSystemTable->RuntimeServices->ResetSystem(EfiResetShutdown, STATUS_EFI_SUCCESS, 0, NULL); +} + /** * Puts the system to sleep for the specified number of milliseconds. * diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 70e8c2c..c135e60 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -646,6 +646,8 @@ BlpInstallXtLoaderProtocol() BlpLdrProtocol.Tui.UpdateProgressBar = BlUpdateProgressBar; BlpLdrProtocol.Util.ExitBootServices = BlExitBootServices; BlpLdrProtocol.Util.GetSecureBootStatus = BlGetSecureBootStatus; + BlpLdrProtocol.Util.RebootSystem = BlRebootSystem; + BlpLdrProtocol.Util.ShutdownSystem = BlShutdownSystem; BlpLdrProtocol.Util.SleepExecution = BlSleepExecution; BlpLdrProtocol.Util.WaitForEfiEvent = BlWaitForEfiEvent;