223 lines
4.8 KiB
C
223 lines
4.8 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|