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