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