[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