xref: /netbsd-src/external/gpl3/gdb.old/dist/gdbserver/win32-low.cc (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
1 /* Low level interface to Windows debugging, for gdbserver.
2    Copyright (C) 2006-2020 Free Software Foundation, Inc.
3 
4    Contributed by Leo Zayas.  Based on "win32-nat.c" from GDB.
5 
6    This file is part of GDB.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20 
21 #include "server.h"
22 #include "regcache.h"
23 #include "gdb/fileio.h"
24 #include "mem-break.h"
25 #include "win32-low.h"
26 #include "gdbthread.h"
27 #include "dll.h"
28 #include "hostio.h"
29 #include <windows.h>
30 #include <winnt.h>
31 #include <imagehlp.h>
32 #include <tlhelp32.h>
33 #include <psapi.h>
34 #include <process.h>
35 #include "gdbsupport/gdb_tilde_expand.h"
36 #include "gdbsupport/common-inferior.h"
37 #include "gdbsupport/gdb_wait.h"
38 
39 using namespace windows_nat;
40 
41 #ifndef USE_WIN32API
42 #include <sys/cygwin.h>
43 #endif
44 
45 #define OUTMSG(X) do { printf X; fflush (stderr); } while (0)
46 
47 #define OUTMSG2(X) \
48   do						\
49     {						\
50       if (debug_threads)			\
51 	{					\
52 	  printf X;				\
53 	  fflush (stderr);			\
54 	}					\
55     } while (0)
56 
57 #ifndef _T
58 #define _T(x) TEXT (x)
59 #endif
60 
61 #ifndef COUNTOF
62 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
63 #endif
64 
65 #ifdef _WIN32_WCE
66 # define GETPROCADDRESS(DLL, PROC) \
67   ((winapi_ ## PROC) GetProcAddress (DLL, TEXT (#PROC)))
68 #else
69 # define GETPROCADDRESS(DLL, PROC) \
70   ((winapi_ ## PROC) GetProcAddress (DLL, #PROC))
71 #endif
72 
73 int using_threads = 1;
74 
75 /* Globals.  */
76 static int attaching = 0;
77 
78 /* A status that hasn't been reported to the core yet, and so
79    win32_wait should return it next, instead of fetching the next
80    debug event off the win32 API.  */
81 static struct target_waitstatus cached_status;
82 
83 /* Non zero if an interrupt request is to be satisfied by suspending
84    all threads.  */
85 static int soft_interrupt_requested = 0;
86 
87 /* Non zero if the inferior is stopped in a simulated breakpoint done
88    by suspending all the threads.  */
89 static int faked_breakpoint = 0;
90 
91 /* True if current_process_handle needs to be closed.  */
92 static bool open_process_used = false;
93 
94 #ifdef __x86_64__
95 bool wow64_process = false;
96 #endif
97 
98 const struct target_desc *win32_tdesc;
99 #ifdef __x86_64__
100 const struct target_desc *wow64_win32_tdesc;
101 #endif
102 
103 #define NUM_REGS (the_low_target.num_regs ())
104 
105 typedef BOOL (WINAPI *winapi_DebugActiveProcessStop) (DWORD dwProcessId);
106 typedef BOOL (WINAPI *winapi_DebugSetProcessKillOnExit) (BOOL KillOnExit);
107 typedef BOOL (WINAPI *winapi_DebugBreakProcess) (HANDLE);
108 typedef BOOL (WINAPI *winapi_GenerateConsoleCtrlEvent) (DWORD, DWORD);
109 
110 #ifdef __x86_64__
111 typedef BOOL (WINAPI *winapi_Wow64SetThreadContext) (HANDLE,
112 						     const WOW64_CONTEXT *);
113 
114 winapi_Wow64GetThreadContext win32_Wow64GetThreadContext;
115 static winapi_Wow64SetThreadContext win32_Wow64SetThreadContext;
116 #endif
117 
118 #ifndef _WIN32_WCE
119 static void win32_add_all_dlls (void);
120 #endif
121 
122 /* Get the thread ID from the current selected inferior (the current
123    thread).  */
124 static ptid_t
125 current_thread_ptid (void)
126 {
127   return current_ptid;
128 }
129 
130 /* The current debug event from WaitForDebugEvent.  */
131 static ptid_t
132 debug_event_ptid (DEBUG_EVENT *event)
133 {
134   return ptid_t (event->dwProcessId, event->dwThreadId, 0);
135 }
136 
137 /* Get the thread context of the thread associated with TH.  */
138 
139 static void
140 win32_get_thread_context (windows_thread_info *th)
141 {
142 #ifdef __x86_64__
143   if (wow64_process)
144     memset (&th->wow64_context, 0, sizeof (WOW64_CONTEXT));
145   else
146 #endif
147     memset (&th->context, 0, sizeof (CONTEXT));
148   (*the_low_target.get_thread_context) (th);
149 #ifdef _WIN32_WCE
150   memcpy (&th->base_context, &th->context, sizeof (CONTEXT));
151 #endif
152 }
153 
154 /* Set the thread context of the thread associated with TH.  */
155 
156 static void
157 win32_set_thread_context (windows_thread_info *th)
158 {
159 #ifdef _WIN32_WCE
160   /* Calling SuspendThread on a thread that is running kernel code
161      will report that the suspending was successful, but in fact, that
162      will often not be true.  In those cases, the context returned by
163      GetThreadContext will not be correct by the time the thread
164      stops, hence we can't set that context back into the thread when
165      resuming - it will most likely crash the inferior.
166      Unfortunately, there is no way to know when the thread will
167      really stop.  To work around it, we'll only write the context
168      back to the thread when either the user or GDB explicitly change
169      it between stopping and resuming.  */
170   if (memcmp (&th->context, &th->base_context, sizeof (CONTEXT)) != 0)
171 #endif
172     {
173 #ifdef __x86_64__
174       if (wow64_process)
175 	win32_Wow64SetThreadContext (th->h, &th->wow64_context);
176       else
177 #endif
178 	SetThreadContext (th->h, &th->context);
179     }
180 }
181 
182 /* Set the thread context of the thread associated with TH.  */
183 
184 static void
185 win32_prepare_to_resume (windows_thread_info *th)
186 {
187   if (the_low_target.prepare_to_resume != NULL)
188     (*the_low_target.prepare_to_resume) (th);
189 }
190 
191 /* See win32-low.h.  */
192 
193 void
194 win32_require_context (windows_thread_info *th)
195 {
196   DWORD context_flags;
197 #ifdef __x86_64__
198   if (wow64_process)
199     context_flags = th->wow64_context.ContextFlags;
200   else
201 #endif
202     context_flags = th->context.ContextFlags;
203   if (context_flags == 0)
204     {
205       th->suspend ();
206       win32_get_thread_context (th);
207     }
208 }
209 
210 /* See nat/windows-nat.h.  */
211 
212 windows_thread_info *
213 windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition)
214 {
215   thread_info *thread = find_thread_ptid (ptid);
216   if (thread == NULL)
217     return NULL;
218 
219   windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
220   if (disposition != DONT_INVALIDATE_CONTEXT)
221     win32_require_context (th);
222   return th;
223 }
224 
225 /* Add a thread to the thread list.  */
226 static windows_thread_info *
227 child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb)
228 {
229   windows_thread_info *th;
230   ptid_t ptid = ptid_t (pid, tid, 0);
231 
232   if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
233     return th;
234 
235   CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
236 #ifdef __x86_64__
237   /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
238      and the 32bit TIB is exactly 2 pages after it.  */
239   if (wow64_process)
240     base += 2 * 4096; /* page size = 4096 */
241 #endif
242   th = new windows_thread_info (tid, h, base);
243 
244   add_thread (ptid, th);
245 
246   if (the_low_target.thread_added != NULL)
247     (*the_low_target.thread_added) (th);
248 
249   return th;
250 }
251 
252 /* Delete a thread from the list of threads.  */
253 static void
254 delete_thread_info (thread_info *thread)
255 {
256   windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
257 
258   remove_thread (thread);
259   delete th;
260 }
261 
262 /* Delete a thread from the list of threads.  */
263 static void
264 child_delete_thread (DWORD pid, DWORD tid)
265 {
266   /* If the last thread is exiting, just return.  */
267   if (all_threads.size () == 1)
268     return;
269 
270   thread_info *thread = find_thread_ptid (ptid_t (pid, tid));
271   if (thread == NULL)
272     return;
273 
274   delete_thread_info (thread);
275 }
276 
277 /* These watchpoint related wrapper functions simply pass on the function call
278    if the low target has registered a corresponding function.  */
279 
280 bool
281 win32_process_target::supports_z_point_type (char z_type)
282 {
283   return (z_type == Z_PACKET_SW_BP
284 	  || (the_low_target.supports_z_point_type != NULL
285 	      && the_low_target.supports_z_point_type (z_type)));
286 }
287 
288 int
289 win32_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
290 				    int size, raw_breakpoint *bp)
291 {
292   if (type == raw_bkpt_type_sw)
293     return insert_memory_breakpoint (bp);
294   else if (the_low_target.insert_point != NULL)
295     return the_low_target.insert_point (type, addr, size, bp);
296   else
297     /* Unsupported (see target.h).  */
298     return 1;
299 }
300 
301 int
302 win32_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
303 				    int size, raw_breakpoint *bp)
304 {
305   if (type == raw_bkpt_type_sw)
306     return remove_memory_breakpoint (bp);
307   else if (the_low_target.remove_point != NULL)
308     return the_low_target.remove_point (type, addr, size, bp);
309   else
310     /* Unsupported (see target.h).  */
311     return 1;
312 }
313 
314 bool
315 win32_process_target::stopped_by_watchpoint ()
316 {
317   if (the_low_target.stopped_by_watchpoint != NULL)
318     return the_low_target.stopped_by_watchpoint ();
319   else
320     return false;
321 }
322 
323 CORE_ADDR
324 win32_process_target::stopped_data_address ()
325 {
326   if (the_low_target.stopped_data_address != NULL)
327     return the_low_target.stopped_data_address ();
328   else
329     return 0;
330 }
331 
332 
333 /* Transfer memory from/to the debugged process.  */
334 static int
335 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
336 		   int write, process_stratum_target *target)
337 {
338   BOOL success;
339   SIZE_T done = 0;
340   DWORD lasterror = 0;
341   uintptr_t addr = (uintptr_t) memaddr;
342 
343   if (write)
344     {
345       success = WriteProcessMemory (current_process_handle, (LPVOID) addr,
346 				    (LPCVOID) our, len, &done);
347       if (!success)
348 	lasterror = GetLastError ();
349       FlushInstructionCache (current_process_handle, (LPCVOID) addr, len);
350     }
351   else
352     {
353       success = ReadProcessMemory (current_process_handle, (LPCVOID) addr,
354 				   (LPVOID) our, len, &done);
355       if (!success)
356 	lasterror = GetLastError ();
357     }
358   if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
359     return done;
360   else
361     return success ? done : -1;
362 }
363 
364 /* Clear out any old thread list and reinitialize it to a pristine
365    state. */
366 static void
367 child_init_thread_list (void)
368 {
369   for_each_thread (delete_thread_info);
370 }
371 
372 /* Zero during the child initialization phase, and nonzero otherwise.  */
373 
374 static int child_initialization_done = 0;
375 
376 static void
377 do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
378 {
379   struct process_info *proc;
380 
381   last_sig = GDB_SIGNAL_0;
382 
383   current_process_handle = proch;
384   current_process_id = pid;
385   main_thread_id = 0;
386 
387   soft_interrupt_requested = 0;
388   faked_breakpoint = 0;
389   open_process_used = true;
390 
391   memset (&current_event, 0, sizeof (current_event));
392 
393 #ifdef __x86_64__
394   BOOL wow64;
395   if (!IsWow64Process (proch, &wow64))
396     {
397       DWORD err = GetLastError ();
398       error ("Check if WOW64 process failed (error %d): %s\n",
399 	     (int) err, strwinerror (err));
400     }
401   wow64_process = wow64;
402 
403   if (wow64_process
404       && (win32_Wow64GetThreadContext == nullptr
405 	  || win32_Wow64SetThreadContext == nullptr))
406     error ("WOW64 debugging is not supported on this system.\n");
407 
408   ignore_first_breakpoint = !attached && wow64_process;
409 #endif
410 
411   proc = add_process (pid, attached);
412 #ifdef __x86_64__
413   if (wow64_process)
414     proc->tdesc = wow64_win32_tdesc;
415   else
416 #endif
417     proc->tdesc = win32_tdesc;
418   child_init_thread_list ();
419   child_initialization_done = 0;
420 
421   if (the_low_target.initial_stuff != NULL)
422     (*the_low_target.initial_stuff) ();
423 
424   cached_status.kind = TARGET_WAITKIND_IGNORE;
425 
426   /* Flush all currently pending debug events (thread and dll list) up
427      to the initial breakpoint.  */
428   while (1)
429     {
430       struct target_waitstatus status;
431 
432       the_target->wait (minus_one_ptid, &status, 0);
433 
434       /* Note win32_wait doesn't return thread events.  */
435       if (status.kind != TARGET_WAITKIND_LOADED)
436 	{
437 	  cached_status = status;
438 	  break;
439 	}
440 
441       {
442 	struct thread_resume resume;
443 
444 	resume.thread = minus_one_ptid;
445 	resume.kind = resume_continue;
446 	resume.sig = 0;
447 
448 	the_target->resume (&resume, 1);
449       }
450     }
451 
452 #ifndef _WIN32_WCE
453   /* Now that the inferior has been started and all DLLs have been mapped,
454      we can iterate over all DLLs and load them in.
455 
456      We avoid doing it any earlier because, on certain versions of Windows,
457      LOAD_DLL_DEBUG_EVENTs are sometimes not complete.  In particular,
458      we have seen on Windows 8.1 that the ntdll.dll load event does not
459      include the DLL name, preventing us from creating an associated SO.
460      A possible explanation is that ntdll.dll might be mapped before
461      the SO info gets created by the Windows system -- ntdll.dll is
462      the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
463      do not seem to suffer from that problem.
464 
465      Rather than try to work around this sort of issue, it is much
466      simpler to just ignore DLL load/unload events during the startup
467      phase, and then process them all in one batch now.  */
468   win32_add_all_dlls ();
469 #endif
470 
471   child_initialization_done = 1;
472 }
473 
474 /* Resume all artificially suspended threads if we are continuing
475    execution.  */
476 static void
477 continue_one_thread (thread_info *thread, int thread_id)
478 {
479   windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
480 
481   if (thread_id == -1 || thread_id == th->tid)
482     {
483       win32_prepare_to_resume (th);
484 
485       if (th->suspended)
486 	{
487 	  DWORD *context_flags;
488 #ifdef __x86_64__
489 	  if (wow64_process)
490 	    context_flags = &th->wow64_context.ContextFlags;
491 	  else
492 #endif
493 	    context_flags = &th->context.ContextFlags;
494 	  if (*context_flags)
495 	    {
496 	      win32_set_thread_context (th);
497 	      *context_flags = 0;
498 	    }
499 
500 	  th->resume ();
501 	}
502     }
503 }
504 
505 static BOOL
506 child_continue (DWORD continue_status, int thread_id)
507 {
508   desired_stop_thread_id = thread_id;
509   if (matching_pending_stop (debug_threads))
510     return TRUE;
511 
512   /* The inferior will only continue after the ContinueDebugEvent
513      call.  */
514   for_each_thread ([&] (thread_info *thread)
515     {
516       continue_one_thread (thread, thread_id);
517     });
518   faked_breakpoint = 0;
519 
520   return continue_last_debug_event (continue_status, debug_threads);
521 }
522 
523 /* Fetch register(s) from the current thread context.  */
524 static void
525 child_fetch_inferior_registers (struct regcache *regcache, int r)
526 {
527   int regno;
528   windows_thread_info *th = thread_rec (current_thread_ptid (),
529 					INVALIDATE_CONTEXT);
530   if (r == -1 || r > NUM_REGS)
531     child_fetch_inferior_registers (regcache, NUM_REGS);
532   else
533     for (regno = 0; regno < r; regno++)
534       (*the_low_target.fetch_inferior_register) (regcache, th, regno);
535 }
536 
537 /* Store a new register value into the current thread context.  We don't
538    change the program's context until later, when we resume it.  */
539 static void
540 child_store_inferior_registers (struct regcache *regcache, int r)
541 {
542   int regno;
543   windows_thread_info *th = thread_rec (current_thread_ptid (),
544 					INVALIDATE_CONTEXT);
545   if (r == -1 || r == 0 || r > NUM_REGS)
546     child_store_inferior_registers (regcache, NUM_REGS);
547   else
548     for (regno = 0; regno < r; regno++)
549       (*the_low_target.store_inferior_register) (regcache, th, regno);
550 }
551 
552 /* Map the Windows error number in ERROR to a locale-dependent error
553    message string and return a pointer to it.  Typically, the values
554    for ERROR come from GetLastError.
555 
556    The string pointed to shall not be modified by the application,
557    but may be overwritten by a subsequent call to strwinerror
558 
559    The strwinerror function does not change the current setting
560    of GetLastError.  */
561 
562 char *
563 strwinerror (DWORD error)
564 {
565   static char buf[1024];
566   TCHAR *msgbuf;
567   DWORD lasterr = GetLastError ();
568   DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
569 			       | FORMAT_MESSAGE_ALLOCATE_BUFFER,
570 			       NULL,
571 			       error,
572 			       0, /* Default language */
573 			       (LPTSTR) &msgbuf,
574 			       0,
575 			       NULL);
576   if (chars != 0)
577     {
578       /* If there is an \r\n appended, zap it.  */
579       if (chars >= 2
580 	  && msgbuf[chars - 2] == '\r'
581 	  && msgbuf[chars - 1] == '\n')
582 	{
583 	  chars -= 2;
584 	  msgbuf[chars] = 0;
585 	}
586 
587       if (chars > ((COUNTOF (buf)) - 1))
588 	{
589 	  chars = COUNTOF (buf) - 1;
590 	  msgbuf [chars] = 0;
591 	}
592 
593 #ifdef UNICODE
594       wcstombs (buf, msgbuf, chars + 1);
595 #else
596       strncpy (buf, msgbuf, chars + 1);
597 #endif
598       LocalFree (msgbuf);
599     }
600   else
601     sprintf (buf, "unknown win32 error (%u)", (unsigned) error);
602 
603   SetLastError (lasterr);
604   return buf;
605 }
606 
607 static BOOL
608 create_process (const char *program, char *args,
609 		DWORD flags, PROCESS_INFORMATION *pi)
610 {
611   const char *inferior_cwd = get_inferior_cwd ();
612   BOOL ret;
613   size_t argslen, proglen;
614 
615   proglen = strlen (program) + 1;
616   argslen = strlen (args) + proglen;
617 
618 #ifdef _WIN32_WCE
619   wchar_t *p, *wprogram, *wargs, *wcwd = NULL;
620 
621   wprogram = (wchar_t *) alloca (proglen * sizeof (wchar_t));
622   mbstowcs (wprogram, program, proglen);
623 
624   for (p = wprogram; *p; ++p)
625     if (L'/' == *p)
626       *p = L'\\';
627 
628   wargs = alloca ((argslen + 1) * sizeof (wchar_t));
629   wcscpy (wargs, wprogram);
630   wcscat (wargs, L" ");
631   mbstowcs (wargs + proglen, args, argslen + 1 - proglen);
632 
633   if (inferior_cwd != NULL)
634     {
635       std::string expanded_infcwd = gdb_tilde_expand (inferior_cwd);
636       std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
637 		    '/', '\\');
638       wcwd = alloca ((expanded_infcwd.size () + 1) * sizeof (wchar_t));
639       if (mbstowcs (wcwd, expanded_infcwd.c_str (),
640 		    expanded_infcwd.size () + 1) == NULL)
641 	{
642 	  error (_("\
643 Could not convert the expanded inferior cwd to wide-char."));
644 	}
645     }
646 
647   ret = CreateProcessW (wprogram, /* image name */
648 			wargs,    /* command line */
649 			NULL,     /* security, not supported */
650 			NULL,     /* thread, not supported */
651 			FALSE,    /* inherit handles, not supported */
652 			flags,    /* start flags */
653 			NULL,     /* environment, not supported */
654 			wcwd,     /* current directory */
655 			NULL,     /* start info, not supported */
656 			pi);      /* proc info */
657 #else
658   STARTUPINFOA si = { sizeof (STARTUPINFOA) };
659   char *program_and_args = (char *) alloca (argslen + 1);
660 
661   strcpy (program_and_args, program);
662   strcat (program_and_args, " ");
663   strcat (program_and_args, args);
664   ret = CreateProcessA (program,           /* image name */
665 			program_and_args,  /* command line */
666 			NULL,              /* security */
667 			NULL,              /* thread */
668 			TRUE,              /* inherit handles */
669 			flags,             /* start flags */
670 			NULL,              /* environment */
671 			/* current directory */
672 			(inferior_cwd == NULL
673 			 ? NULL
674 			 : gdb_tilde_expand (inferior_cwd).c_str()),
675 			&si,               /* start info */
676 			pi);               /* proc info */
677 #endif
678 
679   return ret;
680 }
681 
682 /* Start a new process.
683    PROGRAM is the program name.
684    PROGRAM_ARGS is the vector containing the inferior's args.
685    Returns the new PID on success, -1 on failure.  Registers the new
686    process with the process list.  */
687 int
688 win32_process_target::create_inferior (const char *program,
689 				       const std::vector<char *> &program_args)
690 {
691   client_state &cs = get_client_state ();
692 #ifndef USE_WIN32API
693   char real_path[PATH_MAX];
694   char *orig_path, *new_path, *path_ptr;
695 #endif
696   BOOL ret;
697   DWORD flags;
698   PROCESS_INFORMATION pi;
699   DWORD err;
700   std::string str_program_args = construct_inferior_arguments (program_args);
701   char *args = (char *) str_program_args.c_str ();
702 
703   /* win32_wait needs to know we're not attaching.  */
704   attaching = 0;
705 
706   if (!program)
707     error ("No executable specified, specify executable to debug.\n");
708 
709   flags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
710 
711 #ifndef USE_WIN32API
712   orig_path = NULL;
713   path_ptr = getenv ("PATH");
714   if (path_ptr)
715     {
716       int size = cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, NULL, 0);
717       orig_path = (char *) alloca (strlen (path_ptr) + 1);
718       new_path = (char *) alloca (size);
719       strcpy (orig_path, path_ptr);
720       cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, new_path, size);
721       setenv ("PATH", new_path, 1);
722      }
723   cygwin_conv_path (CCP_POSIX_TO_WIN_A, program, real_path, PATH_MAX);
724   program = real_path;
725 #endif
726 
727   OUTMSG2 (("Command line is \"%s %s\"\n", program, args));
728 
729 #ifdef CREATE_NEW_PROCESS_GROUP
730   flags |= CREATE_NEW_PROCESS_GROUP;
731 #endif
732 
733   ret = create_process (program, args, flags, &pi);
734   err = GetLastError ();
735   if (!ret && err == ERROR_FILE_NOT_FOUND)
736     {
737       char *exename = (char *) alloca (strlen (program) + 5);
738       strcat (strcpy (exename, program), ".exe");
739       ret = create_process (exename, args, flags, &pi);
740       err = GetLastError ();
741     }
742 
743 #ifndef USE_WIN32API
744   if (orig_path)
745     setenv ("PATH", orig_path, 1);
746 #endif
747 
748   if (!ret)
749     {
750       error ("Error creating process \"%s %s\", (error %d): %s\n",
751 	     program, args, (int) err, strwinerror (err));
752     }
753   else
754     {
755       OUTMSG2 (("Process created: %s %s\n", program, (char *) args));
756     }
757 
758 #ifndef _WIN32_WCE
759   /* On Windows CE this handle can't be closed.  The OS reuses
760      it in the debug events, while the 9x/NT versions of Windows
761      probably use a DuplicateHandle'd one.  */
762   CloseHandle (pi.hThread);
763 #endif
764 
765   do_initial_child_stuff (pi.hProcess, pi.dwProcessId, 0);
766 
767   /* Wait till we are at 1st instruction in program, return new pid
768      (assuming success).  */
769   cs.last_ptid = wait (ptid_t (current_process_id), &cs.last_status, 0);
770 
771   /* Necessary for handle_v_kill.  */
772   signal_pid = current_process_id;
773 
774   return current_process_id;
775 }
776 
777 /* Attach to a running process.
778    PID is the process ID to attach to, specified by the user
779    or a higher layer.  */
780 int
781 win32_process_target::attach (unsigned long pid)
782 {
783   HANDLE h;
784   winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL;
785   DWORD err;
786 #ifdef _WIN32_WCE
787   HMODULE dll = GetModuleHandle (_T("COREDLL.DLL"));
788 #else
789   HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
790 #endif
791   DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit);
792 
793   h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
794   if (h != NULL)
795     {
796       if (DebugActiveProcess (pid))
797 	{
798 	  if (DebugSetProcessKillOnExit != NULL)
799 	    DebugSetProcessKillOnExit (FALSE);
800 
801 	  /* win32_wait needs to know we're attaching.  */
802 	  attaching = 1;
803 	  do_initial_child_stuff (h, pid, 1);
804 	  return 0;
805 	}
806 
807       CloseHandle (h);
808     }
809 
810   err = GetLastError ();
811   error ("Attach to process failed (error %d): %s\n",
812 	 (int) err, strwinerror (err));
813 }
814 
815 /* See nat/windows-nat.h.  */
816 
817 int
818 windows_nat::handle_output_debug_string (struct target_waitstatus *ourstatus)
819 {
820 #define READ_BUFFER_LEN 1024
821   CORE_ADDR addr;
822   char s[READ_BUFFER_LEN + 1] = { 0 };
823   DWORD nbytes = current_event.u.DebugString.nDebugStringLength;
824 
825   if (nbytes == 0)
826     return 0;
827 
828   if (nbytes > READ_BUFFER_LEN)
829     nbytes = READ_BUFFER_LEN;
830 
831   addr = (CORE_ADDR) (size_t) current_event.u.DebugString.lpDebugStringData;
832 
833   if (current_event.u.DebugString.fUnicode)
834     {
835       /* The event tells us how many bytes, not chars, even
836 	 in Unicode.  */
837       WCHAR buffer[(READ_BUFFER_LEN + 1) / sizeof (WCHAR)] = { 0 };
838       if (read_inferior_memory (addr, (unsigned char *) buffer, nbytes) != 0)
839 	return 0;
840       wcstombs (s, buffer, (nbytes + 1) / sizeof (WCHAR));
841     }
842   else
843     {
844       if (read_inferior_memory (addr, (unsigned char *) s, nbytes) != 0)
845 	return 0;
846     }
847 
848   if (!startswith (s, "cYg"))
849     {
850       if (!server_waiting)
851 	{
852 	  OUTMSG2(("%s", s));
853 	  return 0;
854 	}
855 
856       monitor_output (s);
857     }
858 #undef READ_BUFFER_LEN
859 
860   return 0;
861 }
862 
863 static void
864 win32_clear_inferiors (void)
865 {
866   if (open_process_used)
867     {
868       CloseHandle (current_process_handle);
869       open_process_used = false;
870     }
871 
872   for_each_thread (delete_thread_info);
873   siginfo_er.ExceptionCode = 0;
874   clear_inferiors ();
875 }
876 
877 /* Implementation of target_ops::kill.  */
878 
879 int
880 win32_process_target::kill (process_info *process)
881 {
882   TerminateProcess (current_process_handle, 0);
883   for (;;)
884     {
885       if (!child_continue (DBG_CONTINUE, -1))
886 	break;
887       if (!wait_for_debug_event (&current_event, INFINITE))
888 	break;
889       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
890 	break;
891       else if (current_event.dwDebugEventCode == OUTPUT_DEBUG_STRING_EVENT)
892 	handle_output_debug_string (nullptr);
893     }
894 
895   win32_clear_inferiors ();
896 
897   remove_process (process);
898   return 0;
899 }
900 
901 /* Implementation of target_ops::detach.  */
902 
903 int
904 win32_process_target::detach (process_info *process)
905 {
906   winapi_DebugActiveProcessStop DebugActiveProcessStop = NULL;
907   winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL;
908 #ifdef _WIN32_WCE
909   HMODULE dll = GetModuleHandle (_T("COREDLL.DLL"));
910 #else
911   HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
912 #endif
913   DebugActiveProcessStop = GETPROCADDRESS (dll, DebugActiveProcessStop);
914   DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit);
915 
916   if (DebugSetProcessKillOnExit == NULL
917       || DebugActiveProcessStop == NULL)
918     return -1;
919 
920   {
921     struct thread_resume resume;
922     resume.thread = minus_one_ptid;
923     resume.kind = resume_continue;
924     resume.sig = 0;
925     this->resume (&resume, 1);
926   }
927 
928   if (!DebugActiveProcessStop (current_process_id))
929     return -1;
930 
931   DebugSetProcessKillOnExit (FALSE);
932   remove_process (process);
933 
934   win32_clear_inferiors ();
935   return 0;
936 }
937 
938 void
939 win32_process_target::mourn (struct process_info *process)
940 {
941   remove_process (process);
942 }
943 
944 /* Implementation of target_ops::join.  */
945 
946 void
947 win32_process_target::join (int pid)
948 {
949   HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
950   if (h != NULL)
951     {
952       WaitForSingleObject (h, INFINITE);
953       CloseHandle (h);
954     }
955 }
956 
957 /* Return true iff the thread with thread ID TID is alive.  */
958 bool
959 win32_process_target::thread_alive (ptid_t ptid)
960 {
961   /* Our thread list is reliable; don't bother to poll target
962      threads.  */
963   return find_thread_ptid (ptid) != NULL;
964 }
965 
966 /* Resume the inferior process.  RESUME_INFO describes how we want
967    to resume.  */
968 void
969 win32_process_target::resume (thread_resume *resume_info, size_t n)
970 {
971   DWORD tid;
972   enum gdb_signal sig;
973   int step;
974   windows_thread_info *th;
975   DWORD continue_status = DBG_CONTINUE;
976   ptid_t ptid;
977 
978   /* This handles the very limited set of resume packets that GDB can
979      currently produce.  */
980 
981   if (n == 1 && resume_info[0].thread == minus_one_ptid)
982     tid = -1;
983   else if (n > 1)
984     tid = -1;
985   else
986     /* Yes, we're ignoring resume_info[0].thread.  It'd be tricky to make
987        the Windows resume code do the right thing for thread switching.  */
988     tid = current_event.dwThreadId;
989 
990   if (resume_info[0].thread != minus_one_ptid)
991     {
992       sig = gdb_signal_from_host (resume_info[0].sig);
993       step = resume_info[0].kind == resume_step;
994     }
995   else
996     {
997       sig = GDB_SIGNAL_0;
998       step = 0;
999     }
1000 
1001   if (sig != GDB_SIGNAL_0)
1002     {
1003       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1004 	{
1005 	  OUTMSG (("Cannot continue with signal %s here.\n",
1006 		   gdb_signal_to_string (sig)));
1007 	}
1008       else if (sig == last_sig)
1009 	continue_status = DBG_EXCEPTION_NOT_HANDLED;
1010       else
1011 	OUTMSG (("Can only continue with received signal %s.\n",
1012 		 gdb_signal_to_string (last_sig)));
1013     }
1014 
1015   last_sig = GDB_SIGNAL_0;
1016 
1017   /* Get context for the currently selected thread.  */
1018   ptid = debug_event_ptid (&current_event);
1019   th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
1020   if (th)
1021     {
1022       win32_prepare_to_resume (th);
1023 
1024       DWORD *context_flags;
1025 #ifdef __x86_64__
1026       if (wow64_process)
1027 	context_flags = &th->wow64_context.ContextFlags;
1028       else
1029 #endif
1030 	context_flags = &th->context.ContextFlags;
1031       if (*context_flags)
1032 	{
1033 	  /* Move register values from the inferior into the thread
1034 	     context structure.  */
1035 	  regcache_invalidate ();
1036 
1037 	  if (step)
1038 	    {
1039 	      if (the_low_target.single_step != NULL)
1040 		(*the_low_target.single_step) (th);
1041 	      else
1042 		error ("Single stepping is not supported "
1043 		       "in this configuration.\n");
1044 	    }
1045 
1046 	  win32_set_thread_context (th);
1047 	  *context_flags = 0;
1048 	}
1049     }
1050 
1051   /* Allow continuing with the same signal that interrupted us.
1052      Otherwise complain.  */
1053 
1054   child_continue (continue_status, tid);
1055 }
1056 
1057 static void
1058 win32_add_one_solib (const char *name, CORE_ADDR load_addr)
1059 {
1060   char buf[MAX_PATH + 1];
1061   char buf2[MAX_PATH + 1];
1062 
1063 #ifdef _WIN32_WCE
1064   WIN32_FIND_DATA w32_fd;
1065   WCHAR wname[MAX_PATH + 1];
1066   mbstowcs (wname, name, MAX_PATH);
1067   HANDLE h = FindFirstFile (wname, &w32_fd);
1068 #else
1069   WIN32_FIND_DATAA w32_fd;
1070   HANDLE h = FindFirstFileA (name, &w32_fd);
1071 #endif
1072 
1073   /* The symbols in a dll are offset by 0x1000, which is the
1074      offset from 0 of the first byte in an image - because
1075      of the file header and the section alignment. */
1076   load_addr += 0x1000;
1077 
1078   if (h == INVALID_HANDLE_VALUE)
1079     strcpy (buf, name);
1080   else
1081     {
1082       FindClose (h);
1083       strcpy (buf, name);
1084 #ifndef _WIN32_WCE
1085       {
1086 	char cwd[MAX_PATH + 1];
1087 	char *p;
1088 	if (GetCurrentDirectoryA (MAX_PATH + 1, cwd))
1089 	  {
1090 	    p = strrchr (buf, '\\');
1091 	    if (p)
1092 	      p[1] = '\0';
1093 	    SetCurrentDirectoryA (buf);
1094 	    GetFullPathNameA (w32_fd.cFileName, MAX_PATH, buf, &p);
1095 	    SetCurrentDirectoryA (cwd);
1096 	  }
1097       }
1098 #endif
1099     }
1100 
1101 #ifndef _WIN32_WCE
1102   if (strcasecmp (buf, "ntdll.dll") == 0)
1103     {
1104       GetSystemDirectoryA (buf, sizeof (buf));
1105       strcat (buf, "\\ntdll.dll");
1106     }
1107 #endif
1108 
1109 #ifdef __CYGWIN__
1110   cygwin_conv_path (CCP_WIN_A_TO_POSIX, buf, buf2, sizeof (buf2));
1111 #else
1112   strcpy (buf2, buf);
1113 #endif
1114 
1115   loaded_dll (buf2, load_addr);
1116 }
1117 
1118 typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *,
1119 						  DWORD, LPDWORD);
1120 #ifdef __x86_64__
1121 typedef BOOL (WINAPI *winapi_EnumProcessModulesEx) (HANDLE, HMODULE *, DWORD,
1122 						    LPDWORD, DWORD);
1123 #endif
1124 typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE,
1125 						    LPMODULEINFO, DWORD);
1126 typedef DWORD (WINAPI *winapi_GetModuleFileNameExA) (HANDLE, HMODULE,
1127 						     LPSTR, DWORD);
1128 
1129 static winapi_EnumProcessModules win32_EnumProcessModules;
1130 #ifdef __x86_64__
1131 static winapi_EnumProcessModulesEx win32_EnumProcessModulesEx;
1132 #endif
1133 static winapi_GetModuleInformation win32_GetModuleInformation;
1134 static winapi_GetModuleFileNameExA win32_GetModuleFileNameExA;
1135 
1136 static BOOL
1137 load_psapi (void)
1138 {
1139   static int psapi_loaded = 0;
1140   static HMODULE dll = NULL;
1141 
1142   if (!psapi_loaded)
1143     {
1144       psapi_loaded = 1;
1145       dll = LoadLibrary (TEXT("psapi.dll"));
1146       if (!dll)
1147 	return FALSE;
1148       win32_EnumProcessModules =
1149 	      GETPROCADDRESS (dll, EnumProcessModules);
1150 #ifdef __x86_64__
1151       win32_EnumProcessModulesEx =
1152 	      GETPROCADDRESS (dll, EnumProcessModulesEx);
1153 #endif
1154       win32_GetModuleInformation =
1155 	      GETPROCADDRESS (dll, GetModuleInformation);
1156       win32_GetModuleFileNameExA =
1157 	      GETPROCADDRESS (dll, GetModuleFileNameExA);
1158     }
1159 
1160 #ifdef __x86_64__
1161   if (wow64_process && win32_EnumProcessModulesEx == nullptr)
1162     return FALSE;
1163 #endif
1164 
1165   return (win32_EnumProcessModules != NULL
1166 	  && win32_GetModuleInformation != NULL
1167 	  && win32_GetModuleFileNameExA != NULL);
1168 }
1169 
1170 #ifndef _WIN32_WCE
1171 
1172 /* Iterate over all DLLs currently mapped by our inferior, and
1173    add them to our list of solibs.  */
1174 
1175 static void
1176 win32_add_all_dlls (void)
1177 {
1178   size_t i;
1179   HMODULE dh_buf[1];
1180   HMODULE *DllHandle = dh_buf;
1181   DWORD cbNeeded;
1182   BOOL ok;
1183 
1184   if (!load_psapi ())
1185     return;
1186 
1187   cbNeeded = 0;
1188 #ifdef __x86_64__
1189   if (wow64_process)
1190     ok = (*win32_EnumProcessModulesEx) (current_process_handle,
1191 					DllHandle,
1192 					sizeof (HMODULE),
1193 					&cbNeeded,
1194 					LIST_MODULES_32BIT);
1195   else
1196 #endif
1197     ok = (*win32_EnumProcessModules) (current_process_handle,
1198 				      DllHandle,
1199 				      sizeof (HMODULE),
1200 				      &cbNeeded);
1201 
1202   if (!ok || !cbNeeded)
1203     return;
1204 
1205   DllHandle = (HMODULE *) alloca (cbNeeded);
1206   if (!DllHandle)
1207     return;
1208 
1209 #ifdef __x86_64__
1210   if (wow64_process)
1211     ok = (*win32_EnumProcessModulesEx) (current_process_handle,
1212 					DllHandle,
1213 					cbNeeded,
1214 					&cbNeeded,
1215 					LIST_MODULES_32BIT);
1216   else
1217 #endif
1218     ok = (*win32_EnumProcessModules) (current_process_handle,
1219 				      DllHandle,
1220 				      cbNeeded,
1221 				      &cbNeeded);
1222   if (!ok)
1223     return;
1224 
1225   char system_dir[MAX_PATH];
1226   char syswow_dir[MAX_PATH];
1227   size_t system_dir_len = 0;
1228   bool convert_syswow_dir = false;
1229 #ifdef __x86_64__
1230   if (wow64_process)
1231 #endif
1232     {
1233       /* This fails on 32bit Windows because it has no SysWOW64 directory,
1234 	 and in this case a path conversion isn't necessary.  */
1235       UINT len = GetSystemWow64DirectoryA (syswow_dir, sizeof (syswow_dir));
1236       if (len > 0)
1237 	{
1238 	  /* Check that we have passed a large enough buffer.  */
1239 	  gdb_assert (len < sizeof (syswow_dir));
1240 
1241 	  len = GetSystemDirectoryA (system_dir, sizeof (system_dir));
1242 	  /* Error check.  */
1243 	  gdb_assert (len != 0);
1244 	  /* Check that we have passed a large enough buffer.  */
1245 	  gdb_assert (len < sizeof (system_dir));
1246 
1247 	  strcat (system_dir, "\\");
1248 	  strcat (syswow_dir, "\\");
1249 	  system_dir_len = strlen (system_dir);
1250 
1251 	  convert_syswow_dir = true;
1252 	}
1253 
1254     }
1255 
1256   for (i = 1; i < ((size_t) cbNeeded / sizeof (HMODULE)); i++)
1257     {
1258       MODULEINFO mi;
1259       char dll_name[MAX_PATH];
1260 
1261       if (!(*win32_GetModuleInformation) (current_process_handle,
1262 					  DllHandle[i],
1263 					  &mi,
1264 					  sizeof (mi)))
1265 	continue;
1266       if ((*win32_GetModuleFileNameExA) (current_process_handle,
1267 					 DllHandle[i],
1268 					 dll_name,
1269 					 MAX_PATH) == 0)
1270 	continue;
1271 
1272       const char *name = dll_name;
1273       /* Convert the DLL path of 32bit processes returned by
1274 	 GetModuleFileNameEx from the 64bit system directory to the
1275 	 32bit syswow64 directory if necessary.  */
1276       std::string syswow_dll_path;
1277       if (convert_syswow_dir
1278 	  && strncasecmp (dll_name, system_dir, system_dir_len) == 0
1279 	  && strchr (dll_name + system_dir_len, '\\') == nullptr)
1280 	{
1281 	  syswow_dll_path = syswow_dir;
1282 	  syswow_dll_path += dll_name + system_dir_len;
1283 	  name = syswow_dll_path.c_str();
1284 	}
1285 
1286       win32_add_one_solib (name, (CORE_ADDR) (uintptr_t) mi.lpBaseOfDll);
1287     }
1288 }
1289 #endif
1290 
1291 typedef HANDLE (WINAPI *winapi_CreateToolhelp32Snapshot) (DWORD, DWORD);
1292 typedef BOOL (WINAPI *winapi_Module32First) (HANDLE, LPMODULEENTRY32);
1293 typedef BOOL (WINAPI *winapi_Module32Next) (HANDLE, LPMODULEENTRY32);
1294 
1295 /* See nat/windows-nat.h.  */
1296 
1297 void
1298 windows_nat::handle_load_dll ()
1299 {
1300   LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
1301   const char *dll_name;
1302 
1303   dll_name = get_image_name (current_process_handle,
1304 			     event->lpImageName, event->fUnicode);
1305   if (!dll_name)
1306     return;
1307 
1308   win32_add_one_solib (dll_name, (CORE_ADDR) (uintptr_t) event->lpBaseOfDll);
1309 }
1310 
1311 /* See nat/windows-nat.h.  */
1312 
1313 void
1314 windows_nat::handle_unload_dll ()
1315 {
1316   CORE_ADDR load_addr =
1317 	  (CORE_ADDR) (uintptr_t) current_event.u.UnloadDll.lpBaseOfDll;
1318 
1319   /* The symbols in a dll are offset by 0x1000, which is the
1320      offset from 0 of the first byte in an image - because
1321      of the file header and the section alignment. */
1322   load_addr += 0x1000;
1323   unloaded_dll (NULL, load_addr);
1324 }
1325 
1326 static void
1327 suspend_one_thread (thread_info *thread)
1328 {
1329   windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
1330 
1331   th->suspend ();
1332 }
1333 
1334 static void
1335 fake_breakpoint_event (void)
1336 {
1337   OUTMSG2(("fake_breakpoint_event\n"));
1338 
1339   faked_breakpoint = 1;
1340 
1341   memset (&current_event, 0, sizeof (current_event));
1342   current_event.dwThreadId = main_thread_id;
1343   current_event.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
1344   current_event.u.Exception.ExceptionRecord.ExceptionCode
1345     = EXCEPTION_BREAKPOINT;
1346 
1347   for_each_thread (suspend_one_thread);
1348 }
1349 
1350 #ifdef _WIN32_WCE
1351 static int
1352 auto_delete_breakpoint (CORE_ADDR stop_pc)
1353 {
1354   return 1;
1355 }
1356 #endif
1357 
1358 /* See nat/windows-nat.h.  */
1359 
1360 bool
1361 windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec)
1362 {
1363   return false;
1364 }
1365 
1366 /* See nat/windows-nat.h.  */
1367 
1368 bool
1369 windows_nat::handle_access_violation (const EXCEPTION_RECORD *rec)
1370 {
1371   return false;
1372 }
1373 
1374 /* A helper function that will, if needed, set
1375    'stopped_at_software_breakpoint' on the thread and adjust the
1376    PC.  */
1377 
1378 static void
1379 maybe_adjust_pc ()
1380 {
1381   struct regcache *regcache = get_thread_regcache (current_thread, 1);
1382   child_fetch_inferior_registers (regcache, -1);
1383 
1384   windows_thread_info *th = thread_rec (current_thread_ptid (),
1385 					DONT_INVALIDATE_CONTEXT);
1386   th->stopped_at_software_breakpoint = false;
1387 
1388   if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
1389       && ((current_event.u.Exception.ExceptionRecord.ExceptionCode
1390 	   == EXCEPTION_BREAKPOINT)
1391 	  || (current_event.u.Exception.ExceptionRecord.ExceptionCode
1392 	      == STATUS_WX86_BREAKPOINT))
1393       && child_initialization_done)
1394     {
1395       th->stopped_at_software_breakpoint = true;
1396       CORE_ADDR pc = regcache_read_pc (regcache);
1397       CORE_ADDR sw_breakpoint_pc = pc - the_low_target.decr_pc_after_break;
1398       regcache_write_pc (regcache, sw_breakpoint_pc);
1399     }
1400 }
1401 
1402 /* Get the next event from the child.  */
1403 
1404 static int
1405 get_child_debug_event (DWORD *continue_status,
1406 		       struct target_waitstatus *ourstatus)
1407 {
1408   ptid_t ptid;
1409 
1410   last_sig = GDB_SIGNAL_0;
1411   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1412   *continue_status = DBG_CONTINUE;
1413 
1414   /* Check if GDB sent us an interrupt request.  */
1415   check_remote_input_interrupt_request ();
1416 
1417   if (soft_interrupt_requested)
1418     {
1419       soft_interrupt_requested = 0;
1420       fake_breakpoint_event ();
1421       goto gotevent;
1422     }
1423 
1424   attaching = 0;
1425   {
1426     gdb::optional<pending_stop> stop = fetch_pending_stop (debug_threads);
1427     if (stop.has_value ())
1428       {
1429 	*ourstatus = stop->status;
1430 	current_event = stop->event;
1431 	ptid = debug_event_ptid (&current_event);
1432 	current_thread = find_thread_ptid (ptid);
1433 	return 1;
1434       }
1435 
1436     /* Keep the wait time low enough for comfortable remote
1437        interruption, but high enough so gdbserver doesn't become a
1438        bottleneck.  */
1439     if (!wait_for_debug_event (&current_event, 250))
1440       {
1441 	DWORD e  = GetLastError();
1442 
1443 	if (e == ERROR_PIPE_NOT_CONNECTED)
1444 	  {
1445 	    /* This will happen if the loader fails to succesfully
1446 	       load the application, e.g., if the main executable
1447 	       tries to pull in a non-existing export from a
1448 	       DLL.  */
1449 	    ourstatus->kind = TARGET_WAITKIND_EXITED;
1450 	    ourstatus->value.integer = 1;
1451 	    return 1;
1452 	  }
1453 
1454 	return 0;
1455       }
1456   }
1457 
1458  gotevent:
1459 
1460   switch (current_event.dwDebugEventCode)
1461     {
1462     case CREATE_THREAD_DEBUG_EVENT:
1463       OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT "
1464 		"for pid=%u tid=%x)\n",
1465 		(unsigned) current_event.dwProcessId,
1466 		(unsigned) current_event.dwThreadId));
1467 
1468       /* Record the existence of this thread.  */
1469       child_add_thread (current_event.dwProcessId,
1470 			current_event.dwThreadId,
1471 			current_event.u.CreateThread.hThread,
1472 			current_event.u.CreateThread.lpThreadLocalBase);
1473       break;
1474 
1475     case EXIT_THREAD_DEBUG_EVENT:
1476       OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT "
1477 		"for pid=%u tid=%x\n",
1478 		(unsigned) current_event.dwProcessId,
1479 		(unsigned) current_event.dwThreadId));
1480       child_delete_thread (current_event.dwProcessId,
1481 			   current_event.dwThreadId);
1482 
1483       current_thread = get_first_thread ();
1484       return 1;
1485 
1486     case CREATE_PROCESS_DEBUG_EVENT:
1487       OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT "
1488 		"for pid=%u tid=%x\n",
1489 		(unsigned) current_event.dwProcessId,
1490 		(unsigned) current_event.dwThreadId));
1491       CloseHandle (current_event.u.CreateProcessInfo.hFile);
1492 
1493       if (open_process_used)
1494 	{
1495 	  CloseHandle (current_process_handle);
1496 	  open_process_used = false;
1497 	}
1498 
1499       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1500       main_thread_id = current_event.dwThreadId;
1501 
1502       /* Add the main thread.  */
1503       child_add_thread (current_event.dwProcessId,
1504 			main_thread_id,
1505 			current_event.u.CreateProcessInfo.hThread,
1506 			current_event.u.CreateProcessInfo.lpThreadLocalBase);
1507       break;
1508 
1509     case EXIT_PROCESS_DEBUG_EVENT:
1510       OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT "
1511 		"for pid=%u tid=%x\n",
1512 		(unsigned) current_event.dwProcessId,
1513 		(unsigned) current_event.dwThreadId));
1514       {
1515 	DWORD exit_status = current_event.u.ExitProcess.dwExitCode;
1516 	/* If the exit status looks like a fatal exception, but we
1517 	   don't recognize the exception's code, make the original
1518 	   exit status value available, to avoid losing information.  */
1519 	int exit_signal
1520 	  = WIFSIGNALED (exit_status) ? WTERMSIG (exit_status) : -1;
1521 	if (exit_signal == -1)
1522 	  {
1523 	    ourstatus->kind = TARGET_WAITKIND_EXITED;
1524 	    ourstatus->value.integer = exit_status;
1525 	  }
1526 	else
1527 	  {
1528 	    ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1529 	    ourstatus->value.sig = gdb_signal_from_host (exit_signal);
1530 	  }
1531       }
1532       child_continue (DBG_CONTINUE, desired_stop_thread_id);
1533       break;
1534 
1535     case LOAD_DLL_DEBUG_EVENT:
1536       OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT "
1537 		"for pid=%u tid=%x\n",
1538 		(unsigned) current_event.dwProcessId,
1539 		(unsigned) current_event.dwThreadId));
1540       CloseHandle (current_event.u.LoadDll.hFile);
1541       if (! child_initialization_done)
1542 	break;
1543       handle_load_dll ();
1544 
1545       ourstatus->kind = TARGET_WAITKIND_LOADED;
1546       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1547       break;
1548 
1549     case UNLOAD_DLL_DEBUG_EVENT:
1550       OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT "
1551 		"for pid=%u tid=%x\n",
1552 		(unsigned) current_event.dwProcessId,
1553 		(unsigned) current_event.dwThreadId));
1554       if (! child_initialization_done)
1555 	break;
1556       handle_unload_dll ();
1557       ourstatus->kind = TARGET_WAITKIND_LOADED;
1558       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1559       break;
1560 
1561     case EXCEPTION_DEBUG_EVENT:
1562       OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT "
1563 		"for pid=%u tid=%x\n",
1564 		(unsigned) current_event.dwProcessId,
1565 		(unsigned) current_event.dwThreadId));
1566       if (handle_exception (ourstatus, debug_threads)
1567 	  == HANDLE_EXCEPTION_UNHANDLED)
1568 	*continue_status = DBG_EXCEPTION_NOT_HANDLED;
1569       break;
1570 
1571     case OUTPUT_DEBUG_STRING_EVENT:
1572       /* A message from the kernel (or Cygwin).  */
1573       OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT "
1574 		"for pid=%u tid=%x\n",
1575 		(unsigned) current_event.dwProcessId,
1576 		(unsigned) current_event.dwThreadId));
1577       handle_output_debug_string (nullptr);
1578       break;
1579 
1580     default:
1581       OUTMSG2 (("gdbserver: kernel event unknown "
1582 		"for pid=%u tid=%x code=%x\n",
1583 		(unsigned) current_event.dwProcessId,
1584 		(unsigned) current_event.dwThreadId,
1585 		(unsigned) current_event.dwDebugEventCode));
1586       break;
1587     }
1588 
1589   ptid = debug_event_ptid (&current_event);
1590 
1591   if (desired_stop_thread_id != -1 && desired_stop_thread_id != ptid.lwp ())
1592     {
1593       /* Pending stop.  See the comment by the definition of
1594 	 "pending_stops" for details on why this is needed.  */
1595       OUTMSG2 (("get_windows_debug_event - "
1596 		"unexpected stop in 0x%lx (expecting 0x%x)\n",
1597 		ptid.lwp (), desired_stop_thread_id));
1598       maybe_adjust_pc ();
1599       pending_stops.push_back ({(DWORD) ptid.lwp (), *ourstatus, current_event});
1600       ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1601     }
1602   else
1603     current_thread = find_thread_ptid (ptid);
1604 
1605   return 1;
1606 }
1607 
1608 /* Wait for the inferior process to change state.
1609    STATUS will be filled in with a response code to send to GDB.
1610    Returns the signal which caused the process to stop. */
1611 ptid_t
1612 win32_process_target::wait (ptid_t ptid, target_waitstatus *ourstatus,
1613 			    int options)
1614 {
1615   if (cached_status.kind != TARGET_WAITKIND_IGNORE)
1616     {
1617       /* The core always does a wait after creating the inferior, and
1618 	 do_initial_child_stuff already ran the inferior to the
1619 	 initial breakpoint (or an exit, if creating the process
1620 	 fails).  Report it now.  */
1621       *ourstatus = cached_status;
1622       cached_status.kind = TARGET_WAITKIND_IGNORE;
1623       return debug_event_ptid (&current_event);
1624     }
1625 
1626   while (1)
1627     {
1628       DWORD continue_status;
1629       if (!get_child_debug_event (&continue_status, ourstatus))
1630 	continue;
1631 
1632       switch (ourstatus->kind)
1633 	{
1634 	case TARGET_WAITKIND_EXITED:
1635 	  OUTMSG2 (("Child exited with retcode = %x\n",
1636 		    ourstatus->value.integer));
1637 	  win32_clear_inferiors ();
1638 	  return ptid_t (current_event.dwProcessId);
1639 	case TARGET_WAITKIND_STOPPED:
1640 	case TARGET_WAITKIND_SIGNALLED:
1641 	case TARGET_WAITKIND_LOADED:
1642 	  {
1643 	    OUTMSG2 (("Child Stopped with signal = %d \n",
1644 		      ourstatus->value.sig));
1645 	    maybe_adjust_pc ();
1646 	    return debug_event_ptid (&current_event);
1647 	  }
1648 	default:
1649 	  OUTMSG (("Ignoring unknown internal event, %d\n", ourstatus->kind));
1650 	  /* fall-through */
1651 	case TARGET_WAITKIND_SPURIOUS:
1652 	  /* do nothing, just continue */
1653 	  child_continue (continue_status, desired_stop_thread_id);
1654 	  break;
1655 	}
1656     }
1657 }
1658 
1659 /* Fetch registers from the inferior process.
1660    If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
1661 void
1662 win32_process_target::fetch_registers (regcache *regcache, int regno)
1663 {
1664   child_fetch_inferior_registers (regcache, regno);
1665 }
1666 
1667 /* Store registers to the inferior process.
1668    If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
1669 void
1670 win32_process_target::store_registers (regcache *regcache, int regno)
1671 {
1672   child_store_inferior_registers (regcache, regno);
1673 }
1674 
1675 /* Read memory from the inferior process.  This should generally be
1676    called through read_inferior_memory, which handles breakpoint shadowing.
1677    Read LEN bytes at MEMADDR into a buffer at MYADDR.  */
1678 int
1679 win32_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
1680 				   int len)
1681 {
1682   return child_xfer_memory (memaddr, (char *) myaddr, len, 0, 0) != len;
1683 }
1684 
1685 /* Write memory to the inferior process.  This should generally be
1686    called through write_inferior_memory, which handles breakpoint shadowing.
1687    Write LEN bytes from the buffer at MYADDR to MEMADDR.
1688    Returns 0 on success and errno on failure.  */
1689 int
1690 win32_process_target::write_memory (CORE_ADDR memaddr,
1691 				    const unsigned char *myaddr, int len)
1692 {
1693   return child_xfer_memory (memaddr, (char *) myaddr, len, 1, 0) != len;
1694 }
1695 
1696 /* Send an interrupt request to the inferior process. */
1697 void
1698 win32_process_target::request_interrupt ()
1699 {
1700   winapi_DebugBreakProcess DebugBreakProcess;
1701   winapi_GenerateConsoleCtrlEvent GenerateConsoleCtrlEvent;
1702 
1703 #ifdef _WIN32_WCE
1704   HMODULE dll = GetModuleHandle (_T("COREDLL.DLL"));
1705 #else
1706   HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
1707 #endif
1708 
1709   GenerateConsoleCtrlEvent = GETPROCADDRESS (dll, GenerateConsoleCtrlEvent);
1710 
1711   if (GenerateConsoleCtrlEvent != NULL
1712       && GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, current_process_id))
1713     return;
1714 
1715   /* GenerateConsoleCtrlEvent can fail if process id being debugged is
1716      not a process group id.
1717      Fallback to XP/Vista 'DebugBreakProcess', which generates a
1718      breakpoint exception in the interior process.  */
1719 
1720   DebugBreakProcess = GETPROCADDRESS (dll, DebugBreakProcess);
1721 
1722   if (DebugBreakProcess != NULL
1723       && DebugBreakProcess (current_process_handle))
1724     return;
1725 
1726   /* Last resort, suspend all threads manually.  */
1727   soft_interrupt_requested = 1;
1728 }
1729 
1730 bool
1731 win32_process_target::supports_hardware_single_step ()
1732 {
1733   return true;
1734 }
1735 
1736 #ifdef _WIN32_WCE
1737 int
1738 win32_error_to_fileio_error (DWORD err)
1739 {
1740   switch (err)
1741     {
1742     case ERROR_BAD_PATHNAME:
1743     case ERROR_FILE_NOT_FOUND:
1744     case ERROR_INVALID_NAME:
1745     case ERROR_PATH_NOT_FOUND:
1746       return FILEIO_ENOENT;
1747     case ERROR_CRC:
1748     case ERROR_IO_DEVICE:
1749     case ERROR_OPEN_FAILED:
1750       return FILEIO_EIO;
1751     case ERROR_INVALID_HANDLE:
1752       return FILEIO_EBADF;
1753     case ERROR_ACCESS_DENIED:
1754     case ERROR_SHARING_VIOLATION:
1755       return FILEIO_EACCES;
1756     case ERROR_NOACCESS:
1757       return FILEIO_EFAULT;
1758     case ERROR_BUSY:
1759       return FILEIO_EBUSY;
1760     case ERROR_ALREADY_EXISTS:
1761     case ERROR_FILE_EXISTS:
1762       return FILEIO_EEXIST;
1763     case ERROR_BAD_DEVICE:
1764       return FILEIO_ENODEV;
1765     case ERROR_DIRECTORY:
1766       return FILEIO_ENOTDIR;
1767     case ERROR_FILENAME_EXCED_RANGE:
1768     case ERROR_INVALID_DATA:
1769     case ERROR_INVALID_PARAMETER:
1770     case ERROR_NEGATIVE_SEEK:
1771       return FILEIO_EINVAL;
1772     case ERROR_TOO_MANY_OPEN_FILES:
1773       return FILEIO_EMFILE;
1774     case ERROR_HANDLE_DISK_FULL:
1775     case ERROR_DISK_FULL:
1776       return FILEIO_ENOSPC;
1777     case ERROR_WRITE_PROTECT:
1778       return FILEIO_EROFS;
1779     case ERROR_NOT_SUPPORTED:
1780       return FILEIO_ENOSYS;
1781     }
1782 
1783   return FILEIO_EUNKNOWN;
1784 }
1785 
1786 void
1787 win32_process_target::hostio_last_error (char *buf)
1788 {
1789   DWORD winerr = GetLastError ();
1790   int fileio_err = win32_error_to_fileio_error (winerr);
1791   sprintf (buf, "F-1,%x", fileio_err);
1792 }
1793 #endif
1794 
1795 bool
1796 win32_process_target::supports_qxfer_siginfo ()
1797 {
1798   return true;
1799 }
1800 
1801 /* Write Windows signal info.  */
1802 
1803 int
1804 win32_process_target::qxfer_siginfo (const char *annex,
1805 				     unsigned char *readbuf,
1806 				     unsigned const char *writebuf,
1807 				     CORE_ADDR offset, int len)
1808 {
1809   if (siginfo_er.ExceptionCode == 0)
1810     return -1;
1811 
1812   if (readbuf == nullptr)
1813     return -1;
1814 
1815   char *buf = (char *) &siginfo_er;
1816   size_t bufsize = sizeof (siginfo_er);
1817 
1818 #ifdef __x86_64__
1819   EXCEPTION_RECORD32 er32;
1820   if (wow64_process)
1821     {
1822       buf = (char *) &er32;
1823       bufsize = sizeof (er32);
1824 
1825       er32.ExceptionCode = siginfo_er.ExceptionCode;
1826       er32.ExceptionFlags = siginfo_er.ExceptionFlags;
1827       er32.ExceptionRecord = (uintptr_t) siginfo_er.ExceptionRecord;
1828       er32.ExceptionAddress = (uintptr_t) siginfo_er.ExceptionAddress;
1829       er32.NumberParameters = siginfo_er.NumberParameters;
1830       int i;
1831       for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++)
1832 	er32.ExceptionInformation[i] = siginfo_er.ExceptionInformation[i];
1833     }
1834 #endif
1835 
1836   if (offset > bufsize)
1837     return -1;
1838 
1839   if (offset + len > bufsize)
1840     len = bufsize - offset;
1841 
1842   memcpy (readbuf, buf + offset, len);
1843 
1844   return len;
1845 }
1846 
1847 bool
1848 win32_process_target::supports_get_tib_address ()
1849 {
1850   return true;
1851 }
1852 
1853 /* Write Windows OS Thread Information Block address.  */
1854 
1855 int
1856 win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
1857 {
1858   windows_thread_info *th;
1859   th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
1860   if (th == NULL)
1861     return 0;
1862   if (addr != NULL)
1863     *addr = th->thread_local_base;
1864   return 1;
1865 }
1866 
1867 /* Implementation of the target_ops method "sw_breakpoint_from_kind".  */
1868 
1869 const gdb_byte *
1870 win32_process_target::sw_breakpoint_from_kind (int kind, int *size)
1871 {
1872   *size = the_low_target.breakpoint_len;
1873   return the_low_target.breakpoint;
1874 }
1875 
1876 bool
1877 win32_process_target::stopped_by_sw_breakpoint ()
1878 {
1879   windows_thread_info *th = thread_rec (current_thread_ptid (),
1880 					DONT_INVALIDATE_CONTEXT);
1881   return th == nullptr ? false : th->stopped_at_software_breakpoint;
1882 }
1883 
1884 bool
1885 win32_process_target::supports_stopped_by_sw_breakpoint ()
1886 {
1887   return true;
1888 }
1889 
1890 CORE_ADDR
1891 win32_process_target::read_pc (struct regcache *regcache)
1892 {
1893   return (*the_low_target.get_pc) (regcache);
1894 }
1895 
1896 void
1897 win32_process_target::write_pc (struct regcache *regcache, CORE_ADDR pc)
1898 {
1899   return (*the_low_target.set_pc) (regcache, pc);
1900 }
1901 
1902 /* The win32 target ops object.  */
1903 
1904 static win32_process_target the_win32_target;
1905 
1906 /* Initialize the Win32 backend.  */
1907 void
1908 initialize_low (void)
1909 {
1910   set_target_ops (&the_win32_target);
1911   the_low_target.arch_setup ();
1912 
1913 #ifdef __x86_64__
1914   /* These functions are loaded dynamically, because they are not available
1915      on Windows XP.  */
1916   HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
1917   win32_Wow64GetThreadContext = GETPROCADDRESS (dll, Wow64GetThreadContext);
1918   win32_Wow64SetThreadContext = GETPROCADDRESS (dll, Wow64SetThreadContext);
1919 #endif
1920 }
1921