- 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.
" \83®â®¢®..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = \8f१ ¯ã᪠¥ ª®¬¯îâêà "},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"\8e⢠àï¥â® ª®§®« â ¥ ¥¢ê§¬®¦®\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" 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,
" Hotovo..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Restartovat po\9f¡ta\9f"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Nelze otevý¡t konzoli\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Udf\9brt..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Genstart"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Kunne ikke \86bne konsollen\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Fertig..."},
{STRING_REBOOTCOMPUTER2,
" EINGABETASTE = Computer neu starten"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Konsole konnte nicht ge\94ffnet werden\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" \8e¢¦¡¢\9e¨é\9f\9e¡\9c..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = \84§\9c¤ ¡¡å¤\9e©\9e ¬§¦¢¦\9a ©«ã"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"\80\9bç¤\98«¦ ¤\98 \98¤¦ ®«\9cå \9e ¡¦¤©æ¢\98\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" 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,
" 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,
" Valmis..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Taask\84ivita arvuti"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Konsooli ei ännestunud avada\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Termin\82..."},
{STRING_REBOOTCOMPUTER2,
" ENTR\90E = Red\82marrer 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,
" \91\89\85\8d..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = \84\94\92\8c \8e\87\83\99 \80\9a \84\8e\99\81"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Unable to open the console\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" 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,
" ¶ÝØ®³..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = ºÝËß°ÀÉ »²·ÄÞ³"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"ºÝ¿°Ù¦ µ°ÌßÝ Ã޷ϾÝ\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" 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,
" 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,
" 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,
" 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,
" 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,
" 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,
" \87 ¢¥à襮..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = \8f¥à¥§ £à㧪 "},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"\8d¥ 㤠«®áì ®âªàëâì ª®á®«ì\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Hotovo..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Reçtart po\9f¡ta\9fa"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Nemo§no otvori\9c konzolu\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Mbaruam..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Ristarto kompjuterin"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"N\89 pamundesi p\89r t\89 hapur konsollin\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" F\84rdigt..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = Starta om datorn"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Det g\86r inte \94ppna Konsollen\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" Bitti..."},
{STRING_REBOOTCOMPUTER2,
" Giri\9f = Bilgisayar\8d Yeniden Ba\9flat"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"Konsol a\87\8dlam\8dyor.\r\n\r\n"},
{STRING_CONSOLEFAIL2,
" \83®â®¢®..."},
{STRING_REBOOTCOMPUTER2,
" ENTER = \8f¥à¥§ ¢ â ¦¨â¨ ª®¬¯'îâ¥à"},
+ {STRING_REBOOTPROGRESSBAR,
+ " Your computer will reboot in %li second(s)... "},
{STRING_CONSOLEFAIL1,
"\8d¥ ¢¤ «®áì ¢i¤ªà¨â¨ ª®á®«ì\r\n\r\n"},
{STRING_CONSOLEFAIL2,
#define STRING_MB 54
#define STRING_GB 55
#define STRING_ADDKBLAYOUTS 56
+#define STRING_REBOOTPROGRESSBAR 64
}
+/**
+ * @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.
*
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;
}
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;
}