From bbce6c3fdf3c22c92991f30c7cb82bb3e835d5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 11 Mar 2024 21:44:45 +0100 Subject: [PATCH] [FREELDR] Deduplicate common message-box creation code. Also, make the (T)uiSave/RestoreScreen() helpers manage themselves the temporary memory buffer used to store the temporary screen snapshot. --- boot/freeldr/freeldr/include/ui/gui.h | 13 +- boot/freeldr/freeldr/include/ui/tui.h | 13 +- boot/freeldr/freeldr/ui/gui.c | 10 +- boot/freeldr/freeldr/ui/tui.c | 239 +++++++++++++------------- 4 files changed, 148 insertions(+), 127 deletions(-) diff --git a/boot/freeldr/freeldr/include/ui/gui.h b/boot/freeldr/freeldr/include/ui/gui.h index 044b6235382..e1b2be55890 100644 --- a/boot/freeldr/freeldr/include/ui/gui.h +++ b/boot/freeldr/freeldr/include/ui/gui.h @@ -31,8 +31,17 @@ VOID GuiDrawText(ULONG X, ULONG Y, PUCHAR Text, UCHAR Attr); // Draws text VOID GuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PUCHAR Text, UCHAR Attr); // Draws text at coordinates specified VOID GuiDrawStatusText(PCSTR StatusText); // Draws text at the very bottom line on the screen VOID GuiUpdateDateTime(VOID); // Updates the date and time -VOID GuiSaveScreen(PUCHAR Buffer); // Saves the screen so that it can be restored later -VOID GuiRestoreScreen(PUCHAR Buffer); // Restores the screen from a previous save + +/* Saves the screen so that it can be restored later */ +_Ret_maybenull_ +__drv_allocatesMem(Mem) +PUCHAR +GuiSaveScreen(VOID); + +/* Restores the screen from a previous save */ +VOID +GuiRestoreScreen( + _In_opt_ __drv_freesMem(Mem) PUCHAR Buffer); /* Displays a message box on the screen with an ok button */ VOID diff --git a/boot/freeldr/freeldr/include/ui/tui.h b/boot/freeldr/freeldr/include/ui/tui.h index 1f61c1ada27..9017c0b4ef6 100644 --- a/boot/freeldr/freeldr/include/ui/tui.h +++ b/boot/freeldr/freeldr/include/ui/tui.h @@ -101,8 +101,17 @@ TuiDrawCenteredText( VOID TuiDrawStatusText(PCSTR StatusText); // Draws text at the very bottom line on the screen VOID TuiUpdateDateTime(VOID); // Updates the date and time -VOID TuiSaveScreen(PUCHAR Buffer); // Saves the screen so that it can be restored later -VOID TuiRestoreScreen(PUCHAR Buffer); // Restores the screen from a previous save + +/* Saves the screen so that it can be restored later */ +_Ret_maybenull_ +__drv_allocatesMem(Mem) +PUCHAR +TuiSaveScreen(VOID); + +/* Restores the screen from a previous save */ +VOID +TuiRestoreScreen( + _In_opt_ __drv_freesMem(Mem) PUCHAR Buffer); /* Displays a message box on the screen with an ok button */ VOID diff --git a/boot/freeldr/freeldr/ui/gui.c b/boot/freeldr/freeldr/ui/gui.c index 38ec69b81d9..ddd81fce547 100644 --- a/boot/freeldr/freeldr/ui/gui.c +++ b/boot/freeldr/freeldr/ui/gui.c @@ -51,11 +51,17 @@ VOID GuiUpdateDateTime(VOID) { } -VOID GuiSaveScreen(PUCHAR Buffer) +_Ret_maybenull_ +__drv_allocatesMem(Mem) +PUCHAR +GuiSaveScreen(VOID) { + return NULL; } -VOID GuiRestoreScreen(PUCHAR Buffer) +VOID +GuiRestoreScreen( + _In_opt_ __drv_freesMem(Mem) PUCHAR Buffer) { } diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index e42599208d8..587b5bc44f9 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -19,6 +19,14 @@ #include +typedef struct _SMALL_RECT +{ + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; +} SMALL_RECT, *PSMALL_RECT; + PVOID TextVideoBuffer = NULL; /* GENERIC TUI UTILS *********************************************************/ @@ -606,72 +614,76 @@ VOID TuiUpdateDateTime(VOID) Buffer, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); } -VOID TuiSaveScreen(PUCHAR Buffer) +_Ret_maybenull_ +__drv_allocatesMem(Mem) +PUCHAR +TuiSaveScreen(VOID) { - PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer; - ULONG i; + PUCHAR Buffer; + PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer; + ULONG i; + /* Allocate the buffer */ + Buffer = FrLdrTempAlloc(UiScreenWidth * UiScreenHeight * 2, + TAG_TUI_SCREENBUFFER); + if (!Buffer) + return NULL; + + /* Loop through each cell and copy it */ for (i=0; i < (UiScreenWidth * UiScreenHeight * 2); i++) { Buffer[i] = ScreenMemory[i]; } + + return Buffer; } -VOID TuiRestoreScreen(PUCHAR Buffer) +VOID +TuiRestoreScreen( + _In_opt_ __drv_freesMem(Mem) PUCHAR Buffer) { - PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer; - ULONG i; + PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer; + ULONG i; + if (!Buffer) + return; + + /* Loop through each cell and copy it */ for (i=0; i < (UiScreenWidth * UiScreenHeight * 2); i++) { ScreenMemory[i] = Buffer[i]; } + + /* Free the buffer */ + FrLdrTempFree(Buffer, TAG_TUI_SCREENBUFFER); + VideoCopyOffScreenBufferToVRAM(); } -VOID -TuiMessageBox( - _In_ PCSTR MessageText) +static VOID +TuiDrawMsgBoxCommon( + _In_ PCSTR MessageText, + _Out_ PSMALL_RECT MsgBoxRect) { - PVOID ScreenBuffer; + INT width = 8; + ULONG height = 1; + INT curline = 0; + INT k; + size_t i, j; + INT x1, x2, y1, y2; + CHAR temp[260]; - // Save the screen contents - ScreenBuffer = FrLdrTempAlloc(UiScreenWidth * UiScreenHeight * 2, - TAG_TUI_SCREENBUFFER); - TuiSaveScreen(ScreenBuffer); - - // Display the message box - TuiMessageBoxCritical(MessageText); - - // Restore the screen contents - TuiRestoreScreen(ScreenBuffer); - FrLdrTempFree(ScreenBuffer, TAG_TUI_SCREENBUFFER); -} - -VOID -TuiMessageBoxCritical( - _In_ PCSTR MessageText) -{ - int width = 8; - unsigned int height = 1; - int curline = 0; - int k; - size_t i , j; - int x1, x2, y1, y2; - char temp[260]; - char key; - - // Find the height - for (i=0; iLeft = x1; MsgBoxRect->Right = x2; + MsgBoxRect->Top = y1; MsgBoxRect->Bottom = y2; - // Draw the text - for (i=0,j=0; i width) - width = k; - - k = 0; - j++; - } - - // Calculate box area - x1 = (UiScreenWidth - (width+2))/2; - x2 = x1 + width + 3; - y1 = ((UiScreenHeight - height - 2)/2) + 1; - y2 = y1 + height + 4; - - // Draw the box - TuiDrawBox(x1, y1, x2, y2, D_VERT, D_HORZ, TRUE, TRUE, ATTR(UiMessageBoxFgColor, UiMessageBoxBgColor)); - - // Draw the text - for (i=0,j=0; i