windows-nt/Source/XPSP1/NT/base/boot/lib/hdlsterm.c

223 lines
4.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
hdlsterm.c
Abstract:
This modules implements stuff that is specific for headless terminal support.
Author:
Sean Selitrennikoff (v-seans) 1-13-00
Revision History:
--*/
#include "bldr.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "ntverp.h"
#include "bldrx86.h"
#define TERMINAL_LINE_LENGTH 70
BOOLEAN FirstEntry = TRUE;
UCHAR TerminalLine[TERMINAL_LINE_LENGTH];
ULONG LinePosition = 0;
#define TERMINAL_PROMPT "!SAC>"
BOOLEAN
BlpDoCommand(
IN PUCHAR InputLine
);
BOOLEAN
BlTerminalHandleLoaderFailure(
VOID
)
/*++
Routine Description:
Gives a mini-SAC to the user, return TRUE when the user wants a reboot.
Arguments:
None.
Return Value:
TRUE - When the user wants a reboot, else FALSE.
--*/
{
ULONG Count;
BOOLEAN Reboot;
ULONG Key;
if (!BlIsTerminalConnected()) {
return TRUE;
}
//
// Position the cursor to the bottom of the screen and write the prompt
//
if (FirstEntry) {
FirstEntry = FALSE;
BlPositionCursor(1, ScreenHeight);
ArcWrite(BlConsoleOutDeviceId, "\r\n", sizeof("\r\n"), &Count);
ArcWrite(BlConsoleOutDeviceId, TERMINAL_PROMPT, sizeof(TERMINAL_PROMPT), &Count);
}
//
// Check for input.
//
if (ArcGetReadStatus(BlConsoleInDeviceId) == ESUCCESS) {
Key = BlGetKey();
if (Key == ESCAPE_KEY) {
//
// Clear this line
//
ArcWrite(BlConsoleOutDeviceId, "\\", sizeof("\\"), &Count);
BlPositionCursor(1, ScreenHeight);
ArcWrite(BlConsoleOutDeviceId, "\r\n", sizeof("\r\n"), &Count);
ArcWrite(BlConsoleOutDeviceId, TERMINAL_PROMPT, sizeof(TERMINAL_PROMPT), &Count);
return FALSE;
}
if (Key == BKSP_KEY) {
if (LinePosition != 0) {
BlPositionCursor(LinePosition + sizeof(TERMINAL_PROMPT) - 1, ScreenHeight);
ArcWrite(BlConsoleOutDeviceId, " ", sizeof(" "), &Count);
BlPositionCursor(LinePosition + sizeof(TERMINAL_PROMPT) - 1, ScreenHeight);
LinePosition--;
TerminalLine[LinePosition] = '\0';
}
return FALSE;
}
if (Key == TAB_KEY) {
ArcWrite(BlConsoleOutDeviceId, "\007", sizeof("\007"), &Count);
return FALSE;
}
if (Key == ENTER_KEY) {
TerminalLine[LinePosition] = '\0';
ArcWrite(BlConsoleOutDeviceId, "\r\n", sizeof("\r\n"), &Count);
if (LinePosition != 0) {
Reboot = BlpDoCommand(TerminalLine);
} else {
Reboot = FALSE;
}
if (!Reboot) {
BlPositionCursor(1, ScreenHeight);
ArcWrite(BlConsoleOutDeviceId, "\r\n", sizeof("\r\n"), &Count);
ArcWrite(BlConsoleOutDeviceId, TERMINAL_PROMPT, sizeof(TERMINAL_PROMPT), &Count);
LinePosition = 0;
}
return Reboot;
}
//
// Ignore all other non-ASCII keys
//
if (Key != (ULONG)(Key & 0x7F)) {
return FALSE;
}
//
// All other keys get recorded.
//
TerminalLine[LinePosition] = (UCHAR)Key;
if (LinePosition < TERMINAL_LINE_LENGTH - 1) {
LinePosition++;
} else {
BlPositionCursor(LinePosition + sizeof(TERMINAL_PROMPT) - 1, ScreenHeight);
}
//
// Echo back to the console the character.
//
ArcWrite(BlConsoleOutDeviceId, &((UCHAR)Key), sizeof(UCHAR), &Count);
}
return FALSE;
}
BOOLEAN
BlpDoCommand(
IN PUCHAR InputLine
)
/*++
Routine Description:
Process an input line.
Arguments:
InputLine - The command from the user.
Return Value:
TRUE - When the user wants a reboot, else FALSE.
--*/
{
ULONG Count;
if ((_stricmp(InputLine, "?") == 0) ||
(_stricmp(InputLine, "help") == 0)) {
ArcWrite(BlConsoleOutDeviceId,
"? Display this message.\r\n",
sizeof("? Display this message.\r\n"),
&Count
);
ArcWrite(BlConsoleOutDeviceId,
"restart Restart the system immediately.\r\n",
sizeof("restart Restart the system immediately.\r\n"),
&Count
);
return FALSE;
}
if (_stricmp(InputLine, "restart") == 0) {
return TRUE;
}
ArcWrite(BlConsoleOutDeviceId,
"Invalid Command, use '?' for help.\r\n",
sizeof("Invalid Command, use '?' for help.\r\n"),
&Count
);
return FALSE;
}