|
|
/*++
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; }
|