[PATCH 2/5] [Kernel32]: properly manage ctrl-Z (and ctrl-D) in ReadFile when dealing with a console handle

Eric Pouech eric.pouech at orange.fr
Sun Nov 28 15:10:43 CST 2010




A+
---

 dlls/kernel32/file.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)


diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index e32d75d..67c886e 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -406,7 +406,23 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
     if (!bytesToRead) return TRUE;
 
     if (is_console_handle(hFile))
-        return ReadConsoleA(hFile, buffer, bytesToRead, bytesRead, NULL);
+    {
+        DWORD conread, mode;
+        if (!ReadConsoleA(hFile, buffer, bytesToRead, &conread, NULL) ||
+            !GetConsoleMode(hFile, &mode))
+            return FALSE;
+        /* ctrl-Z (26) means end of file on window (if at beginning of buffer)
+         * but Unix uses ctrl-D (4), and ctrl-Z is a bad idea on Unix :-/
+         * So map both ctrl-D ctrl-Z to EOF.
+         */
+        if ((mode & ENABLE_PROCESSED_INPUT) && conread > 0 &&
+            (((char*)buffer)[0] == 26 || ((char*)buffer)[0] == 4))
+        {
+            conread = 0;
+        }
+        if (bytesRead) *bytesRead = conread;
+        return TRUE;
+    }
 
     if (overlapped != NULL)
     {




More information about the wine-patches mailing list