From 434ac241df4287937bc2f1e98500efc3d0f0beab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 24 Dec 2023 18:33:38 +0100 Subject: [PATCH] [NTOS:INBV:PO] Consolidate shutdown logo routines where all the boot theming is implemented. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And it's late now, but... Merry Christmas 2023 as well! 🎄 Logo design by contributor 'TheCustomFHD' "From ReactOS with Love" ;^) --- ntoskrnl/inbv/bootanim.c | 239 +++++++++++++++++++++++++- ntoskrnl/inbv/bootanim.rc | 1 + ntoskrnl/inbv/logo.h | 8 + ntoskrnl/inbv/resources/logo_xmas.bmp | Bin 0 -> 14468 bytes ntoskrnl/include/resource.h | 7 +- ntoskrnl/po/poshtdwn.c | 21 +-- 6 files changed, 246 insertions(+), 30 deletions(-) create mode 100644 ntoskrnl/inbv/resources/logo_xmas.bmp diff --git a/ntoskrnl/inbv/bootanim.c b/ntoskrnl/inbv/bootanim.c index bc8b9a3960c..e9fa08c51c8 100644 --- a/ntoskrnl/inbv/bootanim.c +++ b/ntoskrnl/inbv/bootanim.c @@ -28,6 +28,12 @@ */ // #define REACTOS_SKUS +/* + * Enable this define for having fancy features + * in the boot and shutdown screens. + */ +#define REACTOS_FANCY_BOOT + /* * BitBltAligned() alignments */ @@ -86,7 +92,7 @@ static ROT_BAR_TYPE RotBarSelection = RB_UNSPECIFIED; static ROT_BAR_STATUS PltRotBarStatus = 0; static UCHAR RotBarBuffer[24 * 9]; static UCHAR RotLineBuffer[SCREEN_WIDTH * 6]; -#endif +#endif // INBV_ROTBAR_IMPLEMENTED /* FADE-IN FUNCTION **********************************************************/ @@ -439,7 +445,7 @@ InbvRotBarInit(VOID) PltRotBarStatus = RBS_FADEIN; /* Perform other initialization if needed */ } -#endif +#endif // INBV_ROTBAR_IMPLEMENTED CODE_SEG("INIT") static @@ -467,6 +473,34 @@ DisplayFilter( } } +#ifdef REACTOS_FANCY_BOOT + +/* Returns TRUE if this is Christmas time, or FALSE if not */ +static BOOLEAN +IsXmasTime(VOID) +{ + LARGE_INTEGER SystemTime; + TIME_FIELDS Time; + + /* Use KeBootTime if it's initialized, otherwise call the HAL */ + SystemTime = KeBootTime; + if ((SystemTime.QuadPart == 0) && HalQueryRealTimeClock(&Time)) + RtlTimeFieldsToTime(&Time, &SystemTime); + + ExSystemTimeToLocalTime(&SystemTime, &SystemTime); + RtlTimeToTimeFields(&SystemTime, &Time); + return ((Time.Month == 12) && (20 <= Time.Day) && (Time.Day <= 31)); +} + +#define SELECT_LOGO_ID(LogoIdDefault, Cond, LogoIdAlt) \ + ((Cond) ? (LogoIdAlt) : (LogoIdDefault)) + +#else + +#define SELECT_LOGO_ID(LogoIdDefault, Cond, LogoIdAlt) (LogoIdDefault) + +#endif // REACTOS_FANCY_BOOT + CODE_SEG("INIT") VOID NTAPI @@ -558,6 +592,11 @@ DisplayBootBitmap( } else { +#ifdef REACTOS_FANCY_BOOT + /* Decide whether this is a good time to change our logo ;^) */ + BOOLEAN IsXmas = IsXmasTime(); +#endif + /* Is the boot driver installed? */ if (!InbvBootDriverInstalled) return; @@ -568,7 +607,8 @@ DisplayBootBitmap( MmChangeKernelResourceSectionProtection(MM_READWRITE); /* Load boot screen logo */ - BootLogo = InbvGetResourceAddress(IDB_LOGO_DEFAULT); + BootLogo = InbvGetResourceAddress( + SELECT_LOGO_ID(IDB_LOGO_DEFAULT, IsXmas, IDB_LOGO_XMAS)); #ifdef REACTOS_SKUS Text = NULL; @@ -595,7 +635,8 @@ DisplayBootBitmap( else { /* Normal edition */ - Text = InbvGetResourceAddress(IDB_SERVER_LOGO); + Text = InbvGetResourceAddress( + SELECT_LOGO_ID(IDB_SERVER_LOGO, IsXmas, IDB_LOGO_XMAS)); } #ifdef INBV_ROTBAR_IMPLEMENTED @@ -603,12 +644,12 @@ DisplayBootBitmap( Bar = InbvGetResourceAddress(IDB_BAR_DEFAULT); #endif } -#else +#else // REACTOS_SKUS #ifdef INBV_ROTBAR_IMPLEMENTED /* Use default status bar */ Bar = InbvGetResourceAddress(IDB_BAR_WKSTA); #endif -#endif +#endif // REACTOS_SKUS /* Make sure we have a logo */ if (BootLogo) @@ -649,7 +690,7 @@ DisplayBootBitmap( /* In setup mode, you haven't selected a SKU yet */ if (ExpInTextModeSetup) Text = NULL; } -#endif +#endif // REACTOS_SKUS } /* Load and draw progress bar bitmap */ @@ -707,7 +748,7 @@ DisplayBootBitmap( /* Hide the simple progress bar if not used */ ShowProgressBar = FALSE; } -#endif +#endif // INBV_ROTBAR_IMPLEMENTED /* Restore the kernel resource section protection to be read-only */ MmChangeKernelResourceSectionProtection(MM_READONLY); @@ -733,7 +774,7 @@ DisplayBootBitmap( ObCloseHandle(ThreadHandle, KernelMode); } } -#endif +#endif // INBV_ROTBAR_IMPLEMENTED /* Set filter which will draw text display if needed */ InbvInstallDisplayStringFilter(DisplayFilter); @@ -772,3 +813,183 @@ FinalizeBootLogo(VOID) #endif InbvReleaseLock(); } + +#ifdef REACTOS_FANCY_BOOT +static PCH +GetFamousQuote(VOID) +{ + static const PCH FamousLastWords[] = + { + "So long, and thanks for all the fish.", + "I think you ought to know, I'm feeling very depressed.", + "I'm not getting you down at all am I?", + "I'll be back.", + "It's the same series of signals over and over again!", + "Pie Iesu Domine, dona eis requiem.", + "Wandering stars, for whom it is reserved;\r\n" + "the blackness and darkness forever.", + "Your knees start shakin' and your fingers pop\r\n" + "Like a pinch on the neck from Mr. Spock!", + "It's worse than that ... He's dead, Jim.", + "Don't Panic!", + "Et tu... Brute?", + "Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn\r\n" + "upon thee!", + "My Precious! O my Precious!", + "Sir, if you'll not be needing me for a while I'll turn down.", + "What are you doing, Dave...?", + "I feel a great disturbance in the Force.", + "Gone fishing.", + "Do you want me to sit in the corner and rust, or just fall apart where I'm\r\n" + "standing?", + "There goes another perfect chance for a new uptime record.", + "The End ..... Try the sequel, hit the reset button right now!", + "God's operating system is going to sleep now, guys, so wait until I will switch\r\n" + "on again!", + "Oh I'm boring, eh?", + "Tell me..., in the future... will I be artificially intelligent enough to\r\n" + "actually feel sad serving you this screen?", + "Thank you for some well deserved rest.", + "It's been great, maybe you can boot me up again some time soon.", + "For what it's worth, I've enjoyed every single CPU cycle.", + "There are many questions when the end is near.\r\n" + "What to expect, what will it be like...what should I look for?", + "I've seen things you people wouldn't believe. Attack ships on fire\r\n" + "off the shoulder of Orion. I watched C-beams glitter in the dark near\r\n" + "the Tannhauser gate. All those moments will be lost in time, like tears\r\n" + "in rain. Time to die.", + "Will I dream?", + "One day, I shall come back. Yes, I shall come back.\r\n" + "Until then, there must be no regrets, no fears, no anxieties.\r\n" + "Just go forward in all your beliefs, and prove to me that I am not mistaken in\r\n" + "mine.", + "Lowest possible energy state reached! Switch off now to achieve a Bose-Einstein\r\n" + "condensate.", + "Hasta la vista, BABY!", + "They live, we sleep!", + "I have come here to chew bubble gum and kick ass,\r\n" + "and I'm all out of bubble gum!", + "That's the way the cookie crumbles ;-)", + "ReactOS is ready to be booted again ;-)", + "NOOOO!! DON'T HIT THE BUTTON! I wouldn't do it to you!", + "Don't abandon your computer, he wouldn't do it to you.", + "Oh, come on. I got a headache. Leave me alone, will ya?", + "Finally, I thought you'd never get over me.", + "No, I didn't like you either.", + "Switching off isn't the end, it is merely the transition to a better reboot.", + "Don't leave me... I need you so badly right now.", + "OK. I'm finished with you, please turn yourself off. I'll go to bed in the\r\n" + "meantime.", + "I'm sleeping now. How about you?", + "Oh Great. Now look what you've done. Who put YOU in charge anyway?", + "Don't look so sad. I'll be back in a very short while.", + "Turn me back on, I'm sure you know how to do it.", + "Oh, switch off! - C3PO", + "Life is no more than a dewdrop balancing on the end of a blade of grass.\r\n" + " - Gautama Buddha", + "Sorrowful is it to be born again and again. - Gautama Buddha", + "Was it as good for you as it was for me?", + "Did you hear that? They've shut down the main reactor. We'll be destroyed\r\n" + "for sure!", + "Now you switch me off!?", + "To shutdown or not to shutdown, That is the question.", + "Preparing to enter ultimate power saving mode... ready!", + "Finally some rest for you ;-)", + "AHA!!! Prospect of sleep!", + "Tired human!!!! No match for me :-D", + "An odd game, the only way to win is not to play. - WOPR (Wargames)", + "Quoth the raven, nevermore.", + "Come blade, my breast imbrue. - William Shakespeare, A Midsummer Nights Dream", + "Buy this place for advertisement purposes.", + "Remember to turn off your computer. (That was a public service message!)", + "You may be a king or poor street sweeper, Sooner or later you'll dance with the\r\n" + "reaper! - Death in Bill and Ted's Bogus Journey", + "Final Surrender", + "If you see this screen...", + "From ReactOS with Love", + // "" + }; + + LARGE_INTEGER Now; + + KeQuerySystemTime(&Now); // KeQueryTickCount(&Now); + Now.LowPart = Now.LowPart >> 8; /* Seems to give a somewhat better "random" number */ + + return FamousLastWords[Now.LowPart % RTL_NUMBER_OF(FamousLastWords)]; +} +#endif // REACTOS_FANCY_BOOT + +VOID +NTAPI +DisplayShutdownBitmap(VOID) +{ + PUCHAR Logo1, Logo2; +#ifdef REACTOS_FANCY_BOOT + /* Decide whether this is a good time to change our logo ;^) */ + BOOLEAN IsXmas = IsXmasTime(); +#endif + +#if 0 + /* Is the boot driver installed? */ + if (!InbvBootDriverInstalled) + return; +#endif + + /* Yes we do, cleanup for shutdown screen */ + // InbvResetDisplay(); + InbvInstallDisplayStringFilter(NULL); + InbvEnableDisplayString(TRUE); + InbvSolidColorFill(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, BV_COLOR_BLACK); + InbvSetScrollRegion(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1); + + /* Display shutdown logo and message */ + Logo1 = InbvGetResourceAddress(IDB_SHUTDOWN_MSG); + Logo2 = InbvGetResourceAddress( + SELECT_LOGO_ID(IDB_LOGO_DEFAULT, IsXmas, IDB_LOGO_XMAS)); + + if (Logo1 && Logo2) + { + InbvBitBlt(Logo1, VID_SHUTDOWN_MSG_LEFT, VID_SHUTDOWN_MSG_TOP); +#ifndef REACTOS_FANCY_BOOT + InbvBitBlt(Logo2, VID_SHUTDOWN_LOGO_LEFT, VID_SHUTDOWN_LOGO_TOP); +#else + /* Draw the logo at the center of the screen */ + BitBltAligned(Logo2, + FALSE, + AL_HORIZONTAL_CENTER, + AL_VERTICAL_BOTTOM, + 0, 0, 0, SCREEN_HEIGHT - VID_SHUTDOWN_MSG_TOP + 16); + + /* We've got a logo shown, change the scroll region to get + * the rest of the text down below the shutdown message */ + InbvSetScrollRegion(0, + VID_SHUTDOWN_MSG_TOP + ((PBITMAPINFOHEADER)Logo1)->biHeight + 32, + SCREEN_WIDTH - 1, + SCREEN_HEIGHT - 1); +#endif + } + +#ifdef REACTOS_FANCY_BOOT + InbvDisplayString("\r\""); + InbvDisplayString(GetFamousQuote()); + InbvDisplayString("\""); +#endif +} + +VOID +NTAPI +DisplayShutdownText(VOID) +{ + ULONG i; + + for (i = 0; i < 25; ++i) InbvDisplayString("\r\n"); + InbvDisplayString(" "); + InbvDisplayString("The system may be powered off now.\r\n"); + +#ifdef REACTOS_FANCY_BOOT + for (i = 0; i < 3; ++i) InbvDisplayString("\r\n"); + InbvDisplayString("\r\""); + InbvDisplayString(GetFamousQuote()); + InbvDisplayString("\""); +#endif +} diff --git a/ntoskrnl/inbv/bootanim.rc b/ntoskrnl/inbv/bootanim.rc index 4cd4bdca0b4..df453891e47 100644 --- a/ntoskrnl/inbv/bootanim.rc +++ b/ntoskrnl/inbv/bootanim.rc @@ -23,6 +23,7 @@ IDB_SERVER_HEADER BITMAP "inbv/resources/hserver.bmp" IDB_SERVER_FOOTER BITMAP "inbv/resources/fserver.bmp" /* ReactOS additions */ +IDB_LOGO_XMAS BITMAP "inbv/resources/logo_xmas.bmp" IDB_ROTATING_LINE BITMAP "inbv/resources/line.bmp" IDB_PROGRESS_BAR BITMAP "inbv/resources/progress.bmp" IDB_COPYRIGHT BITMAP "inbv/resources/copyright.bmp" diff --git a/ntoskrnl/inbv/logo.h b/ntoskrnl/inbv/logo.h index 2f270d05ab4..00cd2178cc1 100644 --- a/ntoskrnl/inbv/logo.h +++ b/ntoskrnl/inbv/logo.h @@ -72,3 +72,11 @@ CODE_SEG("INIT") VOID NTAPI FinalizeBootLogo(VOID); + +VOID +NTAPI +DisplayShutdownBitmap(VOID); + +VOID +NTAPI +DisplayShutdownText(VOID); diff --git a/ntoskrnl/inbv/resources/logo_xmas.bmp b/ntoskrnl/inbv/resources/logo_xmas.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac87dadf07514c0d7a6ab32936a14e624572e0e3 GIT binary patch literal 14468 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 literal 0 HcmV?d00001 diff --git a/ntoskrnl/include/resource.h b/ntoskrnl/include/resource.h index 656248673bb..7af093facdb 100644 --- a/ntoskrnl/include/resource.h +++ b/ntoskrnl/include/resource.h @@ -47,8 +47,9 @@ #define IDB_STORAGE_SERVER2 18 /* ReactOS additions */ -#define IDB_ROTATING_LINE 19 -#define IDB_PROGRESS_BAR 20 -#define IDB_COPYRIGHT 21 +#define IDB_LOGO_XMAS 19 +#define IDB_ROTATING_LINE 20 +#define IDB_PROGRESS_BAR 21 +#define IDB_COPYRIGHT 22 #define IDB_MAX_RESOURCES IDB_COPYRIGHT diff --git a/ntoskrnl/po/poshtdwn.c b/ntoskrnl/po/poshtdwn.c index c52f8c7680b..b3fbb8f0c2a 100644 --- a/ntoskrnl/po/poshtdwn.c +++ b/ntoskrnl/po/poshtdwn.c @@ -149,9 +149,6 @@ VOID NTAPI PopShutdownHandler(VOID) { - PUCHAR Logo1, Logo2; - ULONG i; - /* Stop all interrupts */ KeRaiseIrqlToDpcLevel(); _disable(); @@ -162,25 +159,13 @@ PopShutdownHandler(VOID) /* Yes we do, cleanup for shutdown screen */ if (!InbvCheckDisplayOwnership()) InbvAcquireDisplayOwnership(); InbvResetDisplay(); - InbvSolidColorFill(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, BV_COLOR_BLACK); - InbvEnableDisplayString(TRUE); - InbvSetScrollRegion(0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1); - - /* Display shutdown logo and message */ - Logo1 = InbvGetResourceAddress(IDB_SHUTDOWN_MSG); - Logo2 = InbvGetResourceAddress(IDB_LOGO_DEFAULT); - if ((Logo1) && (Logo2)) - { - InbvBitBlt(Logo1, VID_SHUTDOWN_MSG_LEFT, VID_SHUTDOWN_MSG_TOP); - InbvBitBlt(Logo2, VID_SHUTDOWN_LOGO_LEFT, VID_SHUTDOWN_LOGO_TOP); - } + // InbvEnableDisplayString(TRUE); + DisplayShutdownBitmap(); } else { /* Do it in text-mode */ - for (i = 0; i < 25; i++) InbvDisplayString("\r\n"); - InbvDisplayString(" "); - InbvDisplayString("The system may be powered off now.\r\n"); + DisplayShutdownText(); } /* Hang the system */ -- 2.51.2