From e5c0bfacf1374abf34abbaf75047149a6252ca5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bi=C8=99oc=20George?= Date: Wed, 22 Aug 2018 11:10:18 +0200 Subject: [PATCH] [USETUP] Implement the shutdown timeout progress bar. (#833) - Add the MUI ID resource. - Implement the shutdown timeout progress bar function and the TimeOut string handler. - Add the resource string to other resource languages. --- base/setup/usetup/lang/bg-BG.h | 2 + base/setup/usetup/lang/bn-BD.h | 2 + base/setup/usetup/lang/cs-CZ.h | 2 + base/setup/usetup/lang/da-DK.h | 2 + base/setup/usetup/lang/de-DE.h | 2 + base/setup/usetup/lang/el-GR.h | 2 + base/setup/usetup/lang/en-US.h | 2 + base/setup/usetup/lang/es-ES.h | 2 + base/setup/usetup/lang/et-EE.h | 2 + base/setup/usetup/lang/fr-FR.h | 2 + base/setup/usetup/lang/he-IL.h | 2 + base/setup/usetup/lang/it-IT.h | 2 + base/setup/usetup/lang/ja-JP.h | 2 + base/setup/usetup/lang/lt-LT.h | 2 + base/setup/usetup/lang/ms-MY.h | 2 + base/setup/usetup/lang/nl-NL.h | 2 + base/setup/usetup/lang/pl-PL.h | 2 + base/setup/usetup/lang/pt-BR.h | 2 + base/setup/usetup/lang/ro-RO.h | 2 + base/setup/usetup/lang/ru-RU.h | 2 + base/setup/usetup/lang/sk-SK.h | 2 + base/setup/usetup/lang/sq-AL.h | 2 + base/setup/usetup/lang/sv-SE.h | 2 + base/setup/usetup/lang/tr-TR.h | 2 + base/setup/usetup/lang/uk-UA.h | 2 + base/setup/usetup/mui.h | 1 + base/setup/usetup/usetup.c | 215 ++++++++++++++++++++++++++++++--- 27 files changed, 246 insertions(+), 20 deletions(-) diff --git a/base/setup/usetup/lang/bg-BG.h b/base/setup/usetup/lang/bg-BG.h index c85d48cc86d..b6366eac4e4 100644 --- a/base/setup/usetup/lang/bg-BG.h +++ b/base/setup/usetup/lang/bg-BG.h @@ -1792,6 +1792,8 @@ MUI_STRING bgBGStrings[] = " ƒ®â®¢®..."}, {STRING_REBOOTCOMPUTER2, " ENTER = à¥§ ¯ã᪠­¥ ­  ª®¬¯îâêà "}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Žâ¢ àﭥ⮠­  ª®­§®« â  ¥ ­¥¢ê§¬®¦­®\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/bn-BD.h b/base/setup/usetup/lang/bn-BD.h index fcc483b7d3d..5a4d7786e19 100644 --- a/base/setup/usetup/lang/bn-BD.h +++ b/base/setup/usetup/lang/bn-BD.h @@ -1777,6 +1777,8 @@ MUI_STRING bnBDStrings[] = " Done..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Reboot computer"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Unable to open the console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/cs-CZ.h b/base/setup/usetup/lang/cs-CZ.h index 790fbfc6e62..4359652d372 100644 --- a/base/setup/usetup/lang/cs-CZ.h +++ b/base/setup/usetup/lang/cs-CZ.h @@ -1785,6 +1785,8 @@ MUI_STRING csCZStrings[] = " Hotovo..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Restartovat poŸ¡taŸ"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Nelze otevý¡t konzoli\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/da-DK.h b/base/setup/usetup/lang/da-DK.h index f6029f66138..febfb2b68d5 100644 --- a/base/setup/usetup/lang/da-DK.h +++ b/base/setup/usetup/lang/da-DK.h @@ -1791,6 +1791,8 @@ MUI_STRING daDKStrings[] = " Udf›rt..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Genstart"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Kunne ikke †bne konsollen\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/de-DE.h b/base/setup/usetup/lang/de-DE.h index 9ddac46c7f2..fda98fbce0d 100644 --- a/base/setup/usetup/lang/de-DE.h +++ b/base/setup/usetup/lang/de-DE.h @@ -1781,6 +1781,8 @@ MUI_STRING deDEStrings[] = " Fertig..."}, {STRING_REBOOTCOMPUTER2, " EINGABETASTE = Computer neu starten"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Konsole konnte nicht ge”ffnet werden\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/el-GR.h b/base/setup/usetup/lang/el-GR.h index 034b895f900..58e624f0c3b 100644 --- a/base/setup/usetup/lang/el-GR.h +++ b/base/setup/usetup/lang/el-GR.h @@ -1796,6 +1796,8 @@ MUI_STRING elGRStrings[] = " Ž¢¦¡¢ž¨éŸž¡œ..."}, {STRING_REBOOTCOMPUTER2, " ENTER = „§œ¤ ¡¡å¤ž©ž ¬§¦¢¦š ©«ã"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "€›ç¤˜«¦ ¤˜ ˜¤¦ ®«œå ž ¡¦¤©æ¢˜\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/en-US.h b/base/setup/usetup/lang/en-US.h index 216df8fc3b5..9f3a6334e56 100644 --- a/base/setup/usetup/lang/en-US.h +++ b/base/setup/usetup/lang/en-US.h @@ -1777,6 +1777,8 @@ MUI_STRING enUSStrings[] = " Done..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Reboot computer"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Unable to open the console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/es-ES.h b/base/setup/usetup/lang/es-ES.h index 2bf3418b583..e52c7a56ad5 100644 --- a/base/setup/usetup/lang/es-ES.h +++ b/base/setup/usetup/lang/es-ES.h @@ -1781,6 +1781,8 @@ MUI_STRING esESStrings[] = " Terminado..."}, {STRING_REBOOTCOMPUTER2, " INTRO = Reiniciar el equipo"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "No se pudo abrir la consola\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/et-EE.h b/base/setup/usetup/lang/et-EE.h index b21105d6c24..ee47d0ec840 100644 --- a/base/setup/usetup/lang/et-EE.h +++ b/base/setup/usetup/lang/et-EE.h @@ -1777,6 +1777,8 @@ MUI_STRING etEEStrings[] = " Valmis..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Taask„ivita arvuti"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Konsooli ei ännestunud avada\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/fr-FR.h b/base/setup/usetup/lang/fr-FR.h index 7f11d9ba682..fc2780e4330 100644 --- a/base/setup/usetup/lang/fr-FR.h +++ b/base/setup/usetup/lang/fr-FR.h @@ -1796,6 +1796,8 @@ MUI_STRING frFRStrings[] = " Termin‚..."}, {STRING_REBOOTCOMPUTER2, " ENTRE = Red‚marrer l'ordinateur"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Impossible d'ouvrir la console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/he-IL.h b/base/setup/usetup/lang/he-IL.h index e48da925d2f..686ed20ed83 100644 --- a/base/setup/usetup/lang/he-IL.h +++ b/base/setup/usetup/lang/he-IL.h @@ -1779,6 +1779,8 @@ MUI_STRING heILStrings[] = " ‘‰…..."}, {STRING_REBOOTCOMPUTER2, " ENTER = „”’Œ Ž‡ƒ™ €š „Ž™"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Unable to open the console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/it-IT.h b/base/setup/usetup/lang/it-IT.h index ad3c98b9915..9fcaf4c6af9 100644 --- a/base/setup/usetup/lang/it-IT.h +++ b/base/setup/usetup/lang/it-IT.h @@ -1784,6 +1784,8 @@ MUI_STRING itITStrings[] = " Fatto..."}, {STRING_REBOOTCOMPUTER2, " INVIO = Riavvia il computer"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Impossibile aprire la console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/ja-JP.h b/base/setup/usetup/lang/ja-JP.h index 1000261c0d0..d30be1487dd 100644 --- a/base/setup/usetup/lang/ja-JP.h +++ b/base/setup/usetup/lang/ja-JP.h @@ -1781,6 +1781,8 @@ MUI_STRING jaJPStrings[] = " ¶ÝØ®³..."}, {STRING_REBOOTCOMPUTER2, " ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "ºÝ¿°Ù¦ µ°ÌßÝ Ã޷ϾÝ\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/lt-LT.h b/base/setup/usetup/lang/lt-LT.h index 9a90a8dbab2..697b19ff67c 100644 --- a/base/setup/usetup/lang/lt-LT.h +++ b/base/setup/usetup/lang/lt-LT.h @@ -1787,6 +1787,8 @@ MUI_STRING ltLTStrings[] = " Done..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Reboot computer"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Unable to open the console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/ms-MY.h b/base/setup/usetup/lang/ms-MY.h index b4eceeb2f27..2da4e91f0f8 100644 --- a/base/setup/usetup/lang/ms-MY.h +++ b/base/setup/usetup/lang/ms-MY.h @@ -1666,6 +1666,8 @@ MUI_STRING msMYStrings[] = " Siap..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Memulakan semuala komputer"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Tidak dapat membuka konsol\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/nl-NL.h b/base/setup/usetup/lang/nl-NL.h index c25d939dadf..9f080ce4c2b 100644 --- a/base/setup/usetup/lang/nl-NL.h +++ b/base/setup/usetup/lang/nl-NL.h @@ -1807,6 +1807,8 @@ MUI_STRING nlNLStrings[] = " Voltooid..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Computer opnieuw opstarten"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Kan console niet openen.\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/pl-PL.h b/base/setup/usetup/lang/pl-PL.h index 384da7a97a2..b1381bcac1d 100644 --- a/base/setup/usetup/lang/pl-PL.h +++ b/base/setup/usetup/lang/pl-PL.h @@ -1788,6 +1788,8 @@ MUI_STRING plPLStrings[] = " Ukoäczone..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Restart komputera"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Otwarcie konsoli nieudane\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/pt-BR.h b/base/setup/usetup/lang/pt-BR.h index e1cd55e159c..4372dc3761c 100644 --- a/base/setup/usetup/lang/pt-BR.h +++ b/base/setup/usetup/lang/pt-BR.h @@ -1811,6 +1811,8 @@ MUI_STRING ptBRStrings[] = " Pronto..."}, {STRING_REBOOTCOMPUTER2, " ENTER=Reiniciar"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "NÆo foi poss¡vel abrir o console\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/ro-RO.h b/base/setup/usetup/lang/ro-RO.h index 67a8b312b74..ea86f5a9cd7 100644 --- a/base/setup/usetup/lang/ro-RO.h +++ b/base/setup/usetup/lang/ro-RO.h @@ -1831,6 +1831,8 @@ MUI_STRING roROStrings[] = " Terminat!"}, {STRING_REBOOTCOMPUTER2, " ENTER = Repornire calculator"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Eºec la deschiderea consolei\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/ru-RU.h b/base/setup/usetup/lang/ru-RU.h index 6d087dfafd0..32b7821193b 100644 --- a/base/setup/usetup/lang/ru-RU.h +++ b/base/setup/usetup/lang/ru-RU.h @@ -1778,6 +1778,8 @@ MUI_STRING ruRUStrings[] = " ‡ ¢¥à襭®..."}, {STRING_REBOOTCOMPUTER2, " ENTER = ¥à¥§ £à㧪 "}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "¥ 㤠«®áì ®âªàëâì ª®­á®«ì\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/sk-SK.h b/base/setup/usetup/lang/sk-SK.h index 35682911ce7..be99ea5586e 100644 --- a/base/setup/usetup/lang/sk-SK.h +++ b/base/setup/usetup/lang/sk-SK.h @@ -1791,6 +1791,8 @@ MUI_STRING skSKStrings[] = " Hotovo..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Reçtart poŸ¡taŸa"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Nemo§no otvoriœ konzolu\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/sq-AL.h b/base/setup/usetup/lang/sq-AL.h index 021f11ad8c5..bf157a9bdaa 100644 --- a/base/setup/usetup/lang/sq-AL.h +++ b/base/setup/usetup/lang/sq-AL.h @@ -1784,6 +1784,8 @@ MUI_STRING sqALStrings[] = " Mbaruam..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Ristarto kompjuterin"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "N‰ pamundesi p‰r t‰ hapur konsollin\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/sv-SE.h b/base/setup/usetup/lang/sv-SE.h index 2dafaf3602b..38e766f4474 100644 --- a/base/setup/usetup/lang/sv-SE.h +++ b/base/setup/usetup/lang/sv-SE.h @@ -1787,6 +1787,8 @@ MUI_STRING svSEStrings[] = " F„rdigt..."}, {STRING_REBOOTCOMPUTER2, " ENTER = Starta om datorn"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Det g†r inte ”ppna Konsollen\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/tr-TR.h b/base/setup/usetup/lang/tr-TR.h index 59b9d13b2fc..be2ce60cf53 100644 --- a/base/setup/usetup/lang/tr-TR.h +++ b/base/setup/usetup/lang/tr-TR.h @@ -1758,6 +1758,8 @@ MUI_STRING trTRStrings[] = " Bitti..."}, {STRING_REBOOTCOMPUTER2, " GiriŸ = Bilgisayar Yeniden BaŸlat"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "Konsol a‡lamyor.\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/lang/uk-UA.h b/base/setup/usetup/lang/uk-UA.h index b0b6d53e97f..7f693079b8f 100644 --- a/base/setup/usetup/lang/uk-UA.h +++ b/base/setup/usetup/lang/uk-UA.h @@ -1787,6 +1787,8 @@ MUI_STRING ukUAStrings[] = " ƒ®â®¢®..."}, {STRING_REBOOTCOMPUTER2, " ENTER = ¥à¥§ ¢ ­â ¦¨â¨ ª®¬¯'îâ¥à"}, + {STRING_REBOOTPROGRESSBAR, + " Your computer will reboot in %li second(s)... "}, {STRING_CONSOLEFAIL1, "¥ ¢¤ «®áì ¢i¤ªà¨â¨ ª®­á®«ì\r\n\r\n"}, {STRING_CONSOLEFAIL2, diff --git a/base/setup/usetup/mui.h b/base/setup/usetup/mui.h index 0219cde43af..707bb800761 100644 --- a/base/setup/usetup/mui.h +++ b/base/setup/usetup/mui.h @@ -159,3 +159,4 @@ MUIGetString( #define STRING_MB 54 #define STRING_GB 55 #define STRING_ADDKBLAYOUTS 56 +#define STRING_REBOOTPROGRESSBAR 64 diff --git a/base/setup/usetup/usetup.c b/base/setup/usetup/usetup.c index 1a7940c6e3d..102db35f6d6 100644 --- a/base/setup/usetup/usetup.c +++ b/base/setup/usetup/usetup.c @@ -4502,6 +4502,195 @@ BootLoaderHarddiskMbrPage(PINPUT_RECORD Ir) } +/** + * @name ProgressTimeOutStringHandler + * + * Handles the generation (displaying) of the timeout + * countdown to the screen dynamically. + * + * @param Bar + * A pointer to a progress bar. + * + * @param AlwaysUpdate + * Constantly update the progress bar (boolean type). + * + * @param Buffer + * A pointer to a string buffer. + * + * @param cchBufferSize + * The buffer's size in number of characters. + * + * @return + * TRUE or FALSE on function termination. + * + */ +static +BOOLEAN NTAPI +ProgressTimeOutStringHandler( + IN PPROGRESSBAR Bar, + IN BOOLEAN AlwaysUpdate, + OUT PSTR Buffer, + IN SIZE_T cchBufferSize) +{ + ULONG OldProgress = Bar->Progress; + + if (Bar->StepCount == 0) + { + Bar->Progress = 0; + } + else + { + Bar->Progress = Bar->StepCount - Bar->CurrentStep; + } + + /* Build the progress string if it has changed */ + if (Bar->ProgressFormatText && + (AlwaysUpdate || (Bar->Progress != OldProgress))) + { + RtlStringCchPrintfA(Buffer, cchBufferSize, + Bar->ProgressFormatText, Bar->Progress); + + return TRUE; + } + + return FALSE; +} + +/** + * @name ProgressCountdown + * + * Displays and draws a red-coloured progress bar with a countdown. + * When the timeout is reached, the flush page is displayed for reboot. + * + * @param Ir + * A pointer to an input keyboard record. + * + * @param TimeOut + * Initial countdown value in seconds. + * + * @return + * Nothing. + * + */ +static VOID +ProgressCountdown( + IN PINPUT_RECORD Ir, + IN LONG TimeOut) +{ + NTSTATUS Status; + ULONG StartTime; + LONG TimeElapsed; + LONG TimerValue = TimeOut, OldTimerValue; + LARGE_INTEGER Timeout; + PPROGRESSBAR ProgressBar; + BOOLEAN RefreshProgress = TRUE; + + /* Bail out if the timeout is already zero */ + if (TimeOut <= 0) + return; + + /* Create the timeout progress bar and set it up */ + ProgressBar = CreateProgressBarEx(13, + 26, + xScreen - 13, + yScreen - 20, + 10, + 24, + TRUE, + FOREGROUND_RED | BACKGROUND_BLUE, + TimerValue, + NULL, + MUIGetString(STRING_REBOOTPROGRESSBAR), + ProgressTimeOutStringHandler); + + StartTime = NtGetTickCount(); + CONSOLE_Flush(); + + OldTimerValue = TimerValue; + while (TRUE) + { + /* Decrease the timer */ + + /* + * Compute how much time the previous operations took. + * This allows us in particular to take account for any time + * elapsed if something slowed down. + */ + TimeElapsed = NtGetTickCount() - StartTime; + if (TimeElapsed >= 1000) + { + /* Increase StartTime by steps of 1 second */ + TimeElapsed /= 1000; + StartTime += (1000 * TimeElapsed); + + if (TimeElapsed <= TimerValue) + TimerValue -= TimeElapsed; + else + TimerValue = 0; + + RefreshProgress = TRUE; + } + + if (RefreshProgress) + { + ProgressSetStep(ProgressBar, OldTimerValue - TimerValue); + RefreshProgress = FALSE; + } + + /* Stop when the timer reaches zero */ + if (TimerValue <= 0) + break; + + /* Check for user key presses */ + + /* + * If the timer is used, use a passive wait of maximum 1 second + * while monitoring for incoming console input events, so that + * we are still able to display the timing count. + */ + + /* Wait a maximum of 1 second for input events */ + TimeElapsed = NtGetTickCount() - StartTime; + if (TimeElapsed < 1000) + { + /* Convert the time to NT Format */ + Timeout.QuadPart = (1000 - TimeElapsed) * -10000LL; + Status = NtWaitForSingleObject(StdInput, FALSE, &Timeout); + } + else + { + Status = STATUS_TIMEOUT; + } + + /* Check whether the input event has been signaled, or a timeout happened */ + if (Status == STATUS_TIMEOUT) + { + continue; + } + if (Status != STATUS_WAIT_0) + { + /* An error happened, bail out */ + DPRINT1("NtWaitForSingleObject() failed, Status 0x%08lx\n", Status); + break; + } + + /* Check for an ENTER key press */ + while (CONSOLE_ConInKeyPeek(Ir)) + { + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + /* Found it, stop waiting */ + goto Exit; + } + } + } + +Exit: + /* Destroy the progress bar and quit */ + DestroyProgressBar(ProgressBar); +} + + /* * Displays the QuitPage. * @@ -4572,15 +4761,9 @@ QuitPage(PINPUT_RECORD Ir) CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2)); - while (TRUE) - { - CONSOLE_ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return FLUSH_PAGE; - } - } + /* Wait for maximum 15 seconds or an ENTER key before quitting */ + ProgressCountdown(Ir, 15); + return FLUSH_PAGE; } @@ -4602,19 +4785,11 @@ SuccessPage(PINPUT_RECORD Ir) MUIDisplayPage(SUCCESS_PAGE); if (IsUnattendedSetup) - { return FLUSH_PAGE; - } - while (TRUE) - { - CONSOLE_ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return FLUSH_PAGE; - } - } + /* Wait for maximum 15 seconds or an ENTER key before quitting */ + ProgressCountdown(Ir, 15); + return FLUSH_PAGE; } -- 2.17.1