[newlib-cygwin] Cygwin: pty: Move function hook_api() into hookapi.cc.

Corinna Vinschen corinna@sourceware.org
Wed Sep 4 10:04:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=ffbb9b49711f6a8e3c4f83b226ff9476327dcb61

commit ffbb9b49711f6a8e3c4f83b226ff9476327dcb61
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Wed Sep 4 10:44:25 2019 +0900

    Cygwin: pty: Move function hook_api() into hookapi.cc.
    
    - PTY uses Win32 API hook for pseudo console suppot. The function
      hook_api() is used for this purpose and defined in fhandler_tty.cc
      previously. This patch moves it into hookapi.cc.

Diff:
---
 winsup/cygwin/fhandler_tty.cc | 44 -------------------------------------------
 winsup/cygwin/hookapi.cc      | 34 +++++++++++++++++++++++++++++++++
 winsup/cygwin/winsup.h        |  1 +
 3 files changed, 35 insertions(+), 44 deletions(-)

diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 94ef2f8..f76f7b2 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -75,50 +75,6 @@ static bool pcon_attached[NTTYS];
 static bool isHybrid;
 
 #if USE_API_HOOK
-/* Hook WIN32 API */
-static
-void *hook_api (const char *mname, const char *name, const void *fn)
-{
-  HMODULE hm = GetModuleHandle (mname);
-  PIMAGE_NT_HEADERS pExeNTHdr = PIMAGE_NT_HEADERS (PBYTE (hm)
-				   + PIMAGE_DOS_HEADER (hm)->e_lfanew);
-  DWORD importRVA = pExeNTHdr->OptionalHeader.DataDirectory
-    [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
-  PIMAGE_IMPORT_DESCRIPTOR pdfirst =
-    (PIMAGE_IMPORT_DESCRIPTOR) ((char *) hm + importRVA);
-  for (PIMAGE_IMPORT_DESCRIPTOR pd = pdfirst; pd->FirstThunk; pd++)
-    {
-      if (pd->OriginalFirstThunk == 0)
-	continue;
-      PIMAGE_THUNK_DATA pt =
-	(PIMAGE_THUNK_DATA) ((char *) hm + pd->FirstThunk);
-      PIMAGE_THUNK_DATA pn =
-	(PIMAGE_THUNK_DATA) ((char *) hm + pd->OriginalFirstThunk);
-      for (PIMAGE_THUNK_DATA pi = pt; pn->u1.Ordinal; pi++, pn++)
-	{
-	  if (IMAGE_SNAP_BY_ORDINAL (pn->u1.Ordinal))
-	    continue;
-	  PIMAGE_IMPORT_BY_NAME pimp =
-	    (PIMAGE_IMPORT_BY_NAME) ((char *) hm + pn->u1.AddressOfData);
-	  if (strcmp (name, (char *) pimp->Name) != 0)
-	    continue;
-#ifdef __x86_64__
-#define THUNK_FUNC_TYPE ULONGLONG
-#else
-#define THUNK_FUNC_TYPE DWORD
-#endif
-	  DWORD ofl = PAGE_READWRITE;
-	  if (!VirtualProtect (pi, sizeof (THUNK_FUNC_TYPE), ofl, &ofl))
-	    return NULL;
-	  void *origfn = (void *) pi->u1.Function;
-	  pi->u1.Function = (THUNK_FUNC_TYPE) fn;
-	  VirtualProtect (pi, sizeof (THUNK_FUNC_TYPE), ofl, &ofl);
-	  return origfn;
-	}
-    }
-  return NULL;
-}
-
 static void
 set_switch_to_pcon (void)
 {
diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc
index 4078e65..dcd9b1d 100644
--- a/winsup/cygwin/hookapi.cc
+++ b/winsup/cygwin/hookapi.cc
@@ -428,6 +428,40 @@ hook_or_detect_cygwin (const char *name, const void *fn, WORD& subsys, HANDLE h)
   return fh.origfn;
 }
 
+/* Hook a function in any DLL such as kernel32.dll */
+/* The DLL must be loaded in advance. */
+/* Used in fhandler_tty.cc */
+void *hook_api (const char *mname, const char *name, const void *fn)
+{
+  HMODULE hm = GetModuleHandle (mname);
+  PIMAGE_NT_HEADERS pExeNTHdr =
+    rva (PIMAGE_NT_HEADERS, hm, PIMAGE_DOS_HEADER (hm)->e_lfanew);
+  DWORD importRVA = pExeNTHdr->OptionalHeader.DataDirectory
+    [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
+  PIMAGE_IMPORT_DESCRIPTOR pdfirst =
+    rva (PIMAGE_IMPORT_DESCRIPTOR, hm, importRVA);
+  for (PIMAGE_IMPORT_DESCRIPTOR pd = pdfirst; pd->FirstThunk; pd++)
+    {
+      if (pd->OriginalFirstThunk == 0)
+	continue;
+      PIMAGE_THUNK_DATA pt = rva (PIMAGE_THUNK_DATA, hm, pd->FirstThunk);
+      PIMAGE_THUNK_DATA pn =
+	rva (PIMAGE_THUNK_DATA, hm, pd->OriginalFirstThunk);
+      for (PIMAGE_THUNK_DATA pi = pt; pn->u1.Ordinal; pi++, pn++)
+	{
+	  if (IMAGE_SNAP_BY_ORDINAL (pn->u1.Ordinal))
+	    continue;
+	  PIMAGE_IMPORT_BY_NAME pimp =
+	    rva (PIMAGE_IMPORT_BY_NAME, hm, pn->u1.AddressOfData);
+	  if (strcmp (name, (char *) pimp->Name) != 0)
+	    continue;
+	  void *origfn = putmem (pi, fn);
+	  return origfn;
+	}
+    }
+  return NULL;
+}
+
 void
 ld_preload ()
 {
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
index 95ab41e..ab7b3bb 100644
--- a/winsup/cygwin/winsup.h
+++ b/winsup/cygwin/winsup.h
@@ -199,6 +199,7 @@ ino_t __reg2 hash_path_name (ino_t hash, const char *name);
 void __reg2 nofinalslash (const char *src, char *dst);
 
 void __reg3 *hook_or_detect_cygwin (const char *, const void *, WORD&, HANDLE h = NULL);
+void __reg3 *hook_api (const char *mname, const char *name, const void *fn);
 
 /* Time related */
 void __stdcall totimeval (struct timeval *, PLARGE_INTEGER, int, int);



More information about the Cygwin-cvs mailing list