diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c index 9830c2ec74f..c866502a6aa 100644 --- a/boot/freeldr/freeldr/bootmgr.c +++ b/boot/freeldr/freeldr/bootmgr.c @@ -401,6 +401,13 @@ VOID RunLoader(VOID) /* Load the chosen operating system */ LoadOperatingSystem(&OperatingSystemList[SelectedOperatingSystem]); + + /* If we get there, the OS loader failed. As it may have + * messed up the display, re-initialize the UI. */ +#ifndef _M_ARM + UiVtbl.UnInitialize(); +#endif + UiInitialize(TRUE); } Reboot: diff --git a/boot/freeldr/freeldr/include/ui/video.h b/boot/freeldr/freeldr/include/ui/video.h index 0e0f4ec3828..c6f07a94704 100644 --- a/boot/freeldr/freeldr/include/ui/video.h +++ b/boot/freeldr/freeldr/include/ui/video.h @@ -19,7 +19,9 @@ typedef struct _PALETTE_ENTRY // extern PVOID VideoOffScreenBuffer; PVOID VideoAllocateOffScreenBuffer(VOID); // Returns a pointer to an off-screen buffer sufficient for the current video mode -VOID VideoCopyOffScreenBufferToVRAM(VOID); + +VOID VideoFreeOffScreenBuffer(VOID); +VOID VideoCopyOffScreenBufferToVRAM(VOID); VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); diff --git a/boot/freeldr/freeldr/ui/directui.c b/boot/freeldr/freeldr/ui/directui.c index cd4b07dcf94..7021a86cdbc 100644 --- a/boot/freeldr/freeldr/ui/directui.c +++ b/boot/freeldr/freeldr/ui/directui.c @@ -34,6 +34,9 @@ UiInitialize(IN BOOLEAN ShowUi) /* Set mode and query size */ MachVideoSetDisplayMode(NULL, TRUE); MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth); + + /* Clear the screen */ + UiDrawBackdrop(); return TRUE; } diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index d14b1f656fc..bcf510ed7c8 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -210,6 +210,10 @@ BOOLEAN TuiInitialize(VOID) VOID TuiUnInitialize(VOID) { + /* Do nothing if already uninitialized */ + if (!TextVideoBuffer) + return; + if (UiUseSpecialEffects) { TuiFadeOut(); @@ -219,6 +223,9 @@ VOID TuiUnInitialize(VOID) MachVideoSetDisplayMode(NULL, FALSE); } + VideoFreeOffScreenBuffer(); + TextVideoBuffer = NULL; + MachVideoClearScreen(ATTR(COLOR_GRAY, COLOR_BLACK)); MachVideoSetTextCursorPosition(0, 0); MachVideoHideShowTextCursor(TRUE); diff --git a/boot/freeldr/freeldr/ui/video.c b/boot/freeldr/freeldr/ui/video.c index d44f8ee1eed..ab77d694a3c 100644 --- a/boot/freeldr/freeldr/ui/video.c +++ b/boot/freeldr/freeldr/ui/video.c @@ -18,11 +18,7 @@ PVOID VideoAllocateOffScreenBuffer(VOID) { ULONG BufferSize; - if (VideoOffScreenBuffer != NULL) - { - MmFreeMemory(VideoOffScreenBuffer); - VideoOffScreenBuffer = NULL; - } + VideoFreeOffScreenBuffer(); BufferSize = MachVideoGetBufferSize(); @@ -31,6 +27,15 @@ PVOID VideoAllocateOffScreenBuffer(VOID) return VideoOffScreenBuffer; } +VOID VideoFreeOffScreenBuffer(VOID) +{ + if (!VideoOffScreenBuffer) + return; + + MmFreeMemory(VideoOffScreenBuffer); + VideoOffScreenBuffer = NULL; +} + VOID VideoCopyOffScreenBufferToVRAM(VOID) { MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer);