#include <os/os.h>
#include <os/port.h>
#include <os/console.h>
#include <stdlib.h>
bool conGetLine(wchar_t* buffer, size_t max, bool echo)
{
wchar_t *ch = buffer, str[2] = { 0, 0 };
while (true)
{
*ch = conGetKey(true);
switch (*ch)
{
case 0:
break;
case '\n':
*ch = 0;
conWrite(L"\n");
return true;
case '\b':
if (ch > buffer)
{
conWrite(L"\b \b");
ch--;
}
break;
case 27:
return false;
default:
str[0] = *ch;
if (echo)
conWrite(str);
else
conWrite(L"*");
if (ch < buffer + max)
ch++;
}
}
}
void NtProcessStartup()
{
addr_t proc, port;
process_info_t *proc_info;
wchar_t user[128], pass[128];
/* Start the console server */
procLoad(L"console.exe", NULL, 16, NULL, NULL);
/*
* Keep trying to connect -- allow console to start up.
* Create a console for the login screen
*/
port = portCreate(L"init");
do
{
thrSleep(10);
} while (!portConnect(port, CONSOLE_PORT));
thrWaitHandle(&port, 1, true);
/* Assign our stdin/stdout */
proc_info = thrGetInfo()->process;
proc_info->stdin = proc_info->stdout = port;
while (true)
{
/* Display a banner and a login prompt */
conWrite(L"\x1b[2J"
L"\x1b[1;34H\x1b[30;42m The Möbius "
L"\x1b[4;5H\x1b[37;40mLogin:"
L"\x1b[5;2H\x1b[37;40mPassword:"
L"\x1b[4;12H");
if (!conGetLine(user, countof(user), true))
continue;
conWrite(L"\x1b[5;12H");
if (!conGetLine(pass, countof(pass), false))
continue;
conWrite(L"\n\n");
/* Start a new shell in this console and wait for it to finish */
proc = procLoad(L"short.exe", NULL, 16, NULL, NULL);
thrWaitHandle(&proc, 1, true);
}
procExit(0);
}