Remove windows_process_info::id
[binutils-gdb.git] / gdbserver / win32-low.cc
1 /* Low level interface to Windows debugging, for gdbserver.
2 Copyright (C) 2006-2022 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 /* See win32-low.h. */
42 windows_process_info windows_process;
43
44 #ifndef USE_WIN32API
45 #include <sys/cygwin.h>
46 #endif
47
48 #define OUTMSG(X) do { printf X; fflush (stderr); } while (0)
49
50 #define OUTMSG2(X) \
51 do \
52 { \
53 if (debug_threads) \
54 { \
55 printf X; \
56 fflush (stderr); \
57 } \
58 } while (0)
59
60 #ifndef _T
61 #define _T(x) TEXT (x)
62 #endif
63
64 #ifndef COUNTOF
65 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
66 #endif
67
68 int using_threads = 1;
69
70 /* Globals. */
71 static int attaching = 0;
72
73 /* A status that hasn't been reported to the core yet, and so
74 win32_wait should return it next, instead of fetching the next
75 debug event off the win32 API. */
76 static struct target_waitstatus cached_status;
77
78 /* Non zero if an interrupt request is to be satisfied by suspending
79 all threads. */
80 static int soft_interrupt_requested = 0;
81
82 /* Non zero if the inferior is stopped in a simulated breakpoint done
83 by suspending all the threads. */
84 static int faked_breakpoint = 0;
85
86 /* True if current_process_handle needs to be closed. */
87 static bool open_process_used = false;
88
89 const struct target_desc *win32_tdesc;
90 #ifdef __x86_64__
91 const struct target_desc *wow64_win32_tdesc;
92 #endif
93
94 #define NUM_REGS (the_low_target.num_regs ())
95
96 /* Get the thread ID from the current selected inferior (the current
97 thread). */
98 static ptid_t
99 current_thread_ptid (void)
100 {
101 return current_ptid;
102 }
103
104 /* The current debug event from WaitForDebugEvent. */
105 static ptid_t
106 debug_event_ptid (DEBUG_EVENT *event)
107 {
108 return ptid_t (event->dwProcessId, event->dwThreadId, 0);
109 }
110
111 /* Get the thread context of the thread associated with TH. */
112
113 static void
114 win32_get_thread_context (windows_thread_info *th)
115 {
116 #ifdef __x86_64__
117 if (windows_process.wow64_process)
118 memset (&th->wow64_context, 0, sizeof (WOW64_CONTEXT));
119 else
120 #endif
121 memset (&th->context, 0, sizeof (CONTEXT));
122 (*the_low_target.get_thread_context) (th);
123 }
124
125 /* Set the thread context of the thread associated with TH. */
126
127 static void
128 win32_set_thread_context (windows_thread_info *th)
129 {
130 #ifdef __x86_64__
131 if (windows_process.wow64_process)
132 Wow64SetThreadContext (th->h, &th->wow64_context);
133 else
134 #endif
135 SetThreadContext (th->h, &th->context);
136 }
137
138 /* Set the thread context of the thread associated with TH. */
139
140 static void
141 win32_prepare_to_resume (windows_thread_info *th)
142 {
143 if (the_low_target.prepare_to_resume != NULL)
144 (*the_low_target.prepare_to_resume) (th);
145 }
146
147 /* See win32-low.h. */
148
149 void
150 win32_require_context (windows_thread_info *th)
151 {
152 DWORD context_flags;
153 #ifdef __x86_64__
154 if (windows_process.wow64_process)
155 context_flags = th->wow64_context.ContextFlags;
156 else
157 #endif
158 context_flags = th->context.ContextFlags;
159 if (context_flags == 0)
160 {
161 th->suspend ();
162 win32_get_thread_context (th);
163 }
164 }
165
166 /* See nat/windows-nat.h. */
167
168 windows_thread_info *
169 windows_nat::windows_process_info::thread_rec
170 (ptid_t ptid, thread_disposition_type disposition)
171 {
172 thread_info *thread = find_thread_ptid (ptid);
173 if (thread == NULL)
174 return NULL;
175
176 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
177 if (disposition != DONT_INVALIDATE_CONTEXT)
178 win32_require_context (th);
179 return th;
180 }
181
182 /* Add a thread to the thread list. */
183 static windows_thread_info *
184 child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb)
185 {
186 windows_thread_info *th;
187 ptid_t ptid = ptid_t (pid, tid, 0);
188
189 if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
190 return th;
191
192 CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
193 #ifdef __x86_64__
194 /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
195 and the 32bit TIB is exactly 2 pages after it. */
196 if (windows_process.wow64_process)
197 base += 2 * 4096; /* page size = 4096 */
198 #endif
199 th = new windows_thread_info (tid, h, base);
200
201 add_thread (ptid, th);
202
203 if (the_low_target.thread_added != NULL)
204 (*the_low_target.thread_added) (th);
205
206 return th;
207 }
208
209 /* Delete a thread from the list of threads. */
210 static void
211 delete_thread_info (thread_info *thread)
212 {
213 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
214
215 remove_thread (thread);
216 delete th;
217 }
218
219 /* Delete a thread from the list of threads. */
220 static void
221 child_delete_thread (DWORD pid, DWORD tid)
222 {
223 /* If the last thread is exiting, just return. */
224 if (all_threads.size () == 1)
225 return;
226
227 thread_info *thread = find_thread_ptid (ptid_t (pid, tid));
228 if (thread == NULL)
229 return;
230
231 delete_thread_info (thread);
232 }
233
234 /* These watchpoint related wrapper functions simply pass on the function call
235 if the low target has registered a corresponding function. */
236
237 bool
238 win32_process_target::supports_z_point_type (char z_type)
239 {
240 return (z_type == Z_PACKET_SW_BP
241 || (the_low_target.supports_z_point_type != NULL
242 && the_low_target.supports_z_point_type (z_type)));
243 }
244
245 int
246 win32_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
247 int size, raw_breakpoint *bp)
248 {
249 if (type == raw_bkpt_type_sw)
250 return insert_memory_breakpoint (bp);
251 else if (the_low_target.insert_point != NULL)
252 return the_low_target.insert_point (type, addr, size, bp);
253 else
254 /* Unsupported (see target.h). */
255 return 1;
256 }
257
258 int
259 win32_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
260 int size, raw_breakpoint *bp)
261 {
262 if (type == raw_bkpt_type_sw)
263 return remove_memory_breakpoint (bp);
264 else if (the_low_target.remove_point != NULL)
265 return the_low_target.remove_point (type, addr, size, bp);
266 else
267 /* Unsupported (see target.h). */
268 return 1;
269 }
270
271 bool
272 win32_process_target::stopped_by_watchpoint ()
273 {
274 if (the_low_target.stopped_by_watchpoint != NULL)
275 return the_low_target.stopped_by_watchpoint ();
276 else
277 return false;
278 }
279
280 CORE_ADDR
281 win32_process_target::stopped_data_address ()
282 {
283 if (the_low_target.stopped_data_address != NULL)
284 return the_low_target.stopped_data_address ();
285 else
286 return 0;
287 }
288
289
290 /* Transfer memory from/to the debugged process. */
291 static int
292 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
293 int write, process_stratum_target *target)
294 {
295 BOOL success;
296 SIZE_T done = 0;
297 DWORD lasterror = 0;
298 uintptr_t addr = (uintptr_t) memaddr;
299
300 if (write)
301 {
302 success = WriteProcessMemory (windows_process.handle, (LPVOID) addr,
303 (LPCVOID) our, len, &done);
304 if (!success)
305 lasterror = GetLastError ();
306 FlushInstructionCache (windows_process.handle, (LPCVOID) addr, len);
307 }
308 else
309 {
310 success = ReadProcessMemory (windows_process.handle, (LPCVOID) addr,
311 (LPVOID) our, len, &done);
312 if (!success)
313 lasterror = GetLastError ();
314 }
315 if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
316 return done;
317 else
318 return success ? done : -1;
319 }
320
321 /* Clear out any old thread list and reinitialize it to a pristine
322 state. */
323 static void
324 child_init_thread_list (void)
325 {
326 for_each_thread (delete_thread_info);
327 }
328
329 /* Zero during the child initialization phase, and nonzero otherwise. */
330
331 static int child_initialization_done = 0;
332
333 static void
334 do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
335 {
336 struct process_info *proc;
337
338 windows_process.last_sig = GDB_SIGNAL_0;
339 windows_process.handle = proch;
340 windows_process.main_thread_id = 0;
341
342 soft_interrupt_requested = 0;
343 faked_breakpoint = 0;
344 open_process_used = true;
345
346 memset (&windows_process.current_event, 0,
347 sizeof (windows_process.current_event));
348
349 #ifdef __x86_64__
350 BOOL wow64;
351 if (!IsWow64Process (proch, &wow64))
352 {
353 DWORD err = GetLastError ();
354 error ("Check if WOW64 process failed (error %d): %s\n",
355 (int) err, strwinerror (err));
356 }
357 windows_process.wow64_process = wow64;
358
359 if (windows_process.wow64_process
360 && (Wow64GetThreadContext == nullptr
361 || Wow64SetThreadContext == nullptr))
362 error ("WOW64 debugging is not supported on this system.\n");
363
364 windows_process.ignore_first_breakpoint
365 = !attached && windows_process.wow64_process;
366 #endif
367
368 proc = add_process (pid, attached);
369 #ifdef __x86_64__
370 if (windows_process.wow64_process)
371 proc->tdesc = wow64_win32_tdesc;
372 else
373 #endif
374 proc->tdesc = win32_tdesc;
375 child_init_thread_list ();
376 child_initialization_done = 0;
377
378 if (the_low_target.initial_stuff != NULL)
379 (*the_low_target.initial_stuff) ();
380
381 cached_status.set_ignore ();
382
383 /* Flush all currently pending debug events (thread and dll list) up
384 to the initial breakpoint. */
385 while (1)
386 {
387 struct target_waitstatus status;
388
389 the_target->wait (minus_one_ptid, &status, 0);
390
391 /* Note win32_wait doesn't return thread events. */
392 if (status.kind () != TARGET_WAITKIND_LOADED)
393 {
394 cached_status = status;
395 break;
396 }
397
398 {
399 struct thread_resume resume;
400
401 resume.thread = minus_one_ptid;
402 resume.kind = resume_continue;
403 resume.sig = 0;
404
405 the_target->resume (&resume, 1);
406 }
407 }
408
409 /* Now that the inferior has been started and all DLLs have been mapped,
410 we can iterate over all DLLs and load them in.
411
412 We avoid doing it any earlier because, on certain versions of Windows,
413 LOAD_DLL_DEBUG_EVENTs are sometimes not complete. In particular,
414 we have seen on Windows 8.1 that the ntdll.dll load event does not
415 include the DLL name, preventing us from creating an associated SO.
416 A possible explanation is that ntdll.dll might be mapped before
417 the SO info gets created by the Windows system -- ntdll.dll is
418 the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
419 do not seem to suffer from that problem.
420
421 Rather than try to work around this sort of issue, it is much
422 simpler to just ignore DLL load/unload events during the startup
423 phase, and then process them all in one batch now. */
424 windows_process.add_all_dlls ();
425
426 child_initialization_done = 1;
427 }
428
429 /* Resume all artificially suspended threads if we are continuing
430 execution. */
431 static void
432 continue_one_thread (thread_info *thread, int thread_id)
433 {
434 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
435
436 if (thread_id == -1 || thread_id == th->tid)
437 {
438 win32_prepare_to_resume (th);
439
440 if (th->suspended)
441 {
442 DWORD *context_flags;
443 #ifdef __x86_64__
444 if (windows_process.wow64_process)
445 context_flags = &th->wow64_context.ContextFlags;
446 else
447 #endif
448 context_flags = &th->context.ContextFlags;
449 if (*context_flags)
450 {
451 win32_set_thread_context (th);
452 *context_flags = 0;
453 }
454
455 th->resume ();
456 }
457 }
458 }
459
460 static BOOL
461 child_continue (DWORD continue_status, int thread_id)
462 {
463 windows_process.desired_stop_thread_id = thread_id;
464 if (windows_process.matching_pending_stop (debug_threads))
465 return TRUE;
466
467 /* The inferior will only continue after the ContinueDebugEvent
468 call. */
469 for_each_thread ([&] (thread_info *thread)
470 {
471 continue_one_thread (thread, thread_id);
472 });
473 faked_breakpoint = 0;
474
475 return continue_last_debug_event (continue_status, debug_threads);
476 }
477
478 /* Fetch register(s) from the current thread context. */
479 static void
480 child_fetch_inferior_registers (struct regcache *regcache, int r)
481 {
482 int regno;
483 windows_thread_info *th
484 = windows_process.thread_rec (current_thread_ptid (),
485 INVALIDATE_CONTEXT);
486 if (r == -1 || r > NUM_REGS)
487 child_fetch_inferior_registers (regcache, NUM_REGS);
488 else
489 for (regno = 0; regno < r; regno++)
490 (*the_low_target.fetch_inferior_register) (regcache, th, regno);
491 }
492
493 /* Store a new register value into the current thread context. We don't
494 change the program's context until later, when we resume it. */
495 static void
496 child_store_inferior_registers (struct regcache *regcache, int r)
497 {
498 int regno;
499 windows_thread_info *th
500 = windows_process.thread_rec (current_thread_ptid (),
501 INVALIDATE_CONTEXT);
502 if (r == -1 || r == 0 || r > NUM_REGS)
503 child_store_inferior_registers (regcache, NUM_REGS);
504 else
505 for (regno = 0; regno < r; regno++)
506 (*the_low_target.store_inferior_register) (regcache, th, regno);
507 }
508
509 /* Map the Windows error number in ERROR to a locale-dependent error
510 message string and return a pointer to it. Typically, the values
511 for ERROR come from GetLastError.
512
513 The string pointed to shall not be modified by the application,
514 but may be overwritten by a subsequent call to strwinerror
515
516 The strwinerror function does not change the current setting
517 of GetLastError. */
518
519 char *
520 strwinerror (DWORD error)
521 {
522 static char buf[1024];
523 TCHAR *msgbuf;
524 DWORD lasterr = GetLastError ();
525 DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
526 | FORMAT_MESSAGE_ALLOCATE_BUFFER,
527 NULL,
528 error,
529 0, /* Default language */
530 (LPTSTR) &msgbuf,
531 0,
532 NULL);
533 if (chars != 0)
534 {
535 /* If there is an \r\n appended, zap it. */
536 if (chars >= 2
537 && msgbuf[chars - 2] == '\r'
538 && msgbuf[chars - 1] == '\n')
539 {
540 chars -= 2;
541 msgbuf[chars] = 0;
542 }
543
544 if (chars > ((COUNTOF (buf)) - 1))
545 {
546 chars = COUNTOF (buf) - 1;
547 msgbuf [chars] = 0;
548 }
549
550 #ifdef UNICODE
551 wcstombs (buf, msgbuf, chars + 1);
552 #else
553 strncpy (buf, msgbuf, chars + 1);
554 #endif
555 LocalFree (msgbuf);
556 }
557 else
558 sprintf (buf, "unknown win32 error (%u)", (unsigned) error);
559
560 SetLastError (lasterr);
561 return buf;
562 }
563
564 static BOOL
565 create_process (const char *program, char *args,
566 DWORD flags, PROCESS_INFORMATION *pi)
567 {
568 const std::string &inferior_cwd = get_inferior_cwd ();
569 BOOL ret;
570 size_t argslen, proglen;
571
572 proglen = strlen (program) + 1;
573 argslen = strlen (args) + proglen;
574
575 STARTUPINFOA si = { sizeof (STARTUPINFOA) };
576 char *program_and_args = (char *) alloca (argslen + 1);
577
578 strcpy (program_and_args, program);
579 strcat (program_and_args, " ");
580 strcat (program_and_args, args);
581 ret = CreateProcessA (program, /* image name */
582 program_and_args, /* command line */
583 NULL, /* security */
584 NULL, /* thread */
585 TRUE, /* inherit handles */
586 flags, /* start flags */
587 NULL, /* environment */
588 /* current directory */
589 (inferior_cwd.empty ()
590 ? NULL
591 : gdb_tilde_expand (inferior_cwd.c_str ()).c_str()),
592 &si, /* start info */
593 pi); /* proc info */
594
595 return ret;
596 }
597
598 /* Start a new process.
599 PROGRAM is the program name.
600 PROGRAM_ARGS is the vector containing the inferior's args.
601 Returns the new PID on success, -1 on failure. Registers the new
602 process with the process list. */
603 int
604 win32_process_target::create_inferior (const char *program,
605 const std::vector<char *> &program_args)
606 {
607 client_state &cs = get_client_state ();
608 #ifndef USE_WIN32API
609 char real_path[PATH_MAX];
610 char *orig_path, *new_path, *path_ptr;
611 #endif
612 BOOL ret;
613 DWORD flags;
614 PROCESS_INFORMATION pi;
615 DWORD err;
616 std::string str_program_args = construct_inferior_arguments (program_args);
617 char *args = (char *) str_program_args.c_str ();
618
619 /* win32_wait needs to know we're not attaching. */
620 attaching = 0;
621
622 if (!program)
623 error ("No executable specified, specify executable to debug.\n");
624
625 flags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
626
627 #ifndef USE_WIN32API
628 orig_path = NULL;
629 path_ptr = getenv ("PATH");
630 if (path_ptr)
631 {
632 int size = cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, NULL, 0);
633 orig_path = (char *) alloca (strlen (path_ptr) + 1);
634 new_path = (char *) alloca (size);
635 strcpy (orig_path, path_ptr);
636 cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, new_path, size);
637 setenv ("PATH", new_path, 1);
638 }
639 cygwin_conv_path (CCP_POSIX_TO_WIN_A, program, real_path, PATH_MAX);
640 program = real_path;
641 #endif
642
643 OUTMSG2 (("Command line is \"%s %s\"\n", program, args));
644
645 #ifdef CREATE_NEW_PROCESS_GROUP
646 flags |= CREATE_NEW_PROCESS_GROUP;
647 #endif
648
649 ret = create_process (program, args, flags, &pi);
650 err = GetLastError ();
651 if (!ret && err == ERROR_FILE_NOT_FOUND)
652 {
653 char *exename = (char *) alloca (strlen (program) + 5);
654 strcat (strcpy (exename, program), ".exe");
655 ret = create_process (exename, args, flags, &pi);
656 err = GetLastError ();
657 }
658
659 #ifndef USE_WIN32API
660 if (orig_path)
661 setenv ("PATH", orig_path, 1);
662 #endif
663
664 if (!ret)
665 {
666 error ("Error creating process \"%s %s\", (error %d): %s\n",
667 program, args, (int) err, strwinerror (err));
668 }
669 else
670 {
671 OUTMSG2 (("Process created: %s %s\n", program, (char *) args));
672 }
673
674 CloseHandle (pi.hThread);
675
676 do_initial_child_stuff (pi.hProcess, pi.dwProcessId, 0);
677
678 /* Wait till we are at 1st instruction in program, return new pid
679 (assuming success). */
680 cs.last_ptid = wait (ptid_t (pi.dwProcessId), &cs.last_status, 0);
681
682 /* Necessary for handle_v_kill. */
683 signal_pid = pi.dwProcessId;
684
685 return pi.dwProcessId;
686 }
687
688 /* Attach to a running process.
689 PID is the process ID to attach to, specified by the user
690 or a higher layer. */
691 int
692 win32_process_target::attach (unsigned long pid)
693 {
694 HANDLE h;
695 DWORD err;
696
697 h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
698 if (h != NULL)
699 {
700 if (DebugActiveProcess (pid))
701 {
702 DebugSetProcessKillOnExit (FALSE);
703
704 /* win32_wait needs to know we're attaching. */
705 attaching = 1;
706 do_initial_child_stuff (h, pid, 1);
707 return 0;
708 }
709
710 CloseHandle (h);
711 }
712
713 err = GetLastError ();
714 error ("Attach to process failed (error %d): %s\n",
715 (int) err, strwinerror (err));
716 }
717
718 /* See nat/windows-nat.h. */
719
720 int
721 windows_nat::windows_process_info::handle_output_debug_string
722 (struct target_waitstatus *ourstatus)
723 {
724 #define READ_BUFFER_LEN 1024
725 CORE_ADDR addr;
726 char s[READ_BUFFER_LEN + 1] = { 0 };
727 DWORD nbytes = current_event.u.DebugString.nDebugStringLength;
728
729 if (nbytes == 0)
730 return 0;
731
732 if (nbytes > READ_BUFFER_LEN)
733 nbytes = READ_BUFFER_LEN;
734
735 addr = (CORE_ADDR) (size_t) current_event.u.DebugString.lpDebugStringData;
736
737 if (current_event.u.DebugString.fUnicode)
738 {
739 /* The event tells us how many bytes, not chars, even
740 in Unicode. */
741 WCHAR buffer[(READ_BUFFER_LEN + 1) / sizeof (WCHAR)] = { 0 };
742 if (read_inferior_memory (addr, (unsigned char *) buffer, nbytes) != 0)
743 return 0;
744 wcstombs (s, buffer, (nbytes + 1) / sizeof (WCHAR));
745 }
746 else
747 {
748 if (read_inferior_memory (addr, (unsigned char *) s, nbytes) != 0)
749 return 0;
750 }
751
752 if (!startswith (s, "cYg"))
753 {
754 if (!server_waiting)
755 {
756 OUTMSG2(("%s", s));
757 return 0;
758 }
759
760 monitor_output (s);
761 }
762 #undef READ_BUFFER_LEN
763
764 return 0;
765 }
766
767 static void
768 win32_clear_inferiors (void)
769 {
770 if (open_process_used)
771 {
772 CloseHandle (windows_process.handle);
773 open_process_used = false;
774 }
775
776 for_each_thread (delete_thread_info);
777 windows_process.siginfo_er.ExceptionCode = 0;
778 clear_inferiors ();
779 }
780
781 /* Implementation of target_ops::kill. */
782
783 int
784 win32_process_target::kill (process_info *process)
785 {
786 TerminateProcess (windows_process.handle, 0);
787 for (;;)
788 {
789 if (!child_continue (DBG_CONTINUE, -1))
790 break;
791 if (!wait_for_debug_event (&windows_process.current_event, INFINITE))
792 break;
793 if (windows_process.current_event.dwDebugEventCode
794 == EXIT_PROCESS_DEBUG_EVENT)
795 break;
796 else if (windows_process.current_event.dwDebugEventCode
797 == OUTPUT_DEBUG_STRING_EVENT)
798 windows_process.handle_output_debug_string (nullptr);
799 }
800
801 win32_clear_inferiors ();
802
803 remove_process (process);
804 return 0;
805 }
806
807 /* Implementation of target_ops::detach. */
808
809 int
810 win32_process_target::detach (process_info *process)
811 {
812 struct thread_resume resume;
813 resume.thread = minus_one_ptid;
814 resume.kind = resume_continue;
815 resume.sig = 0;
816 this->resume (&resume, 1);
817
818 if (!DebugActiveProcessStop (process->pid))
819 return -1;
820
821 DebugSetProcessKillOnExit (FALSE);
822 remove_process (process);
823
824 win32_clear_inferiors ();
825 return 0;
826 }
827
828 void
829 win32_process_target::mourn (struct process_info *process)
830 {
831 remove_process (process);
832 }
833
834 /* Implementation of target_ops::join. */
835
836 void
837 win32_process_target::join (int pid)
838 {
839 HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
840 if (h != NULL)
841 {
842 WaitForSingleObject (h, INFINITE);
843 CloseHandle (h);
844 }
845 }
846
847 /* Return true iff the thread with thread ID TID is alive. */
848 bool
849 win32_process_target::thread_alive (ptid_t ptid)
850 {
851 /* Our thread list is reliable; don't bother to poll target
852 threads. */
853 return find_thread_ptid (ptid) != NULL;
854 }
855
856 /* Resume the inferior process. RESUME_INFO describes how we want
857 to resume. */
858 void
859 win32_process_target::resume (thread_resume *resume_info, size_t n)
860 {
861 DWORD tid;
862 enum gdb_signal sig;
863 int step;
864 windows_thread_info *th;
865 DWORD continue_status = DBG_CONTINUE;
866 ptid_t ptid;
867
868 /* This handles the very limited set of resume packets that GDB can
869 currently produce. */
870
871 if (n == 1 && resume_info[0].thread == minus_one_ptid)
872 tid = -1;
873 else if (n > 1)
874 tid = -1;
875 else
876 /* Yes, we're ignoring resume_info[0].thread. It'd be tricky to make
877 the Windows resume code do the right thing for thread switching. */
878 tid = windows_process.current_event.dwThreadId;
879
880 if (resume_info[0].thread != minus_one_ptid)
881 {
882 sig = gdb_signal_from_host (resume_info[0].sig);
883 step = resume_info[0].kind == resume_step;
884 }
885 else
886 {
887 sig = GDB_SIGNAL_0;
888 step = 0;
889 }
890
891 if (sig != GDB_SIGNAL_0)
892 {
893 if (windows_process.current_event.dwDebugEventCode
894 != EXCEPTION_DEBUG_EVENT)
895 {
896 OUTMSG (("Cannot continue with signal %s here.\n",
897 gdb_signal_to_string (sig)));
898 }
899 else if (sig == windows_process.last_sig)
900 continue_status = DBG_EXCEPTION_NOT_HANDLED;
901 else
902 OUTMSG (("Can only continue with received signal %s.\n",
903 gdb_signal_to_string (windows_process.last_sig)));
904 }
905
906 windows_process.last_sig = GDB_SIGNAL_0;
907
908 /* Get context for the currently selected thread. */
909 ptid = debug_event_ptid (&windows_process.current_event);
910 th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
911 if (th)
912 {
913 win32_prepare_to_resume (th);
914
915 DWORD *context_flags;
916 #ifdef __x86_64__
917 if (windows_process.wow64_process)
918 context_flags = &th->wow64_context.ContextFlags;
919 else
920 #endif
921 context_flags = &th->context.ContextFlags;
922 if (*context_flags)
923 {
924 /* Move register values from the inferior into the thread
925 context structure. */
926 regcache_invalidate ();
927
928 if (step)
929 {
930 if (the_low_target.single_step != NULL)
931 (*the_low_target.single_step) (th);
932 else
933 error ("Single stepping is not supported "
934 "in this configuration.\n");
935 }
936
937 win32_set_thread_context (th);
938 *context_flags = 0;
939 }
940 }
941
942 /* Allow continuing with the same signal that interrupted us.
943 Otherwise complain. */
944
945 child_continue (continue_status, tid);
946 }
947
948 /* See nat/windows-nat.h. */
949
950 void
951 windows_nat::windows_process_info::handle_load_dll (const char *name,
952 LPVOID base)
953 {
954 CORE_ADDR load_addr = (CORE_ADDR) (uintptr_t) base;
955
956 char buf[MAX_PATH + 1];
957 char buf2[MAX_PATH + 1];
958
959 WIN32_FIND_DATAA w32_fd;
960 HANDLE h = FindFirstFileA (name, &w32_fd);
961
962 /* The symbols in a dll are offset by 0x1000, which is the
963 offset from 0 of the first byte in an image - because
964 of the file header and the section alignment. */
965 load_addr += 0x1000;
966
967 if (h == INVALID_HANDLE_VALUE)
968 strcpy (buf, name);
969 else
970 {
971 FindClose (h);
972 strcpy (buf, name);
973 {
974 char cwd[MAX_PATH + 1];
975 char *p;
976 if (GetCurrentDirectoryA (MAX_PATH + 1, cwd))
977 {
978 p = strrchr (buf, '\\');
979 if (p)
980 p[1] = '\0';
981 SetCurrentDirectoryA (buf);
982 GetFullPathNameA (w32_fd.cFileName, MAX_PATH, buf, &p);
983 SetCurrentDirectoryA (cwd);
984 }
985 }
986 }
987
988 if (strcasecmp (buf, "ntdll.dll") == 0)
989 {
990 GetSystemDirectoryA (buf, sizeof (buf));
991 strcat (buf, "\\ntdll.dll");
992 }
993
994 #ifdef __CYGWIN__
995 cygwin_conv_path (CCP_WIN_A_TO_POSIX, buf, buf2, sizeof (buf2));
996 #else
997 strcpy (buf2, buf);
998 #endif
999
1000 loaded_dll (buf2, load_addr);
1001 }
1002
1003 /* See nat/windows-nat.h. */
1004
1005 void
1006 windows_nat::windows_process_info::handle_unload_dll ()
1007 {
1008 CORE_ADDR load_addr =
1009 (CORE_ADDR) (uintptr_t) current_event.u.UnloadDll.lpBaseOfDll;
1010
1011 /* The symbols in a dll are offset by 0x1000, which is the
1012 offset from 0 of the first byte in an image - because
1013 of the file header and the section alignment. */
1014 load_addr += 0x1000;
1015 unloaded_dll (NULL, load_addr);
1016 }
1017
1018 static void
1019 suspend_one_thread (thread_info *thread)
1020 {
1021 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread);
1022
1023 th->suspend ();
1024 }
1025
1026 static void
1027 fake_breakpoint_event (void)
1028 {
1029 OUTMSG2(("fake_breakpoint_event\n"));
1030
1031 faked_breakpoint = 1;
1032
1033 memset (&windows_process.current_event, 0,
1034 sizeof (windows_process.current_event));
1035 windows_process.current_event.dwThreadId = windows_process.main_thread_id;
1036 windows_process.current_event.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
1037 windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode
1038 = EXCEPTION_BREAKPOINT;
1039
1040 for_each_thread (suspend_one_thread);
1041 }
1042
1043 /* See nat/windows-nat.h. */
1044
1045 bool
1046 windows_nat::windows_process_info::handle_access_violation
1047 (const EXCEPTION_RECORD *rec)
1048 {
1049 return false;
1050 }
1051
1052 /* A helper function that will, if needed, set
1053 'stopped_at_software_breakpoint' on the thread and adjust the
1054 PC. */
1055
1056 static void
1057 maybe_adjust_pc ()
1058 {
1059 struct regcache *regcache = get_thread_regcache (current_thread, 1);
1060 child_fetch_inferior_registers (regcache, -1);
1061
1062 windows_thread_info *th
1063 = windows_process.thread_rec (current_thread_ptid (),
1064 DONT_INVALIDATE_CONTEXT);
1065 th->stopped_at_software_breakpoint = false;
1066
1067 if (windows_process.current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
1068 && ((windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode
1069 == EXCEPTION_BREAKPOINT)
1070 || (windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode
1071 == STATUS_WX86_BREAKPOINT))
1072 && child_initialization_done)
1073 {
1074 th->stopped_at_software_breakpoint = true;
1075 CORE_ADDR pc = regcache_read_pc (regcache);
1076 CORE_ADDR sw_breakpoint_pc = pc - the_low_target.decr_pc_after_break;
1077 regcache_write_pc (regcache, sw_breakpoint_pc);
1078 }
1079 }
1080
1081 /* Get the next event from the child. */
1082
1083 static int
1084 get_child_debug_event (DWORD *continue_status,
1085 struct target_waitstatus *ourstatus)
1086 {
1087 ptid_t ptid;
1088
1089 windows_process.last_sig = GDB_SIGNAL_0;
1090 ourstatus->set_spurious ();
1091 *continue_status = DBG_CONTINUE;
1092
1093 /* Check if GDB sent us an interrupt request. */
1094 check_remote_input_interrupt_request ();
1095
1096 DEBUG_EVENT *current_event = &windows_process.current_event;
1097
1098 if (soft_interrupt_requested)
1099 {
1100 soft_interrupt_requested = 0;
1101 fake_breakpoint_event ();
1102 goto gotevent;
1103 }
1104
1105 attaching = 0;
1106 {
1107 gdb::optional<pending_stop> stop
1108 = windows_process.fetch_pending_stop (debug_threads);
1109 if (stop.has_value ())
1110 {
1111 *ourstatus = stop->status;
1112 windows_process.current_event = stop->event;
1113 ptid = debug_event_ptid (&windows_process.current_event);
1114 switch_to_thread (find_thread_ptid (ptid));
1115 return 1;
1116 }
1117
1118 /* Keep the wait time low enough for comfortable remote
1119 interruption, but high enough so gdbserver doesn't become a
1120 bottleneck. */
1121 if (!wait_for_debug_event (&windows_process.current_event, 250))
1122 {
1123 DWORD e = GetLastError();
1124
1125 if (e == ERROR_PIPE_NOT_CONNECTED)
1126 {
1127 /* This will happen if the loader fails to succesfully
1128 load the application, e.g., if the main executable
1129 tries to pull in a non-existing export from a
1130 DLL. */
1131 ourstatus->set_exited (1);
1132 return 1;
1133 }
1134
1135 return 0;
1136 }
1137 }
1138
1139 gotevent:
1140
1141 switch (current_event->dwDebugEventCode)
1142 {
1143 case CREATE_THREAD_DEBUG_EVENT:
1144 OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT "
1145 "for pid=%u tid=%x)\n",
1146 (unsigned) current_event->dwProcessId,
1147 (unsigned) current_event->dwThreadId));
1148
1149 /* Record the existence of this thread. */
1150 child_add_thread (current_event->dwProcessId,
1151 current_event->dwThreadId,
1152 current_event->u.CreateThread.hThread,
1153 current_event->u.CreateThread.lpThreadLocalBase);
1154 break;
1155
1156 case EXIT_THREAD_DEBUG_EVENT:
1157 OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT "
1158 "for pid=%u tid=%x\n",
1159 (unsigned) current_event->dwProcessId,
1160 (unsigned) current_event->dwThreadId));
1161 child_delete_thread (current_event->dwProcessId,
1162 current_event->dwThreadId);
1163
1164 switch_to_thread (get_first_thread ());
1165 return 1;
1166
1167 case CREATE_PROCESS_DEBUG_EVENT:
1168 OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT "
1169 "for pid=%u tid=%x\n",
1170 (unsigned) current_event->dwProcessId,
1171 (unsigned) current_event->dwThreadId));
1172 CloseHandle (current_event->u.CreateProcessInfo.hFile);
1173
1174 if (open_process_used)
1175 {
1176 CloseHandle (windows_process.handle);
1177 open_process_used = false;
1178 }
1179
1180 windows_process.handle = current_event->u.CreateProcessInfo.hProcess;
1181 windows_process.main_thread_id = current_event->dwThreadId;
1182
1183 /* Add the main thread. */
1184 child_add_thread (current_event->dwProcessId,
1185 windows_process.main_thread_id,
1186 current_event->u.CreateProcessInfo.hThread,
1187 current_event->u.CreateProcessInfo.lpThreadLocalBase);
1188 break;
1189
1190 case EXIT_PROCESS_DEBUG_EVENT:
1191 OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT "
1192 "for pid=%u tid=%x\n",
1193 (unsigned) current_event->dwProcessId,
1194 (unsigned) current_event->dwThreadId));
1195 {
1196 DWORD exit_status = current_event->u.ExitProcess.dwExitCode;
1197 /* If the exit status looks like a fatal exception, but we
1198 don't recognize the exception's code, make the original
1199 exit status value available, to avoid losing information. */
1200 int exit_signal
1201 = WIFSIGNALED (exit_status) ? WTERMSIG (exit_status) : -1;
1202 if (exit_signal == -1)
1203 ourstatus->set_exited (exit_status);
1204 else
1205 ourstatus->set_signalled (gdb_signal_from_host (exit_signal));
1206 }
1207 child_continue (DBG_CONTINUE, windows_process.desired_stop_thread_id);
1208 break;
1209
1210 case LOAD_DLL_DEBUG_EVENT:
1211 OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT "
1212 "for pid=%u tid=%x\n",
1213 (unsigned) current_event->dwProcessId,
1214 (unsigned) current_event->dwThreadId));
1215 CloseHandle (current_event->u.LoadDll.hFile);
1216 if (! child_initialization_done)
1217 break;
1218 windows_process.dll_loaded_event ();
1219
1220 ourstatus->set_loaded ();
1221 break;
1222
1223 case UNLOAD_DLL_DEBUG_EVENT:
1224 OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT "
1225 "for pid=%u tid=%x\n",
1226 (unsigned) current_event->dwProcessId,
1227 (unsigned) current_event->dwThreadId));
1228 if (! child_initialization_done)
1229 break;
1230 windows_process.handle_unload_dll ();
1231 ourstatus->set_loaded ();
1232 break;
1233
1234 case EXCEPTION_DEBUG_EVENT:
1235 OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT "
1236 "for pid=%u tid=%x\n",
1237 (unsigned) current_event->dwProcessId,
1238 (unsigned) current_event->dwThreadId));
1239 if (windows_process.handle_exception (ourstatus, debug_threads)
1240 == HANDLE_EXCEPTION_UNHANDLED)
1241 *continue_status = DBG_EXCEPTION_NOT_HANDLED;
1242 break;
1243
1244 case OUTPUT_DEBUG_STRING_EVENT:
1245 /* A message from the kernel (or Cygwin). */
1246 OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT "
1247 "for pid=%u tid=%x\n",
1248 (unsigned) current_event->dwProcessId,
1249 (unsigned) current_event->dwThreadId));
1250 windows_process.handle_output_debug_string (nullptr);
1251 break;
1252
1253 default:
1254 OUTMSG2 (("gdbserver: kernel event unknown "
1255 "for pid=%u tid=%x code=%x\n",
1256 (unsigned) current_event->dwProcessId,
1257 (unsigned) current_event->dwThreadId,
1258 (unsigned) current_event->dwDebugEventCode));
1259 break;
1260 }
1261
1262 ptid = debug_event_ptid (&windows_process.current_event);
1263
1264 if (windows_process.desired_stop_thread_id != -1
1265 && windows_process.desired_stop_thread_id != ptid.lwp ())
1266 {
1267 /* Pending stop. See the comment by the definition of
1268 "pending_stops" for details on why this is needed. */
1269 OUTMSG2 (("get_windows_debug_event - "
1270 "unexpected stop in 0x%lx (expecting 0x%x)\n",
1271 ptid.lwp (), windows_process.desired_stop_thread_id));
1272 maybe_adjust_pc ();
1273 windows_process.pending_stops.push_back
1274 ({(DWORD) ptid.lwp (), *ourstatus, *current_event});
1275 ourstatus->set_spurious ();
1276 }
1277 else
1278 switch_to_thread (find_thread_ptid (ptid));
1279
1280 return 1;
1281 }
1282
1283 /* Wait for the inferior process to change state.
1284 STATUS will be filled in with a response code to send to GDB.
1285 Returns the signal which caused the process to stop. */
1286 ptid_t
1287 win32_process_target::wait (ptid_t ptid, target_waitstatus *ourstatus,
1288 target_wait_flags options)
1289 {
1290 if (cached_status.kind () != TARGET_WAITKIND_IGNORE)
1291 {
1292 /* The core always does a wait after creating the inferior, and
1293 do_initial_child_stuff already ran the inferior to the
1294 initial breakpoint (or an exit, if creating the process
1295 fails). Report it now. */
1296 *ourstatus = cached_status;
1297 cached_status.set_ignore ();
1298 return debug_event_ptid (&windows_process.current_event);
1299 }
1300
1301 while (1)
1302 {
1303 DWORD continue_status;
1304 if (!get_child_debug_event (&continue_status, ourstatus))
1305 continue;
1306
1307 switch (ourstatus->kind ())
1308 {
1309 case TARGET_WAITKIND_EXITED:
1310 OUTMSG2 (("Child exited with retcode = %x\n",
1311 ourstatus->exit_status ()));
1312 win32_clear_inferiors ();
1313 return ptid_t (windows_process.current_event.dwProcessId);
1314 case TARGET_WAITKIND_STOPPED:
1315 case TARGET_WAITKIND_SIGNALLED:
1316 case TARGET_WAITKIND_LOADED:
1317 {
1318 OUTMSG2 (("Child Stopped with signal = %d \n",
1319 ourstatus->sig ()));
1320 maybe_adjust_pc ();
1321 return debug_event_ptid (&windows_process.current_event);
1322 }
1323 default:
1324 OUTMSG (("Ignoring unknown internal event, %d\n",
1325 ourstatus->kind ()));
1326 /* fall-through */
1327 case TARGET_WAITKIND_SPURIOUS:
1328 /* do nothing, just continue */
1329 child_continue (continue_status,
1330 windows_process.desired_stop_thread_id);
1331 break;
1332 }
1333 }
1334 }
1335
1336 /* Fetch registers from the inferior process.
1337 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */
1338 void
1339 win32_process_target::fetch_registers (regcache *regcache, int regno)
1340 {
1341 child_fetch_inferior_registers (regcache, regno);
1342 }
1343
1344 /* Store registers to the inferior process.
1345 If REGNO is -1, store all registers; otherwise, store at least REGNO. */
1346 void
1347 win32_process_target::store_registers (regcache *regcache, int regno)
1348 {
1349 child_store_inferior_registers (regcache, regno);
1350 }
1351
1352 /* Read memory from the inferior process. This should generally be
1353 called through read_inferior_memory, which handles breakpoint shadowing.
1354 Read LEN bytes at MEMADDR into a buffer at MYADDR. */
1355 int
1356 win32_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
1357 int len)
1358 {
1359 return child_xfer_memory (memaddr, (char *) myaddr, len, 0, 0) != len;
1360 }
1361
1362 /* Write memory to the inferior process. This should generally be
1363 called through write_inferior_memory, which handles breakpoint shadowing.
1364 Write LEN bytes from the buffer at MYADDR to MEMADDR.
1365 Returns 0 on success and errno on failure. */
1366 int
1367 win32_process_target::write_memory (CORE_ADDR memaddr,
1368 const unsigned char *myaddr, int len)
1369 {
1370 return child_xfer_memory (memaddr, (char *) myaddr, len, 1, 0) != len;
1371 }
1372
1373 /* Send an interrupt request to the inferior process. */
1374 void
1375 win32_process_target::request_interrupt ()
1376 {
1377 if (GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, signal_pid))
1378 return;
1379
1380 /* GenerateConsoleCtrlEvent can fail if process id being debugged is
1381 not a process group id.
1382 Fallback to XP/Vista 'DebugBreakProcess', which generates a
1383 breakpoint exception in the interior process. */
1384
1385 if (DebugBreakProcess (windows_process.handle))
1386 return;
1387
1388 /* Last resort, suspend all threads manually. */
1389 soft_interrupt_requested = 1;
1390 }
1391
1392 bool
1393 win32_process_target::supports_hardware_single_step ()
1394 {
1395 return true;
1396 }
1397
1398 bool
1399 win32_process_target::supports_qxfer_siginfo ()
1400 {
1401 return true;
1402 }
1403
1404 /* Write Windows signal info. */
1405
1406 int
1407 win32_process_target::qxfer_siginfo (const char *annex,
1408 unsigned char *readbuf,
1409 unsigned const char *writebuf,
1410 CORE_ADDR offset, int len)
1411 {
1412 if (windows_process.siginfo_er.ExceptionCode == 0)
1413 return -1;
1414
1415 if (readbuf == nullptr)
1416 return -1;
1417
1418 char *buf = (char *) &windows_process.siginfo_er;
1419 size_t bufsize = sizeof (windows_process.siginfo_er);
1420
1421 #ifdef __x86_64__
1422 EXCEPTION_RECORD32 er32;
1423 if (windows_process.wow64_process)
1424 {
1425 buf = (char *) &er32;
1426 bufsize = sizeof (er32);
1427
1428 er32.ExceptionCode = windows_process.siginfo_er.ExceptionCode;
1429 er32.ExceptionFlags = windows_process.siginfo_er.ExceptionFlags;
1430 er32.ExceptionRecord
1431 = (uintptr_t) windows_process.siginfo_er.ExceptionRecord;
1432 er32.ExceptionAddress
1433 = (uintptr_t) windows_process.siginfo_er.ExceptionAddress;
1434 er32.NumberParameters = windows_process.siginfo_er.NumberParameters;
1435 int i;
1436 for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++)
1437 er32.ExceptionInformation[i]
1438 = windows_process.siginfo_er.ExceptionInformation[i];
1439 }
1440 #endif
1441
1442 if (offset > bufsize)
1443 return -1;
1444
1445 if (offset + len > bufsize)
1446 len = bufsize - offset;
1447
1448 memcpy (readbuf, buf + offset, len);
1449
1450 return len;
1451 }
1452
1453 bool
1454 win32_process_target::supports_get_tib_address ()
1455 {
1456 return true;
1457 }
1458
1459 /* Write Windows OS Thread Information Block address. */
1460
1461 int
1462 win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
1463 {
1464 windows_thread_info *th;
1465 th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
1466 if (th == NULL)
1467 return 0;
1468 if (addr != NULL)
1469 *addr = th->thread_local_base;
1470 return 1;
1471 }
1472
1473 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */
1474
1475 const gdb_byte *
1476 win32_process_target::sw_breakpoint_from_kind (int kind, int *size)
1477 {
1478 *size = the_low_target.breakpoint_len;
1479 return the_low_target.breakpoint;
1480 }
1481
1482 bool
1483 win32_process_target::stopped_by_sw_breakpoint ()
1484 {
1485 windows_thread_info *th
1486 = windows_process.thread_rec (current_thread_ptid (),
1487 DONT_INVALIDATE_CONTEXT);
1488 return th == nullptr ? false : th->stopped_at_software_breakpoint;
1489 }
1490
1491 bool
1492 win32_process_target::supports_stopped_by_sw_breakpoint ()
1493 {
1494 return true;
1495 }
1496
1497 CORE_ADDR
1498 win32_process_target::read_pc (struct regcache *regcache)
1499 {
1500 return (*the_low_target.get_pc) (regcache);
1501 }
1502
1503 void
1504 win32_process_target::write_pc (struct regcache *regcache, CORE_ADDR pc)
1505 {
1506 return (*the_low_target.set_pc) (regcache, pc);
1507 }
1508
1509 const char *
1510 win32_process_target::thread_name (ptid_t thread)
1511 {
1512 windows_thread_info *th
1513 = windows_process.thread_rec (current_thread_ptid (),
1514 DONT_INVALIDATE_CONTEXT);
1515 return th->thread_name ();
1516 }
1517
1518 /* The win32 target ops object. */
1519
1520 static win32_process_target the_win32_target;
1521
1522 /* Initialize the Win32 backend. */
1523 void
1524 initialize_low (void)
1525 {
1526 set_target_ops (&the_win32_target);
1527 the_low_target.arch_setup ();
1528
1529 initialize_loadable ();
1530 }