[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.
This commit is contained in:
Bișoc George 2018-08-22 11:10:18 +02:00 committed by Hermès Bélusca-Maïto
parent 02da7b452c
commit e5c0bfacf1
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
27 changed files with 246 additions and 20 deletions

View file

@ -1792,6 +1792,8 @@ MUI_STRING bgBGStrings[] =
" ƒ®â®¢®..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = <20>१ ¯ã᪠­¥ ­  ª®¬¯îâêà "},
{STRING_REBOOTPROGRESSBAR,
" Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Žâ¢ àﭥ⮠­  ª®­§®« â  ¥ ­¥¢ê§¬®¦­®\r\n\r\n"},
{STRING_CONSOLEFAIL2,

View file

@ -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,

View file

@ -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,

View file

@ -1791,6 +1791,8 @@ MUI_STRING daDKStrings[] =
" Udfrt..."},
{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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -1796,6 +1796,8 @@ MUI_STRING frFRStrings[] =
" Termin..."},
{STRING_REBOOTCOMPUTER2,
" ENTR<54>E = Redmarrer 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,

View file

@ -1779,6 +1779,8 @@ MUI_STRING heILStrings[] =
" ‰…<E280B0>..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = „”’Œ އƒ™ €š „Ž™<C5BD>"},
{STRING_REBOOTPROGRESSBAR,
" Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Unable to open the console\r\n\r\n"},
{STRING_CONSOLEFAIL2,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -1778,6 +1778,8 @@ MUI_STRING ruRUStrings[] =
" ‡ ¢¥à襭®..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = <20>¥à¥§ £à㧪 "},
{STRING_REBOOTPROGRESSBAR,
" Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"<EFBFBD>¥ 㤠«®áì ®âªàëâì ª®­á®«ì\r\n\r\n"},
{STRING_CONSOLEFAIL2,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -1758,6 +1758,8 @@ MUI_STRING trTRStrings[] =
" Bitti..."},
{STRING_REBOOTCOMPUTER2,
" GiriŸ = Bilgisayar<61> Yeniden BaŸlat"},
{STRING_REBOOTPROGRESSBAR,
" Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Konsol a‡<61>lam<61>yor.\r\n\r\n"},
{STRING_CONSOLEFAIL2,

View file

@ -1787,6 +1787,8 @@ MUI_STRING ukUAStrings[] =
" ƒ®â®¢®..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = <20>¥à¥§ ¢ ­â ¦¨â¨ ª®¬¯'îâ¥à"},
{STRING_REBOOTPROGRESSBAR,
" Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"<EFBFBD>¥ ¢¤ «®áì ¢i¤ªà¨â¨ ª®­á®«ì\r\n\r\n"},
{STRING_CONSOLEFAIL2,

View file

@ -159,3 +159,4 @@ MUIGetString(
#define STRING_MB 54
#define STRING_GB 55
#define STRING_ADDKBLAYOUTS 56
#define STRING_REBOOTPROGRESSBAR 64

View file

@ -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;
}