_getch() doesn't echo the chars it retrieves and operates in raw mode.
Modified: trunk/reactos/lib/crt/conio/getch.c

Modified: trunk/reactos/lib/crt/conio/getch.c
--- trunk/reactos/lib/crt/conio/getch.c	2005-09-17 22:00:35 UTC (rev 17903)
+++ trunk/reactos/lib/crt/conio/getch.c	2005-09-17 22:33:53 UTC (rev 17904)
@@ -20,21 +20,41 @@
  */
 int _getch(void)
 {
-    DWORD  NumberOfCharsRead = 0;
+    DWORD NumberOfCharsRead = 0;
     char c;
+    HANDLE ConsoleHandle;
+    BOOL RestoreMode;
+    DWORD ConsoleMode;
+
     if (char_avail) {
         c = ungot_char;
         char_avail = 0;
     } else {
+        /*
+         * _getch() is documented to NOT echo characters. Testing shows it
+         * doesn't wait for a CR either. So we need to switch off
+         * ENABLE_ECHO_INPUT and ENABLE_LINE_INPUT if they're currently
+         * switched on.
+         */
+        ConsoleHandle = (HANDLE) _get_osfhandle(stdin->_file);
+        RestoreMode = GetConsoleMode(ConsoleHandle, &ConsoleMode) &&
+                      (0 != (ConsoleMode &
+                             (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT)));
+        if (RestoreMode) {
+            SetConsoleMode(ConsoleHandle,
+                           ConsoleMode & (~ (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT)));
+        }
         ReadConsoleA((HANDLE)_get_osfhandle(stdin->_file),
 		             &c,
 		             1,
 		             &NumberOfCharsRead,
 		             NULL);
+        if (RestoreMode) {
+            SetConsoleMode(ConsoleHandle, ConsoleMode);
+        }
     }
     if (c == 10)
         c = 13;
-    putchar(c);
     return c;
 }