]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmulatorPkg/Win/Host/WinThunk.c
EmulatorPkg/Win: Enable native OS console as firmware console
[mirror_edk2.git] / EmulatorPkg / Win / Host / WinThunk.c
index 5ec5d439d4f58582c4eef8fa9c2f31043a93a541..69a61258f3ed4c509a61b114d7ac67d30a100b21 100644 (file)
@@ -42,7 +42,19 @@ SecWriteStdErr (
   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
@@ -51,7 +63,32 @@ SecConfigStdIn (
   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
@@ -60,7 +97,19 @@ SecWriteStdOut (
   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
@@ -68,6 +117,38 @@ SecPollStdIn (
   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
@@ -77,7 +158,27 @@ SecReadStdIn (
   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