Use nat/windows-nat function indirection code
authorTom Tromey <tromey@adacore.com>
Fri, 30 Apr 2021 16:22:23 +0000 (10:22 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 30 Apr 2021 16:22:24 +0000 (10:22 -0600)
This changes gdbserver to use the function indirection code that was
just moved into nat/windows-nat.[ch].  One additional function is used
by gdbserver that was not used by gdb.

gdb/ChangeLog
2021-04-30  Tom Tromey  <tromey@adacore.com>

* nat/windows-nat.h (GenerateConsoleCtrlEvent): New define.
(GenerateConsoleCtrlEvent_ftype, GenerateConsoleCtrlEvent):
Declare.
* nat/windows-nat.c (GenerateConsoleCtrlEvent): Define.
(initialize_loadable): Initialize GenerateConsoleCtrlEvent.

gdbserver/ChangeLog
2021-04-30  Tom Tromey  <tromey@adacore.com>

* win32-low.cc (GETPROCADDRESS): Remove.
(winapi_DebugActiveProcessStop, winapi_DebugSetProcessKillOnExit)
(winapi_DebugBreakProcess, winapi_GenerateConsoleCtrlEvent)
(winapi_Wow64SetThreadContext, win32_Wow64GetThreadContext)
(win32_Wow64SetThreadContext): Remove.
(win32_set_thread_context, do_initial_child_stuff)
(win32_process_target::attach, win32_process_target::detach):
Update.
(winapi_EnumProcessModules, winapi_EnumProcessModulesEx)
(winapi_GetModuleInformation, winapi_GetModuleInformationA):
Remove.
(win32_EnumProcessModules, win32_EnumProcessModulesEx)
(win32_GetModuleInformation, win32_GetModuleInformationA):
Remove.
(load_psapi): Remove.
(win32_add_dll, win32_process_target::request_interrupt): Update.
(initialize_low): Call initialize_loadable.

gdb/ChangeLog
gdb/nat/windows-nat.c
gdb/nat/windows-nat.h
gdbserver/ChangeLog
gdbserver/win32-low.cc

index 621a5db1cf50d4f5818c9b2e49a5f2d21ad3a038..6f1f66876f8cdfcec07efe0ce6c1d3c32459931f 100644 (file)
@@ -1,3 +1,11 @@
+2021-04-30  Tom Tromey  <tromey@adacore.com>
+
+       * nat/windows-nat.h (GenerateConsoleCtrlEvent): New define.
+       (GenerateConsoleCtrlEvent_ftype, GenerateConsoleCtrlEvent):
+       Declare.
+       * nat/windows-nat.c (GenerateConsoleCtrlEvent): Define.
+       (initialize_loadable): Initialize GenerateConsoleCtrlEvent.
+
 2021-04-30  Tom Tromey  <tromey@adacore.com>
 
        * windows-nat.c: Move code to nat/windows-nat.[ch].
index fa1ae9597e13bcadb54d11a38ef72e04a04f6707..1bc3fca3cc335edfcbae72e762bf56629dda2584 100644 (file)
@@ -66,7 +66,7 @@ Wow64GetThreadContext_ftype *Wow64GetThreadContext;
 Wow64SetThreadContext_ftype *Wow64SetThreadContext;
 Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry;
 #endif
-
+GenerateConsoleCtrlEvent_ftype *GenerateConsoleCtrlEvent;
 
 /* Note that 'debug_events' must be locally defined in the relevant
    functions.  */
@@ -469,6 +469,7 @@ initialize_loadable ()
       GPA (hm, Wow64SetThreadContext);
       GPA (hm, Wow64GetThreadSelectorEntry);
 #endif
+      GPA (hm, GenerateConsoleCtrlEvent);
     }
 
   /* Set variables to dummy versions of these processes if the function
index fafa65dda30657645d02e983fb616404a2aa3c06..c7ef00ea30b9179fbc3480f97fb35eb4ee96965b 100644 (file)
@@ -275,6 +275,7 @@ extern BOOL wait_for_debug_event (DEBUG_EVENT *event, DWORD timeout);
 #define Wow64GetThreadContext          dyn_Wow64GetThreadContext
 #define Wow64SetThreadContext          dyn_Wow64SetThreadContext
 #define Wow64GetThreadSelectorEntry    dyn_Wow64GetThreadSelectorEntry
+#define GenerateConsoleCtrlEvent       dyn_GenerateConsoleCtrlEvent
 
 typedef BOOL WINAPI (AdjustTokenPrivileges_ftype) (HANDLE, BOOL,
                                                   PTOKEN_PRIVILEGES,
@@ -342,6 +343,9 @@ typedef BOOL WINAPI (Wow64GetThreadSelectorEntry_ftype) (HANDLE, DWORD,
 extern Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry;
 #endif
 
+typedef BOOL WINAPI (GenerateConsoleCtrlEvent_ftype) (DWORD, DWORD);
+extern GenerateConsoleCtrlEvent_ftype *GenerateConsoleCtrlEvent;
+
 /* Load any functions which may not be available in ancient versions
    of Windows.  */
 
index 08c0475e7136d1f12236b094f28f0ba4f919e23c..86e87c54edaf0674a2b09cab720766d52ba90f46 100644 (file)
@@ -1,3 +1,23 @@
+2021-04-30  Tom Tromey  <tromey@adacore.com>
+
+       * win32-low.cc (GETPROCADDRESS): Remove.
+       (winapi_DebugActiveProcessStop, winapi_DebugSetProcessKillOnExit)
+       (winapi_DebugBreakProcess, winapi_GenerateConsoleCtrlEvent)
+       (winapi_Wow64SetThreadContext, win32_Wow64GetThreadContext)
+       (win32_Wow64SetThreadContext): Remove.
+       (win32_set_thread_context, do_initial_child_stuff)
+       (win32_process_target::attach, win32_process_target::detach):
+       Update.
+       (winapi_EnumProcessModules, winapi_EnumProcessModulesEx)
+       (winapi_GetModuleInformation, winapi_GetModuleInformationA):
+       Remove.
+       (win32_EnumProcessModules, win32_EnumProcessModulesEx)
+       (win32_GetModuleInformation, win32_GetModuleInformationA):
+       Remove.
+       (load_psapi): Remove.
+       (win32_add_dll, win32_process_target::request_interrupt): Update.
+       (initialize_low): Call initialize_loadable.
+
 2021-04-14  Tom Tromey  <tromey@adacore.com>
 
        * win32-low.cc (windows_nat::handle_load_dll): Don't check
index 39a6848307acb74b9dd2370a1216134e819694de..d742ecd0d8fad995c90bb55b2e27774bedb20940 100644 (file)
@@ -62,9 +62,6 @@ using namespace windows_nat;
 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
 #endif
 
-#define GETPROCADDRESS(DLL, PROC) \
-  ((winapi_ ## PROC) GetProcAddress (DLL, #PROC))
-
 int using_threads = 1;
 
 /* Globals.  */
@@ -93,19 +90,6 @@ const struct target_desc *wow64_win32_tdesc;
 
 #define NUM_REGS (the_low_target.num_regs ())
 
-typedef BOOL (WINAPI *winapi_DebugActiveProcessStop) (DWORD dwProcessId);
-typedef BOOL (WINAPI *winapi_DebugSetProcessKillOnExit) (BOOL KillOnExit);
-typedef BOOL (WINAPI *winapi_DebugBreakProcess) (HANDLE);
-typedef BOOL (WINAPI *winapi_GenerateConsoleCtrlEvent) (DWORD, DWORD);
-
-#ifdef __x86_64__
-typedef BOOL (WINAPI *winapi_Wow64SetThreadContext) (HANDLE,
-                                                    const WOW64_CONTEXT *);
-
-winapi_Wow64GetThreadContext win32_Wow64GetThreadContext;
-static winapi_Wow64SetThreadContext win32_Wow64SetThreadContext;
-#endif
-
 static void win32_add_all_dlls (void);
 
 /* Get the thread ID from the current selected inferior (the current
@@ -144,7 +128,7 @@ win32_set_thread_context (windows_thread_info *th)
 {
 #ifdef __x86_64__
   if (wow64_process)
-    win32_Wow64SetThreadContext (th->h, &th->wow64_context);
+    Wow64SetThreadContext (th->h, &th->wow64_context);
   else
 #endif
     SetThreadContext (th->h, &th->context);
@@ -372,8 +356,8 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
   wow64_process = wow64;
 
   if (wow64_process
-      && (win32_Wow64GetThreadContext == nullptr
-         || win32_Wow64SetThreadContext == nullptr))
+      && (Wow64GetThreadContext == nullptr
+         || Wow64SetThreadContext == nullptr))
     error ("WOW64 debugging is not supported on this system.\n");
 
   ignore_first_breakpoint = !attached && wow64_process;
@@ -704,18 +688,14 @@ int
 win32_process_target::attach (unsigned long pid)
 {
   HANDLE h;
-  winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL;
   DWORD err;
-  HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
-  DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit);
 
   h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
   if (h != NULL)
     {
       if (DebugActiveProcess (pid))
        {
-         if (DebugSetProcessKillOnExit != NULL)
-           DebugSetProcessKillOnExit (FALSE);
+         DebugSetProcessKillOnExit (FALSE);
 
          /* win32_wait needs to know we're attaching.  */
          attaching = 1;
@@ -822,23 +802,11 @@ win32_process_target::kill (process_info *process)
 int
 win32_process_target::detach (process_info *process)
 {
-  winapi_DebugActiveProcessStop DebugActiveProcessStop = NULL;
-  winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL;
-  HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
-  DebugActiveProcessStop = GETPROCADDRESS (dll, DebugActiveProcessStop);
-  DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit);
-
-  if (DebugSetProcessKillOnExit == NULL
-      || DebugActiveProcessStop == NULL)
-    return -1;
-
-  {
-    struct thread_resume resume;
-    resume.thread = minus_one_ptid;
-    resume.kind = resume_continue;
-    resume.sig = 0;
-    this->resume (&resume, 1);
-  }
+  struct thread_resume resume;
+  resume.thread = minus_one_ptid;
+  resume.kind = resume_continue;
+  resume.sig = 0;
+  this->resume (&resume, 1);
 
   if (!DebugActiveProcessStop (current_process_id))
     return -1;
@@ -1019,58 +987,6 @@ win32_add_one_solib (const char *name, CORE_ADDR load_addr)
   loaded_dll (buf2, load_addr);
 }
 
-typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *,
-                                                 DWORD, LPDWORD);
-#ifdef __x86_64__
-typedef BOOL (WINAPI *winapi_EnumProcessModulesEx) (HANDLE, HMODULE *, DWORD,
-                                                   LPDWORD, DWORD);
-#endif
-typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE,
-                                                   LPMODULEINFO, DWORD);
-typedef DWORD (WINAPI *winapi_GetModuleFileNameExA) (HANDLE, HMODULE,
-                                                    LPSTR, DWORD);
-
-static winapi_EnumProcessModules win32_EnumProcessModules;
-#ifdef __x86_64__
-static winapi_EnumProcessModulesEx win32_EnumProcessModulesEx;
-#endif
-static winapi_GetModuleInformation win32_GetModuleInformation;
-static winapi_GetModuleFileNameExA win32_GetModuleFileNameExA;
-
-static BOOL
-load_psapi (void)
-{
-  static int psapi_loaded = 0;
-  static HMODULE dll = NULL;
-
-  if (!psapi_loaded)
-    {
-      psapi_loaded = 1;
-      dll = LoadLibrary (TEXT("psapi.dll"));
-      if (!dll)
-       return FALSE;
-      win32_EnumProcessModules =
-             GETPROCADDRESS (dll, EnumProcessModules);
-#ifdef __x86_64__
-      win32_EnumProcessModulesEx =
-             GETPROCADDRESS (dll, EnumProcessModulesEx);
-#endif
-      win32_GetModuleInformation =
-             GETPROCADDRESS (dll, GetModuleInformation);
-      win32_GetModuleFileNameExA =
-             GETPROCADDRESS (dll, GetModuleFileNameExA);
-    }
-
-#ifdef __x86_64__
-  if (wow64_process && win32_EnumProcessModulesEx == nullptr)
-    return FALSE;
-#endif
-
-  return (win32_EnumProcessModules != NULL
-         && win32_GetModuleInformation != NULL
-         && win32_GetModuleFileNameExA != NULL);
-}
-
 /* Iterate over all DLLs currently mapped by our inferior, looking for
    a DLL loaded at LOAD_ADDR; if found, return its file name,
    otherwise return NULL.  If LOAD_ADDR is NULL, add all mapped DLLs
@@ -1085,23 +1001,20 @@ win32_add_dll (LPVOID load_addr)
   DWORD cbNeeded;
   BOOL ok;
 
-  if (!load_psapi ())
-    return NULL;
-
   cbNeeded = 0;
 #ifdef __x86_64__
   if (wow64_process)
-    ok = (*win32_EnumProcessModulesEx) (current_process_handle,
-                                       DllHandle,
-                                       sizeof (HMODULE),
-                                       &cbNeeded,
-                                       LIST_MODULES_32BIT);
+    ok = EnumProcessModulesEx (current_process_handle,
+                              DllHandle,
+                              sizeof (HMODULE),
+                              &cbNeeded,
+                              LIST_MODULES_32BIT);
   else
 #endif
-    ok = (*win32_EnumProcessModules) (current_process_handle,
-                                     DllHandle,
-                                     sizeof (HMODULE),
-                                     &cbNeeded);
+    ok = EnumProcessModules (current_process_handle,
+                            DllHandle,
+                            sizeof (HMODULE),
+                            &cbNeeded);
 
   if (!ok || !cbNeeded)
     return NULL;
@@ -1112,17 +1025,17 @@ win32_add_dll (LPVOID load_addr)
 
 #ifdef __x86_64__
   if (wow64_process)
-    ok = (*win32_EnumProcessModulesEx) (current_process_handle,
-                                       DllHandle,
-                                       cbNeeded,
-                                       &cbNeeded,
-                                       LIST_MODULES_32BIT);
+    ok = EnumProcessModulesEx (current_process_handle,
+                              DllHandle,
+                              cbNeeded,
+                              &cbNeeded,
+                              LIST_MODULES_32BIT);
   else
 #endif
-    ok = (*win32_EnumProcessModules) (current_process_handle,
-                                     DllHandle,
-                                     cbNeeded,
-                                     &cbNeeded);
+    ok = EnumProcessModules (current_process_handle,
+                            DllHandle,
+                            cbNeeded,
+                            &cbNeeded);
   if (!ok)
     return NULL;
 
@@ -1162,15 +1075,15 @@ win32_add_dll (LPVOID load_addr)
       MODULEINFO mi;
       static char dll_name[MAX_PATH];
 
-      if (!(*win32_GetModuleInformation) (current_process_handle,
-                                         DllHandle[i],
-                                         &mi,
-                                         sizeof (mi)))
+      if (!GetModuleInformation (current_process_handle,
+                                DllHandle[i],
+                                &mi,
+                                sizeof (mi)))
        continue;
-      if ((*win32_GetModuleFileNameExA) (current_process_handle,
-                                        DllHandle[i],
-                                        dll_name,
-                                        MAX_PATH) == 0)
+      if (GetModuleFileNameExA (current_process_handle,
+                               DllHandle[i],
+                               dll_name,
+                               MAX_PATH) == 0)
        continue;
 
       if (load_addr != nullptr && mi.lpBaseOfDll != load_addr)
@@ -1611,15 +1524,7 @@ win32_process_target::write_memory (CORE_ADDR memaddr,
 void
 win32_process_target::request_interrupt ()
 {
-  winapi_DebugBreakProcess DebugBreakProcess;
-  winapi_GenerateConsoleCtrlEvent GenerateConsoleCtrlEvent;
-
-  HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
-
-  GenerateConsoleCtrlEvent = GETPROCADDRESS (dll, GenerateConsoleCtrlEvent);
-
-  if (GenerateConsoleCtrlEvent != NULL
-      && GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, current_process_id))
+  if (GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, current_process_id))
     return;
 
   /* GenerateConsoleCtrlEvent can fail if process id being debugged is
@@ -1627,10 +1532,7 @@ win32_process_target::request_interrupt ()
      Fallback to XP/Vista 'DebugBreakProcess', which generates a
      breakpoint exception in the interior process.  */
 
-  DebugBreakProcess = GETPROCADDRESS (dll, DebugBreakProcess);
-
-  if (DebugBreakProcess != NULL
-      && DebugBreakProcess (current_process_handle))
+  if (DebugBreakProcess (current_process_handle))
     return;
 
   /* Last resort, suspend all threads manually.  */
@@ -1761,11 +1663,5 @@ initialize_low (void)
   set_target_ops (&the_win32_target);
   the_low_target.arch_setup ();
 
-#ifdef __x86_64__
-  /* These functions are loaded dynamically, because they are not available
-     on Windows XP.  */
-  HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
-  win32_Wow64GetThreadContext = GETPROCADDRESS (dll, Wow64GetThreadContext);
-  win32_Wow64SetThreadContext = GETPROCADDRESS (dll, Wow64SetThreadContext);
-#endif
+  initialize_loadable ();
 }