gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdbserver / win32-low.cc
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 #ifndef _WIN32_WCE
1425 attaching = 0;
1426 #else
1427 if (attaching)
1428 {
1429 /* WinCE doesn't set an initial breakpoint automatically. To
1430 stop the inferior, we flush all currently pending debug
1431 events -- the thread list and the dll list are always
1432 reported immediatelly without delay, then, we suspend all
1433 threads and pretend we saw a trap at the current PC of the
1434 main thread.
1435
1436 Contrary to desktop Windows, Windows CE *does* report the dll
1437 names on LOAD_DLL_DEBUG_EVENTs resulting from a
1438 DebugActiveProcess call. This limits the way we can detect
1439 if all the dlls have already been reported. If we get a real
1440 debug event before leaving attaching, the worst that will
1441 happen is the user will see a spurious breakpoint. */
1442
1443 current_event.dwDebugEventCode = 0;
1444 if (!wait_for_debug_event (&current_event, 0))
1445 {
1446 OUTMSG2(("no attach events left\n"));
1447 fake_breakpoint_event ();
1448 attaching = 0;
1449 }
1450 else
1451 OUTMSG2(("got attach event\n"));
1452 }
1453 else
1454 #endif
1455 {
1456 gdb::optional<pending_stop> stop = fetch_pending_stop (debug_threads);
1457 if (stop.has_value ())
1458 {
1459 *ourstatus = stop->status;
1460 current_event = stop->event;
1461 ptid = debug_event_ptid (&current_event);
1462 current_thread = find_thread_ptid (ptid);
1463 return 1;
1464 }
1465
1466 /* Keep the wait time low enough for comfortable remote
1467 interruption, but high enough so gdbserver doesn't become a
1468 bottleneck. */
1469 if (!wait_for_debug_event (&current_event, 250))
1470 {
1471 DWORD e = GetLastError();
1472
1473 if (e == ERROR_PIPE_NOT_CONNECTED)
1474 {
1475 /* This will happen if the loader fails to succesfully
1476 load the application, e.g., if the main executable
1477 tries to pull in a non-existing export from a
1478 DLL. */
1479 ourstatus->kind = TARGET_WAITKIND_EXITED;
1480 ourstatus->value.integer = 1;
1481 return 1;
1482 }
1483
1484 return 0;
1485 }
1486 }
1487
1488 gotevent:
1489
1490 switch (current_event.dwDebugEventCode)
1491 {
1492 case CREATE_THREAD_DEBUG_EVENT:
1493 OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT "
1494 "for pid=%u tid=%x)\n",
1495 (unsigned) current_event.dwProcessId,
1496 (unsigned) current_event.dwThreadId));
1497
1498 /* Record the existence of this thread. */
1499 child_add_thread (current_event.dwProcessId,
1500 current_event.dwThreadId,
1501 current_event.u.CreateThread.hThread,
1502 current_event.u.CreateThread.lpThreadLocalBase);
1503 break;
1504
1505 case EXIT_THREAD_DEBUG_EVENT:
1506 OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT "
1507 "for pid=%u tid=%x\n",
1508 (unsigned) current_event.dwProcessId,
1509 (unsigned) current_event.dwThreadId));
1510 child_delete_thread (current_event.dwProcessId,
1511 current_event.dwThreadId);
1512
1513 current_thread = get_first_thread ();
1514 return 1;
1515
1516 case CREATE_PROCESS_DEBUG_EVENT:
1517 OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT "
1518 "for pid=%u tid=%x\n",
1519 (unsigned) current_event.dwProcessId,
1520 (unsigned) current_event.dwThreadId));
1521 CloseHandle (current_event.u.CreateProcessInfo.hFile);
1522
1523 if (open_process_used)
1524 {
1525 CloseHandle (current_process_handle);
1526 open_process_used = false;
1527 }
1528
1529 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1530 main_thread_id = current_event.dwThreadId;
1531
1532 /* Add the main thread. */
1533 child_add_thread (current_event.dwProcessId,
1534 main_thread_id,
1535 current_event.u.CreateProcessInfo.hThread,
1536 current_event.u.CreateProcessInfo.lpThreadLocalBase);
1537
1538 #ifdef _WIN32_WCE
1539 if (!attaching)
1540 {
1541 /* Windows CE doesn't set the initial breakpoint
1542 automatically like the desktop versions of Windows do.
1543 We add it explicitly here. It will be removed as soon as
1544 it is hit. */
1545 set_breakpoint_at ((CORE_ADDR) (long) current_event.u
1546 .CreateProcessInfo.lpStartAddress,
1547 auto_delete_breakpoint);
1548 }
1549 #endif
1550 break;
1551
1552 case EXIT_PROCESS_DEBUG_EVENT:
1553 OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT "
1554 "for pid=%u tid=%x\n",
1555 (unsigned) current_event.dwProcessId,
1556 (unsigned) current_event.dwThreadId));
1557 {
1558 DWORD exit_status = current_event.u.ExitProcess.dwExitCode;
1559 /* If the exit status looks like a fatal exception, but we
1560 don't recognize the exception's code, make the original
1561 exit status value available, to avoid losing information. */
1562 int exit_signal
1563 = WIFSIGNALED (exit_status) ? WTERMSIG (exit_status) : -1;
1564 if (exit_signal == -1)
1565 {
1566 ourstatus->kind = TARGET_WAITKIND_EXITED;
1567 ourstatus->value.integer = exit_status;
1568 }
1569 else
1570 {
1571 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1572 ourstatus->value.sig = gdb_signal_from_host (exit_signal);
1573 }
1574 }
1575 child_continue (DBG_CONTINUE, desired_stop_thread_id);
1576 break;
1577
1578 case LOAD_DLL_DEBUG_EVENT:
1579 OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT "
1580 "for pid=%u tid=%x\n",
1581 (unsigned) current_event.dwProcessId,
1582 (unsigned) current_event.dwThreadId));
1583 CloseHandle (current_event.u.LoadDll.hFile);
1584 if (! child_initialization_done)
1585 break;
1586 handle_load_dll ();
1587
1588 ourstatus->kind = TARGET_WAITKIND_LOADED;
1589 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1590 break;
1591
1592 case UNLOAD_DLL_DEBUG_EVENT:
1593 OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT "
1594 "for pid=%u tid=%x\n",
1595 (unsigned) current_event.dwProcessId,
1596 (unsigned) current_event.dwThreadId));
1597 if (! child_initialization_done)
1598 break;
1599 handle_unload_dll ();
1600 ourstatus->kind = TARGET_WAITKIND_LOADED;
1601 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1602 break;
1603
1604 case EXCEPTION_DEBUG_EVENT:
1605 OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT "
1606 "for pid=%u tid=%x\n",
1607 (unsigned) current_event.dwProcessId,
1608 (unsigned) current_event.dwThreadId));
1609 if (handle_exception (ourstatus, debug_threads)
1610 == HANDLE_EXCEPTION_UNHANDLED)
1611 *continue_status = DBG_EXCEPTION_NOT_HANDLED;
1612 break;
1613
1614 case OUTPUT_DEBUG_STRING_EVENT:
1615 /* A message from the kernel (or Cygwin). */
1616 OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT "
1617 "for pid=%u tid=%x\n",
1618 (unsigned) current_event.dwProcessId,
1619 (unsigned) current_event.dwThreadId));
1620 handle_output_debug_string (nullptr);
1621 break;
1622
1623 default:
1624 OUTMSG2 (("gdbserver: kernel event unknown "
1625 "for pid=%u tid=%x code=%x\n",
1626 (unsigned) current_event.dwProcessId,
1627 (unsigned) current_event.dwThreadId,
1628 (unsigned) current_event.dwDebugEventCode));
1629 break;
1630 }
1631
1632 ptid = debug_event_ptid (&current_event);
1633
1634 if (desired_stop_thread_id != -1 && desired_stop_thread_id != ptid.lwp ())
1635 {
1636 /* Pending stop. See the comment by the definition of
1637 "pending_stops" for details on why this is needed. */
1638 OUTMSG2 (("get_windows_debug_event - "
1639 "unexpected stop in 0x%lx (expecting 0x%x)\n",
1640 ptid.lwp (), desired_stop_thread_id));
1641 maybe_adjust_pc ();
1642 pending_stops.push_back ({(DWORD) ptid.lwp (), *ourstatus, current_event});
1643 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1644 }
1645 else
1646 current_thread = find_thread_ptid (ptid);
1647
1648 return 1;
1649 }
1650
1651 /* Wait for the inferior process to change state.
1652 STATUS will be filled in with a response code to send to GDB.
1653 Returns the signal which caused the process to stop. */
1654 ptid_t
1655 win32_process_target::wait (ptid_t ptid, target_waitstatus *ourstatus,
1656 int options)
1657 {
1658 if (cached_status.kind != TARGET_WAITKIND_IGNORE)
1659 {
1660 /* The core always does a wait after creating the inferior, and
1661 do_initial_child_stuff already ran the inferior to the
1662 initial breakpoint (or an exit, if creating the process
1663 fails). Report it now. */
1664 *ourstatus = cached_status;
1665 cached_status.kind = TARGET_WAITKIND_IGNORE;
1666 return debug_event_ptid (&current_event);
1667 }
1668
1669 while (1)
1670 {
1671 DWORD continue_status;
1672 if (!get_child_debug_event (&continue_status, ourstatus))
1673 continue;
1674
1675 switch (ourstatus->kind)
1676 {
1677 case TARGET_WAITKIND_EXITED:
1678 OUTMSG2 (("Child exited with retcode = %x\n",
1679 ourstatus->value.integer));
1680 win32_clear_inferiors ();
1681 return ptid_t (current_event.dwProcessId);
1682 case TARGET_WAITKIND_STOPPED:
1683 case TARGET_WAITKIND_SIGNALLED:
1684 case TARGET_WAITKIND_LOADED:
1685 {
1686 OUTMSG2 (("Child Stopped with signal = %d \n",
1687 ourstatus->value.sig));
1688 maybe_adjust_pc ();
1689 return debug_event_ptid (&current_event);
1690 }
1691 default:
1692 OUTMSG (("Ignoring unknown internal event, %d\n", ourstatus->kind));
1693 /* fall-through */
1694 case TARGET_WAITKIND_SPURIOUS:
1695 /* do nothing, just continue */
1696 child_continue (continue_status, desired_stop_thread_id);
1697 break;
1698 }
1699 }
1700 }
1701
1702 /* Fetch registers from the inferior process.
1703 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */
1704 void
1705 win32_process_target::fetch_registers (regcache *regcache, int regno)
1706 {
1707 child_fetch_inferior_registers (regcache, regno);
1708 }
1709
1710 /* Store registers to the inferior process.
1711 If REGNO is -1, store all registers; otherwise, store at least REGNO. */
1712 void
1713 win32_process_target::store_registers (regcache *regcache, int regno)
1714 {
1715 child_store_inferior_registers (regcache, regno);
1716 }
1717
1718 /* Read memory from the inferior process. This should generally be
1719 called through read_inferior_memory, which handles breakpoint shadowing.
1720 Read LEN bytes at MEMADDR into a buffer at MYADDR. */
1721 int
1722 win32_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
1723 int len)
1724 {
1725 return child_xfer_memory (memaddr, (char *) myaddr, len, 0, 0) != len;
1726 }
1727
1728 /* Write memory to the inferior process. This should generally be
1729 called through write_inferior_memory, which handles breakpoint shadowing.
1730 Write LEN bytes from the buffer at MYADDR to MEMADDR.
1731 Returns 0 on success and errno on failure. */
1732 int
1733 win32_process_target::write_memory (CORE_ADDR memaddr,
1734 const unsigned char *myaddr, int len)
1735 {
1736 return child_xfer_memory (memaddr, (char *) myaddr, len, 1, 0) != len;
1737 }
1738
1739 /* Send an interrupt request to the inferior process. */
1740 void
1741 win32_process_target::request_interrupt ()
1742 {
1743 winapi_DebugBreakProcess DebugBreakProcess;
1744 winapi_GenerateConsoleCtrlEvent GenerateConsoleCtrlEvent;
1745
1746 #ifdef _WIN32_WCE
1747 HMODULE dll = GetModuleHandle (_T("COREDLL.DLL"));
1748 #else
1749 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
1750 #endif
1751
1752 GenerateConsoleCtrlEvent = GETPROCADDRESS (dll, GenerateConsoleCtrlEvent);
1753
1754 if (GenerateConsoleCtrlEvent != NULL
1755 && GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, current_process_id))
1756 return;
1757
1758 /* GenerateConsoleCtrlEvent can fail if process id being debugged is
1759 not a process group id.
1760 Fallback to XP/Vista 'DebugBreakProcess', which generates a
1761 breakpoint exception in the interior process. */
1762
1763 DebugBreakProcess = GETPROCADDRESS (dll, DebugBreakProcess);
1764
1765 if (DebugBreakProcess != NULL
1766 && DebugBreakProcess (current_process_handle))
1767 return;
1768
1769 /* Last resort, suspend all threads manually. */
1770 soft_interrupt_requested = 1;
1771 }
1772
1773 bool
1774 win32_process_target::supports_hardware_single_step ()
1775 {
1776 return true;
1777 }
1778
1779 #ifdef _WIN32_WCE
1780 int
1781 win32_error_to_fileio_error (DWORD err)
1782 {
1783 switch (err)
1784 {
1785 case ERROR_BAD_PATHNAME:
1786 case ERROR_FILE_NOT_FOUND:
1787 case ERROR_INVALID_NAME:
1788 case ERROR_PATH_NOT_FOUND:
1789 return FILEIO_ENOENT;
1790 case ERROR_CRC:
1791 case ERROR_IO_DEVICE:
1792 case ERROR_OPEN_FAILED:
1793 return FILEIO_EIO;
1794 case ERROR_INVALID_HANDLE:
1795 return FILEIO_EBADF;
1796 case ERROR_ACCESS_DENIED:
1797 case ERROR_SHARING_VIOLATION:
1798 return FILEIO_EACCES;
1799 case ERROR_NOACCESS:
1800 return FILEIO_EFAULT;
1801 case ERROR_BUSY:
1802 return FILEIO_EBUSY;
1803 case ERROR_ALREADY_EXISTS:
1804 case ERROR_FILE_EXISTS:
1805 return FILEIO_EEXIST;
1806 case ERROR_BAD_DEVICE:
1807 return FILEIO_ENODEV;
1808 case ERROR_DIRECTORY:
1809 return FILEIO_ENOTDIR;
1810 case ERROR_FILENAME_EXCED_RANGE:
1811 case ERROR_INVALID_DATA:
1812 case ERROR_INVALID_PARAMETER:
1813 case ERROR_NEGATIVE_SEEK:
1814 return FILEIO_EINVAL;
1815 case ERROR_TOO_MANY_OPEN_FILES:
1816 return FILEIO_EMFILE;
1817 case ERROR_HANDLE_DISK_FULL:
1818 case ERROR_DISK_FULL:
1819 return FILEIO_ENOSPC;
1820 case ERROR_WRITE_PROTECT:
1821 return FILEIO_EROFS;
1822 case ERROR_NOT_SUPPORTED:
1823 return FILEIO_ENOSYS;
1824 }
1825
1826 return FILEIO_EUNKNOWN;
1827 }
1828
1829 void
1830 win32_process_target::hostio_last_error (char *buf)
1831 {
1832 DWORD winerr = GetLastError ();
1833 int fileio_err = win32_error_to_fileio_error (winerr);
1834 sprintf (buf, "F-1,%x", fileio_err);
1835 }
1836 #endif
1837
1838 bool
1839 win32_process_target::supports_qxfer_siginfo ()
1840 {
1841 return true;
1842 }
1843
1844 /* Write Windows signal info. */
1845
1846 int
1847 win32_process_target::qxfer_siginfo (const char *annex,
1848 unsigned char *readbuf,
1849 unsigned const char *writebuf,
1850 CORE_ADDR offset, int len)
1851 {
1852 if (siginfo_er.ExceptionCode == 0)
1853 return -1;
1854
1855 if (readbuf == nullptr)
1856 return -1;
1857
1858 char *buf = (char *) &siginfo_er;
1859 size_t bufsize = sizeof (siginfo_er);
1860
1861 #ifdef __x86_64__
1862 EXCEPTION_RECORD32 er32;
1863 if (wow64_process)
1864 {
1865 buf = (char *) &er32;
1866 bufsize = sizeof (er32);
1867
1868 er32.ExceptionCode = siginfo_er.ExceptionCode;
1869 er32.ExceptionFlags = siginfo_er.ExceptionFlags;
1870 er32.ExceptionRecord = (uintptr_t) siginfo_er.ExceptionRecord;
1871 er32.ExceptionAddress = (uintptr_t) siginfo_er.ExceptionAddress;
1872 er32.NumberParameters = siginfo_er.NumberParameters;
1873 int i;
1874 for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++)
1875 er32.ExceptionInformation[i] = siginfo_er.ExceptionInformation[i];
1876 }
1877 #endif
1878
1879 if (offset > bufsize)
1880 return -1;
1881
1882 if (offset + len > bufsize)
1883 len = bufsize - offset;
1884
1885 memcpy (readbuf, buf + offset, len);
1886
1887 return len;
1888 }
1889
1890 bool
1891 win32_process_target::supports_get_tib_address ()
1892 {
1893 return true;
1894 }
1895
1896 /* Write Windows OS Thread Information Block address. */
1897
1898 int
1899 win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
1900 {
1901 windows_thread_info *th;
1902 th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
1903 if (th == NULL)
1904 return 0;
1905 if (addr != NULL)
1906 *addr = th->thread_local_base;
1907 return 1;
1908 }
1909
1910 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */
1911
1912 const gdb_byte *
1913 win32_process_target::sw_breakpoint_from_kind (int kind, int *size)
1914 {
1915 *size = the_low_target.breakpoint_len;
1916 return the_low_target.breakpoint;
1917 }
1918
1919 bool
1920 win32_process_target::stopped_by_sw_breakpoint ()
1921 {
1922 windows_thread_info *th = thread_rec (current_thread_ptid (),
1923 DONT_INVALIDATE_CONTEXT);
1924 return th == nullptr ? false : th->stopped_at_software_breakpoint;
1925 }
1926
1927 bool
1928 win32_process_target::supports_stopped_by_sw_breakpoint ()
1929 {
1930 return true;
1931 }
1932
1933 CORE_ADDR
1934 win32_process_target::read_pc (struct regcache *regcache)
1935 {
1936 return (*the_low_target.get_pc) (regcache);
1937 }
1938
1939 void
1940 win32_process_target::write_pc (struct regcache *regcache, CORE_ADDR pc)
1941 {
1942 return (*the_low_target.set_pc) (regcache, pc);
1943 }
1944
1945 /* The win32 target ops object. */
1946
1947 static win32_process_target the_win32_target;
1948
1949 /* Initialize the Win32 backend. */
1950 void
1951 initialize_low (void)
1952 {
1953 set_target_ops (&the_win32_target);
1954 the_low_target.arch_setup ();
1955
1956 #ifdef __x86_64__
1957 /* These functions are loaded dynamically, because they are not available
1958 on Windows XP. */
1959 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL"));
1960 win32_Wow64GetThreadContext = GETPROCADDRESS (dll, Wow64GetThreadContext);
1961 win32_Wow64SetThreadContext = GETPROCADDRESS (dll, Wow64SetThreadContext);
1962 #endif
1963 }
This page took 0.070829 seconds and 4 git commands to generate.