IN UINTN NumberOfBytes\r
)\r
{\r
- return 0;\r
+ BOOL Success;\r
+ DWORD CharCount;\r
+\r
+ CharCount = (DWORD)NumberOfBytes;\r
+ Success = WriteFile (\r
+ GetStdHandle (STD_ERROR_HANDLE),\r
+ Buffer,\r
+ CharCount,\r
+ &CharCount,\r
+ NULL\r
+ );\r
+\r
+ return Success ? CharCount : 0;\r
}\r
\r
\r
VOID\r
)\r
{\r
- return EFI_SUCCESS;\r
+ BOOL Success;\r
+ DWORD Mode;\r
+\r
+ Success = GetConsoleMode (GetStdHandle (STD_INPUT_HANDLE), &Mode);\r
+ if (Success) {\r
+ //\r
+ // Disable buffer (line input), echo, mouse, window\r
+ //\r
+ Success = SetConsoleMode (\r
+ GetStdHandle (STD_INPUT_HANDLE),\r
+ Mode | ENABLE_VIRTUAL_TERMINAL_INPUT & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)\r
+ );\r
+ }\r
+ if (Success) {\r
+ //\r
+ // Enable terminal mode\r
+ //\r
+ Success = GetConsoleMode (GetStdHandle (STD_OUTPUT_HANDLE), &Mode);\r
+ if (Success) {\r
+ Success = SetConsoleMode (\r
+ GetStdHandle (STD_OUTPUT_HANDLE),\r
+ Mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN\r
+ );\r
+ }\r
+ }\r
+ return Success ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
}\r
\r
UINTN\r
IN UINTN NumberOfBytes\r
)\r
{\r
- return 0;\r
+ BOOL Success;\r
+ DWORD CharCount;\r
+\r
+ CharCount = (DWORD)NumberOfBytes;\r
+ Success = WriteFile (\r
+ GetStdHandle (STD_OUTPUT_HANDLE),\r
+ Buffer,\r
+ CharCount,\r
+ &CharCount,\r
+ NULL\r
+ );\r
+\r
+ return Success ? CharCount : 0;\r
}\r
\r
BOOLEAN\r
VOID\r
)\r
{\r
+ BOOL Success;\r
+ INPUT_RECORD Record;\r
+ DWORD RecordNum;\r
+\r
+ do {\r
+ Success = GetNumberOfConsoleInputEvents (GetStdHandle (STD_INPUT_HANDLE), &RecordNum);\r
+ if (!Success || (RecordNum == 0)) {\r
+ break;\r
+ }\r
+ Success = PeekConsoleInput (\r
+ GetStdHandle (STD_INPUT_HANDLE),\r
+ &Record,\r
+ 1,\r
+ &RecordNum\r
+ );\r
+ if (Success && (RecordNum == 1)) {\r
+ if (Record.EventType == KEY_EVENT && Record.Event.KeyEvent.bKeyDown) {\r
+ return TRUE;\r
+ } else {\r
+ //\r
+ // Consume the non-key event.\r
+ //\r
+ Success = ReadConsoleInput (\r
+ GetStdHandle (STD_INPUT_HANDLE),\r
+ &Record,\r
+ 1,\r
+ &RecordNum\r
+ );\r
+ }\r
+ }\r
+ } while (Success);\r
+\r
return FALSE;\r
}\r
\r
IN UINTN NumberOfBytes\r
)\r
{\r
- return 0;\r
+ BOOL Success;\r
+ INPUT_RECORD Record;\r
+ DWORD RecordNum;\r
+ UINTN BytesReturn;\r
+\r
+ if (!SecPollStdIn ()) {\r
+ return 0;\r
+ }\r
+ Success = ReadConsoleInput (\r
+ GetStdHandle (STD_INPUT_HANDLE),\r
+ &Record,\r
+ 1,\r
+ &RecordNum\r
+ );\r
+ ASSERT (Success && (RecordNum == 1) && (Record.EventType == KEY_EVENT) && (Record.Event.KeyEvent.bKeyDown));\r
+ NumberOfBytes = MIN (Record.Event.KeyEvent.wRepeatCount, NumberOfBytes);\r
+ BytesReturn = NumberOfBytes;\r
+ while (NumberOfBytes-- != 0) {\r
+ Buffer[NumberOfBytes] = Record.Event.KeyEvent.uChar.AsciiChar;\r
+ }\r
+ return BytesReturn;\r
}\r
\r
\r