[PATCH] Cygwin: pty: Add missing console API hooks.

Takashi Yano takashi.yano@nifty.ne.jp
Thu Jan 23 04:33:00 GMT 2020


- Following console APIs are additionally hooked for cygwin programs
  which directly call them.
  * FillConsoleOutputAttribute()
  * FillConsoleOutputCharacterA()
  * FillConsoleOutputCharacterW()
  * ScrollConsoleScreenBufferA()
  * ScrollConsoleScreenBufferW()
---
 winsup/cygwin/fhandler_tty.cc | 55 +++++++++++++++++++++++++++++++++--
 1 file changed, 53 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 404216bf6..05070aa3b 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -192,6 +192,11 @@ DEF_HOOK (ReadConsoleInputA);
 DEF_HOOK (ReadConsoleInputW);
 DEF_HOOK (PeekConsoleInputA);
 DEF_HOOK (PeekConsoleInputW);
+DEF_HOOK (FillConsoleOutputAttribute);
+DEF_HOOK (FillConsoleOutputCharacterA);
+DEF_HOOK (FillConsoleOutputCharacterW);
+DEF_HOOK (ScrollConsoleScreenBufferA);
+DEF_HOOK (ScrollConsoleScreenBufferW);
 /* CreateProcess() is hooked for GDB etc. */
 DEF_HOOK (CreateProcessA);
 DEF_HOOK (CreateProcessW);
@@ -329,6 +334,43 @@ PeekConsoleInputW_Hooked
   set_ishybrid_and_switch_to_pcon (h);
   return PeekConsoleInputW_Orig (h, r, l, n);
 }
+static BOOL WINAPI
+FillConsoleOutputAttribute_Hooked
+     (HANDLE h, WORD a, DWORD l, COORD d, LPDWORD n)
+{
+  set_ishybrid_and_switch_to_pcon (h);
+  return FillConsoleOutputAttribute_Orig (h, a, l, d, n);
+}
+static BOOL WINAPI
+FillConsoleOutputCharacterA_Hooked
+     (HANDLE h, CHAR c, DWORD l, COORD d, LPDWORD n)
+{
+  set_ishybrid_and_switch_to_pcon (h);
+  return FillConsoleOutputCharacterA_Orig (h, c, l, d, n);
+}
+static BOOL WINAPI
+FillConsoleOutputCharacterW_Hooked
+     (HANDLE h, WCHAR c, DWORD l, COORD d, LPDWORD n)
+{
+  set_ishybrid_and_switch_to_pcon (h);
+  return FillConsoleOutputCharacterW_Orig (h, c, l, d, n);
+}
+static BOOL WINAPI
+ScrollConsoleScreenBufferA_Hooked
+     (HANDLE h, const SMALL_RECT *r, const SMALL_RECT *c, COORD d,
+      const CHAR_INFO *f)
+{
+  set_ishybrid_and_switch_to_pcon (h);
+  return ScrollConsoleScreenBufferA_Orig (h, r, c, d, f);
+}
+static BOOL WINAPI
+ScrollConsoleScreenBufferW_Hooked
+     (HANDLE h, const SMALL_RECT *r, const SMALL_RECT *c, COORD d,
+      const CHAR_INFO *f)
+{
+  set_ishybrid_and_switch_to_pcon (h);
+  return ScrollConsoleScreenBufferW_Orig (h, r, c, d, f);
+}
 /* CreateProcess() is hooked for GDB etc. */
 static BOOL WINAPI
 CreateProcessA_Hooked
@@ -2749,8 +2791,12 @@ fhandler_pty_slave::fixup_after_attach (bool native_maybe, int fd_set)
 		    (SHORT) (sbi.dwSize.X -1), (SHORT) (sbi.dwSize.Y - 1)};
 		  COORD dest = {0, 0};
 		  CHAR_INFO fill = {' ', 0};
-		  ScrollConsoleScreenBuffer (get_output_handle (),
-					     &rect, NULL, dest, &fill);
+		  BOOL (WINAPI *ScrollFunc)
+		    (HANDLE, const SMALL_RECT *, const SMALL_RECT *,
+		     COORD, const CHAR_INFO *);
+		  ScrollFunc = ScrollConsoleScreenBufferA_Orig ? :
+		    ScrollConsoleScreenBuffer;
+		  ScrollFunc (get_output_handle (), &rect, NULL, dest, &fill);
 		  get_ttyp ()->need_redraw_screen = false;
 		}
 	    }
@@ -2848,6 +2894,11 @@ fhandler_pty_slave::fixup_after_exec ()
       DO_HOOK (NULL, ReadConsoleInputW);
       DO_HOOK (NULL, PeekConsoleInputA);
       DO_HOOK (NULL, PeekConsoleInputW);
+      DO_HOOK (NULL, FillConsoleOutputAttribute);
+      DO_HOOK (NULL, FillConsoleOutputCharacterA);
+      DO_HOOK (NULL, FillConsoleOutputCharacterW);
+      DO_HOOK (NULL, ScrollConsoleScreenBufferA);
+      DO_HOOK (NULL, ScrollConsoleScreenBufferW);
       /* CreateProcess() is hooked for GDB etc. */
       DO_HOOK (NULL, CreateProcessA);
       DO_HOOK (NULL, CreateProcessW);
-- 
2.21.0



More information about the Cygwin-patches mailing list