Share get_image_name between gdb and gdbserver
[deliverable/binutils-gdb.git] / gdb / windows-nat.c
CommitLineData
dc05df57 1/* Target-vector operations for controlling windows child processes, for GDB.
0a65a603 2
b811d2c2 3 Copyright (C) 1995-2020 Free Software Foundation, Inc.
0a65a603 4
e6433c28 5 Contributed by Cygnus Solutions, A Red Hat Company.
e88c49c3 6
24e60978
SC
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
24e60978
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
a9762ec7 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
24e60978
SC
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24e60978 21
dfe7f3ac 22/* Originally by Steve Chamberlain, sac@cygnus.com */
24e60978
SC
23
24#include "defs.h"
25#include "frame.h" /* required by inferior.h */
26#include "inferior.h"
45741a9c 27#include "infrun.h"
24e60978 28#include "target.h"
24e60978
SC
29#include "gdbcore.h"
30#include "command.h"
fa58ee11 31#include "completer.h"
4e052eda 32#include "regcache.h"
2a3d5645 33#include "top.h"
403d9909
CF
34#include <signal.h>
35#include <sys/types.h>
36#include <fcntl.h>
403d9909
CF
37#include <windows.h>
38#include <imagehlp.h>
2b008701 39#include <psapi.h>
10325bc5 40#ifdef __CYGWIN__
b7ff339d 41#include <wchar.h>
403d9909 42#include <sys/cygwin.h>
b7ff339d 43#include <cygwin/version.h>
10325bc5 44#endif
a1b85d28 45#include <algorithm>
93366324 46#include <vector>
cad9cd60 47
0ba1096a 48#include "filenames.h"
1ef980b9
SC
49#include "symfile.h"
50#include "objfiles.h"
92107356 51#include "gdb_bfd.h"
de1b3c3d 52#include "gdb_obstack.h"
fdfa3315 53#include "gdbthread.h"
24e60978 54#include "gdbcmd.h"
1e37c281 55#include <unistd.h>
4646aa9d 56#include "exec.h"
3ee6f623 57#include "solist.h"
3cb8e7f6 58#include "solib.h"
de1b3c3d 59#include "xml-support.h"
463888ab 60#include "inttypes.h"
24e60978 61
6c7de422
MK
62#include "i386-tdep.h"
63#include "i387-tdep.h"
64
31b060a2
CF
65#include "windows-tdep.h"
66#include "windows-nat.h"
df7e5265 67#include "x86-nat.h"
ecc13e53 68#include "complaints.h"
51a9c8c5 69#include "inf-child.h"
268a13a5
TT
70#include "gdbsupport/gdb_tilde_expand.h"
71#include "gdbsupport/pathstuff.h"
559e7e50 72#include "gdbsupport/gdb_wait.h"
ae1f8880 73#include "nat/windows-nat.h"
de1b3c3d 74
46f9f931
HD
75#define STATUS_WX86_BREAKPOINT 0x4000001F
76#define STATUS_WX86_SINGLE_STEP 0x4000001E
77
4834dad0
TT
78using namespace windows_nat;
79
418c6cb3 80#define AdjustTokenPrivileges dyn_AdjustTokenPrivileges
2b008701
CF
81#define DebugActiveProcessStop dyn_DebugActiveProcessStop
82#define DebugBreakProcess dyn_DebugBreakProcess
83#define DebugSetProcessKillOnExit dyn_DebugSetProcessKillOnExit
84#define EnumProcessModules dyn_EnumProcessModules
46f9f931 85#define EnumProcessModulesEx dyn_EnumProcessModulesEx
2b008701 86#define GetModuleInformation dyn_GetModuleInformation
418c6cb3
CF
87#define LookupPrivilegeValueA dyn_LookupPrivilegeValueA
88#define OpenProcessToken dyn_OpenProcessToken
cd44747c
PM
89#define GetConsoleFontSize dyn_GetConsoleFontSize
90#define GetCurrentConsoleFont dyn_GetCurrentConsoleFont
46f9f931
HD
91#define Wow64SuspendThread dyn_Wow64SuspendThread
92#define Wow64GetThreadContext dyn_Wow64GetThreadContext
93#define Wow64SetThreadContext dyn_Wow64SetThreadContext
94#define Wow64GetThreadSelectorEntry dyn_Wow64GetThreadSelectorEntry
2b008701 95
43499ea3
PA
96typedef BOOL WINAPI (AdjustTokenPrivileges_ftype) (HANDLE, BOOL,
97 PTOKEN_PRIVILEGES,
98 DWORD, PTOKEN_PRIVILEGES,
99 PDWORD);
100static AdjustTokenPrivileges_ftype *AdjustTokenPrivileges;
101
102typedef BOOL WINAPI (DebugActiveProcessStop_ftype) (DWORD);
103static DebugActiveProcessStop_ftype *DebugActiveProcessStop;
104
105typedef BOOL WINAPI (DebugBreakProcess_ftype) (HANDLE);
106static DebugBreakProcess_ftype *DebugBreakProcess;
107
108typedef BOOL WINAPI (DebugSetProcessKillOnExit_ftype) (BOOL);
109static DebugSetProcessKillOnExit_ftype *DebugSetProcessKillOnExit;
110
111typedef BOOL WINAPI (EnumProcessModules_ftype) (HANDLE, HMODULE *, DWORD,
112 LPDWORD);
113static EnumProcessModules_ftype *EnumProcessModules;
114
46f9f931
HD
115#ifdef __x86_64__
116typedef BOOL WINAPI (EnumProcessModulesEx_ftype) (HANDLE, HMODULE *, DWORD,
117 LPDWORD, DWORD);
118static EnumProcessModulesEx_ftype *EnumProcessModulesEx;
119#endif
120
43499ea3
PA
121typedef BOOL WINAPI (GetModuleInformation_ftype) (HANDLE, HMODULE,
122 LPMODULEINFO, DWORD);
123static GetModuleInformation_ftype *GetModuleInformation;
124
125typedef BOOL WINAPI (LookupPrivilegeValueA_ftype) (LPCSTR, LPCSTR, PLUID);
126static LookupPrivilegeValueA_ftype *LookupPrivilegeValueA;
127
128typedef BOOL WINAPI (OpenProcessToken_ftype) (HANDLE, DWORD, PHANDLE);
129static OpenProcessToken_ftype *OpenProcessToken;
130
131typedef BOOL WINAPI (GetCurrentConsoleFont_ftype) (HANDLE, BOOL,
132 CONSOLE_FONT_INFO *);
133static GetCurrentConsoleFont_ftype *GetCurrentConsoleFont;
134
135typedef COORD WINAPI (GetConsoleFontSize_ftype) (HANDLE, DWORD);
136static GetConsoleFontSize_ftype *GetConsoleFontSize;
2b008701 137
46f9f931
HD
138#ifdef __x86_64__
139typedef DWORD WINAPI (Wow64SuspendThread_ftype) (HANDLE);
140static Wow64SuspendThread_ftype *Wow64SuspendThread;
141
142typedef BOOL WINAPI (Wow64GetThreadContext_ftype) (HANDLE, PWOW64_CONTEXT);
143static Wow64GetThreadContext_ftype *Wow64GetThreadContext;
144
145typedef BOOL WINAPI (Wow64SetThreadContext_ftype) (HANDLE,
146 const WOW64_CONTEXT *);
147static Wow64SetThreadContext_ftype *Wow64SetThreadContext;
148
149typedef BOOL WINAPI (Wow64GetThreadSelectorEntry_ftype) (HANDLE, DWORD,
150 PLDT_ENTRY);
151static Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry;
152#endif
153
b3c613f2
CF
154#undef STARTUPINFO
155#undef CreateProcess
156#undef GetModuleFileNameEx
157
158#ifndef __CYGWIN__
159# define __PMAX (MAX_PATH + 1)
43499ea3
PA
160 typedef DWORD WINAPI (GetModuleFileNameEx_ftype) (HANDLE, HMODULE, LPSTR, DWORD);
161 static GetModuleFileNameEx_ftype *GetModuleFileNameEx;
b3c613f2
CF
162# define STARTUPINFO STARTUPINFOA
163# define CreateProcess CreateProcessA
164# define GetModuleFileNameEx_name "GetModuleFileNameExA"
165# define bad_GetModuleFileNameEx bad_GetModuleFileNameExA
166#else
167# define __PMAX PATH_MAX
581e13c1 168/* The starting and ending address of the cygwin1.dll text segment. */
b3c613f2
CF
169 static CORE_ADDR cygwin_load_start;
170 static CORE_ADDR cygwin_load_end;
b3c613f2
CF
171# define __USEWIDE
172 typedef wchar_t cygwin_buf_t;
43499ea3
PA
173 typedef DWORD WINAPI (GetModuleFileNameEx_ftype) (HANDLE, HMODULE,
174 LPWSTR, DWORD);
175 static GetModuleFileNameEx_ftype *GetModuleFileNameEx;
b3c613f2
CF
176# define STARTUPINFO STARTUPINFOW
177# define CreateProcess CreateProcessW
178# define GetModuleFileNameEx_name "GetModuleFileNameExW"
179# define bad_GetModuleFileNameEx bad_GetModuleFileNameExW
10325bc5 180#endif
a244bdca 181
581e13c1
MS
182static int have_saved_context; /* True if we've saved context from a
183 cygwin signal. */
15766370 184#ifdef __CYGWIN__
85102364 185static CONTEXT saved_context; /* Contains the saved context from a
581e13c1 186 cygwin signal. */
15766370 187#endif
a244bdca 188
0714f9bf
SS
189/* If we're not using the old Cygwin header file set, define the
190 following which never should have been in the generic Win32 API
581e13c1 191 headers in the first place since they were our own invention... */
0714f9bf 192#ifndef _GNU_H_WINDOWS_H
9d3789f7 193enum
8e860359
CF
194 {
195 FLAG_TRACE_BIT = 0x100,
8e860359 196 };
0714f9bf
SS
197#endif
198
5851ab76
JB
199#ifndef CONTEXT_EXTENDED_REGISTERS
200/* This macro is only defined on ia32. It only makes sense on this target,
201 so define it as zero if not already defined. */
202#define CONTEXT_EXTENDED_REGISTERS 0
203#endif
204
f0666312
JT
205#define CONTEXT_DEBUGGER_DR CONTEXT_FULL | CONTEXT_FLOATING_POINT \
206 | CONTEXT_SEGMENTS | CONTEXT_DEBUG_REGISTERS \
207 | CONTEXT_EXTENDED_REGISTERS
97da3b20 208
41b4aadc 209static uintptr_t dr[8];
87a45c96
CF
210static int debug_registers_changed;
211static int debug_registers_used;
16d905e2
CF
212
213static int windows_initialization_done;
6537bb24 214#define DR6_CLEAR_VALUE 0xffff0ff0
97da3b20 215
24cdb46e
РИ
216/* The exception thrown by a program to tell the debugger the name of
217 a thread. The exception record contains an ID of a thread and a
218 name to give it. This exception has no documented name, but MSDN
219 dubs it "MS_VC_EXCEPTION" in one code example. */
220#define MS_VC_EXCEPTION 0x406d1388
221
222typedef enum
223{
224 HANDLE_EXCEPTION_UNHANDLED = 0,
225 HANDLE_EXCEPTION_HANDLED,
226 HANDLE_EXCEPTION_IGNORED
227} handle_exception_result;
228
3cee93ac 229/* The string sent by cygwin when it processes a signal.
581e13c1 230 FIXME: This should be in a cygwin include file. */
3929abe9
CF
231#ifndef _CYGWIN_SIGNAL_STRING
232#define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
233#endif
3cee93ac 234
29fe111d 235#define CHECK(x) check (x, __FILE__,__LINE__)
dfe7f3ac 236#define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
4e52d31c
PM
237#define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
238#define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
239#define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
24e60978 240
9bb9e8ad
PM
241static void cygwin_set_dr (int i, CORE_ADDR addr);
242static void cygwin_set_dr7 (unsigned long val);
a961bc18 243static CORE_ADDR cygwin_get_dr (int i);
9bb9e8ad 244static unsigned long cygwin_get_dr6 (void);
a961bc18 245static unsigned long cygwin_get_dr7 (void);
9bb9e8ad 246
a493e3e2 247static enum gdb_signal last_sig = GDB_SIGNAL_0;
581e13c1 248/* Set if a signal was received from the debugged process. */
7393af7c 249
93366324 250static std::vector<windows_thread_info *> thread_list;
24e60978 251
581e13c1 252/* The process and thread handles for the above context. */
24e60978 253
0a4afda3
TT
254/* The current debug event from WaitForDebugEvent or from a pending
255 stop. */
256static DEBUG_EVENT current_event;
257
258/* The most recent event from WaitForDebugEvent. Unlike
259 current_event, this is guaranteed never to come from a pending
260 stop. This is important because only data from the most recent
261 event from WaitForDebugEvent can be used when calling
262 ContinueDebugEvent. */
263static DEBUG_EVENT last_wait_event;
264
3cee93ac 265static HANDLE current_process_handle; /* Currently executing process */
876d1cd7 266static windows_thread_info *current_thread; /* Info on currently selected thread */
7928d571 267static EXCEPTION_RECORD siginfo_er; /* Contents of $_siginfo */
24e60978 268
581e13c1 269/* Counts of things. */
24e60978
SC
270static int exception_count = 0;
271static int event_count = 0;
dfe7f3ac 272static int saw_create;
bf25528d 273static int open_process_used = 0;
46f9f931
HD
274#ifdef __x86_64__
275static bool wow64_process = false;
276static bool ignore_first_breakpoint = false;
277#endif
24e60978 278
581e13c1 279/* User options. */
491144b5 280static bool new_console = false;
10325bc5 281#ifdef __CYGWIN__
491144b5 282static bool cygwin_exceptions = false;
10325bc5 283#endif
491144b5
CB
284static bool new_group = true;
285static bool debug_exec = false; /* show execution */
286static bool debug_events = false; /* show events from kernel */
287static bool debug_memory = false; /* show target memory accesses */
288static bool debug_exceptions = false; /* show target exceptions */
289static bool useshell = false; /* use shell for subprocesses */
dfe7f3ac 290
7e63b4e4 291/* This vector maps GDB's idea of a register's number into an offset
dc05df57 292 in the windows exception context vector.
24e60978 293
3cee93ac 294 It also contains the bit mask needed to load the register in question.
24e60978 295
7e63b4e4
JB
296 The contents of this table can only be computed by the units
297 that provide CPU-specific support for Windows native debugging.
298 These units should set the table by calling
dc05df57 299 windows_set_context_register_offsets.
7e63b4e4 300
24e60978
SC
301 One day we could read a reg, we could inspect the context we
302 already have loaded, if it doesn't have the bit set that we need,
303 we read that set of registers in using GetThreadContext. If the
581e13c1 304 context already contains what we need, we just unpack it. Then to
24e60978
SC
305 write a register, first we have to ensure that the context contains
306 the other regs of the group, and then we copy the info in and set
581e13c1 307 out bit. */
24e60978 308
7e63b4e4 309static const int *mappings;
d3a09475 310
d40dc7a8
JB
311/* The function to use in order to determine whether a register is
312 a segment register or not. */
313static segment_register_p_ftype *segment_register_p;
314
73c13fe6
TT
315/* See windows_nat_target::resume to understand why this is commented
316 out. */
317#if 0
24e60978 318/* This vector maps the target's idea of an exception (extracted
581e13c1 319 from the DEBUG_EVENT structure) to GDB's idea. */
24e60978
SC
320
321struct xlate_exception
322 {
73c13fe6 323 DWORD them;
2ea28649 324 enum gdb_signal us;
24e60978
SC
325 };
326
73c13fe6 327static const struct xlate_exception xlate[] =
24e60978 328{
a493e3e2
PA
329 {EXCEPTION_ACCESS_VIOLATION, GDB_SIGNAL_SEGV},
330 {STATUS_STACK_OVERFLOW, GDB_SIGNAL_SEGV},
331 {EXCEPTION_BREAKPOINT, GDB_SIGNAL_TRAP},
332 {DBG_CONTROL_C, GDB_SIGNAL_INT},
333 {EXCEPTION_SINGLE_STEP, GDB_SIGNAL_TRAP},
73c13fe6
TT
334 {STATUS_FLOAT_DIVIDE_BY_ZERO, GDB_SIGNAL_FPE}
335};
24e60978 336
73c13fe6 337#endif /* 0 */
f6ac5f3d 338
0a4afda3
TT
339/* The ID of the thread for which we anticipate a stop event.
340 Normally this is -1, meaning we'll accept an event in any
341 thread. */
342static DWORD desired_stop_thread_id = -1;
343
344/* A single pending stop. See "pending_stops" for more
345 information. */
346struct pending_stop
347{
348 /* The thread id. */
349 DWORD thread_id;
350
351 /* The target waitstatus we computed. */
352 target_waitstatus status;
353
354 /* The event. A few fields of this can be referenced after a stop,
355 and it seemed simplest to store the entire event. */
356 DEBUG_EVENT event;
357};
358
359/* A vector of pending stops. Sometimes, Windows will report a stop
360 on a thread that has been ostensibly suspended. We believe what
361 happens here is that two threads hit a breakpoint simultaneously,
362 and the Windows kernel queues the stop events. However, this can
363 result in the strange effect of trying to single step thread A --
364 leaving all other threads suspended -- and then seeing a stop in
365 thread B. To handle this scenario, we queue all such "pending"
366 stops here, and then process them once the step has completed. See
367 PR gdb/22992. */
368static std::vector<pending_stop> pending_stops;
369
f6ac5f3d
PA
370struct windows_nat_target final : public x86_nat_target<inf_child_target>
371{
372 void close () override;
373
374 void attach (const char *, int) override;
375
376 bool attach_no_wait () override
377 { return true; }
378
379 void detach (inferior *, int) override;
380
381 void resume (ptid_t, int , enum gdb_signal) override;
382
383 ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
384
385 void fetch_registers (struct regcache *, int) override;
386 void store_registers (struct regcache *, int) override;
387
0a4afda3
TT
388 bool stopped_by_sw_breakpoint () override
389 {
390 return current_thread->stopped_at_software_breakpoint;
391 }
392
393 bool supports_stopped_by_sw_breakpoint () override
394 {
395 return true;
396 }
397
f6ac5f3d
PA
398 enum target_xfer_status xfer_partial (enum target_object object,
399 const char *annex,
400 gdb_byte *readbuf,
401 const gdb_byte *writebuf,
402 ULONGEST offset, ULONGEST len,
403 ULONGEST *xfered_len) override;
404
405 void files_info () override;
406
407 void kill () override;
408
409 void create_inferior (const char *, const std::string &,
410 char **, int) override;
411
412 void mourn_inferior () override;
413
57810aa7 414 bool thread_alive (ptid_t ptid) override;
f6ac5f3d 415
a068643d 416 std::string pid_to_str (ptid_t) override;
f6ac5f3d
PA
417
418 void interrupt () override;
419
420 char *pid_to_exec_file (int pid) override;
421
422 ptid_t get_ada_task_ptid (long lwp, long thread) override;
423
57810aa7 424 bool get_tib_address (ptid_t ptid, CORE_ADDR *addr) override;
f6ac5f3d
PA
425
426 const char *thread_name (struct thread_info *) override;
5b6d1e4f
PA
427
428 int get_windows_debug_event (int pid, struct target_waitstatus *ourstatus);
f6ac5f3d
PA
429};
430
431static windows_nat_target the_windows_nat_target;
432
7e63b4e4
JB
433/* Set the MAPPINGS static global to OFFSETS.
434 See the description of MAPPINGS for more details. */
435
46f9f931 436static void
dc05df57 437windows_set_context_register_offsets (const int *offsets)
7e63b4e4
JB
438{
439 mappings = offsets;
440}
441
46f9f931
HD
442/* Set the function that should be used by this module to determine
443 whether a given register is a segment register or not. */
d40dc7a8 444
46f9f931 445static void
d40dc7a8
JB
446windows_set_segment_register_p (segment_register_p_ftype *fun)
447{
448 segment_register_p = fun;
449}
450
fa4ba8da
PM
451static void
452check (BOOL ok, const char *file, int line)
453{
454 if (!ok)
d50a0ce2
CV
455 printf_filtered ("error return %s:%d was %u\n", file, line,
456 (unsigned) GetLastError ());
fa4ba8da
PM
457}
458
28688adf 459/* See nat/windows-nat.h. */
8e61ebec 460
28688adf
TT
461windows_thread_info *
462windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition)
24e60978 463{
93366324 464 for (windows_thread_info *th : thread_list)
28688adf 465 if (th->tid == ptid.lwp ())
3cee93ac 466 {
8e61ebec 467 if (!th->suspended)
3cee93ac 468 {
8e61ebec
TT
469 switch (disposition)
470 {
471 case DONT_INVALIDATE_CONTEXT:
472 /* Nothing. */
473 break;
474 case INVALIDATE_CONTEXT:
28688adf 475 if (ptid.lwp () != current_event.dwThreadId)
8e61ebec
TT
476 th->suspend ();
477 th->reload_context = true;
478 break;
479 case DONT_SUSPEND:
480 th->reload_context = true;
481 th->suspended = -1;
482 break;
483 }
3cee93ac
CF
484 }
485 return th;
486 }
487
488 return NULL;
489}
490
c559d709
JB
491/* Add a thread to the thread list.
492
493 PTID is the ptid of the thread to be added.
494 H is its Windows handle.
495 TLB is its thread local base.
496 MAIN_THREAD_P should be true if the thread to be added is
497 the main thread, false otherwise. */
498
876d1cd7 499static windows_thread_info *
c559d709 500windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
3cee93ac 501{
876d1cd7 502 windows_thread_info *th;
2dc38344 503
7c7411bc 504 gdb_assert (ptid.lwp () != 0);
2dc38344 505
28688adf 506 if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT)))
3cee93ac
CF
507 return th;
508
e9534bd2 509 CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb;
46f9f931
HD
510#ifdef __x86_64__
511 /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
512 and the 32bit TIB is exactly 2 pages after it. */
513 if (wow64_process)
e9534bd2 514 base += 0x2000;
46f9f931 515#endif
28688adf 516 th = new windows_thread_info (ptid.lwp (), h, base);
93366324 517 thread_list.push_back (th);
c559d709
JB
518
519 /* Add this new thread to the list of threads.
520
521 To be consistent with what's done on other platforms, we add
522 the main thread silently (in reality, this thread is really
523 more of a process to the user than a thread). */
524 if (main_thread_p)
5b6d1e4f 525 add_thread_silent (&the_windows_nat_target, ptid);
c559d709 526 else
5b6d1e4f 527 add_thread (&the_windows_nat_target, ptid);
c559d709 528
2dc38344 529 /* Set the debug registers for the new thread if they are used. */
fa4ba8da
PM
530 if (debug_registers_used)
531 {
46f9f931
HD
532#ifdef __x86_64__
533 if (wow64_process)
534 {
535 /* Only change the value of the debug registers. */
536 th->wow64_context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
537 CHECK (Wow64GetThreadContext (th->h, &th->wow64_context));
538 th->wow64_context.Dr0 = dr[0];
539 th->wow64_context.Dr1 = dr[1];
540 th->wow64_context.Dr2 = dr[2];
541 th->wow64_context.Dr3 = dr[3];
542 th->wow64_context.Dr6 = DR6_CLEAR_VALUE;
543 th->wow64_context.Dr7 = dr[7];
544 CHECK (Wow64SetThreadContext (th->h, &th->wow64_context));
545 th->wow64_context.ContextFlags = 0;
546 }
547 else
548#endif
549 {
550 /* Only change the value of the debug registers. */
551 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
552 CHECK (GetThreadContext (th->h, &th->context));
553 th->context.Dr0 = dr[0];
554 th->context.Dr1 = dr[1];
555 th->context.Dr2 = dr[2];
556 th->context.Dr3 = dr[3];
557 th->context.Dr6 = DR6_CLEAR_VALUE;
558 th->context.Dr7 = dr[7];
559 CHECK (SetThreadContext (th->h, &th->context));
560 th->context.ContextFlags = 0;
561 }
fa4ba8da 562 }
3cee93ac 563 return th;
24e60978
SC
564}
565
26c4b26f 566/* Clear out any old thread list and reinitialize it to a
581e13c1 567 pristine state. */
24e60978 568static void
dc05df57 569windows_init_thread_list (void)
24e60978 570{
dc05df57 571 DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
3cee93ac 572 init_thread_list ();
93366324
TT
573
574 for (windows_thread_info *here : thread_list)
e9534bd2 575 delete here;
93366324
TT
576
577 thread_list.clear ();
3cee93ac
CF
578}
579
c559d709
JB
580/* Delete a thread from the list of threads.
581
582 PTID is the ptid of the thread to be deleted.
583 EXIT_CODE is the thread's exit code.
584 MAIN_THREAD_P should be true if the thread to be deleted is
585 the main thread, false otherwise. */
586
3cee93ac 587static void
c559d709 588windows_delete_thread (ptid_t ptid, DWORD exit_code, bool main_thread_p)
3cee93ac 589{
2dc38344
PA
590 DWORD id;
591
7c7411bc 592 gdb_assert (ptid.lwp () != 0);
2dc38344 593
7c7411bc 594 id = ptid.lwp ();
3cee93ac 595
c559d709
JB
596 /* Emit a notification about the thread being deleted.
597
598 Note that no notification was printed when the main thread
599 was created, and thus, unless in verbose mode, we should be
85102364 600 symmetrical, and avoid that notification for the main thread
c559d709
JB
601 here as well. */
602
3cee93ac 603 if (info_verbose)
a068643d 604 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid).c_str ());
c559d709 605 else if (print_thread_events && !main_thread_p)
e0ea48a0 606 printf_unfiltered (_("[%s exited with code %u]\n"),
a068643d
TT
607 target_pid_to_str (ptid).c_str (),
608 (unsigned) exit_code);
c559d709 609
5b6d1e4f 610 delete_thread (find_thread_ptid (&the_windows_nat_target, ptid));
3cee93ac 611
93366324
TT
612 auto iter = std::find_if (thread_list.begin (), thread_list.end (),
613 [=] (windows_thread_info *th)
614 {
55a1e039 615 return th->tid == id;
93366324 616 });
3cee93ac 617
93366324 618 if (iter != thread_list.end ())
24e60978 619 {
e9534bd2 620 delete *iter;
93366324 621 thread_list.erase (iter);
24e60978
SC
622 }
623}
624
9a325b7b
JB
625/* Fetches register number R from the given windows_thread_info,
626 and supplies its value to the given regcache.
627
628 This function assumes that R is non-negative. A failed assertion
629 is raised if that is not true.
630
631 This function assumes that TH->RELOAD_CONTEXT is not set, meaning
632 that the windows_thread_info has an up-to-date context. A failed
633 assertion is raised if that assumption is violated. */
634
3cee93ac 635static void
9a325b7b
JB
636windows_fetch_one_register (struct regcache *regcache,
637 windows_thread_info *th, int r)
24e60978 638{
9a325b7b
JB
639 gdb_assert (r >= 0);
640 gdb_assert (!th->reload_context);
641
46f9f931
HD
642 char *context_ptr = (char *) &th->context;
643#ifdef __x86_64__
644 if (wow64_process)
645 context_ptr = (char *) &th->wow64_context;
646#endif
647
648 char *context_offset = context_ptr + mappings[r];
ac7936df 649 struct gdbarch *gdbarch = regcache->arch ();
20a6ec49 650 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9a325b7b 651
0a4afda3
TT
652 gdb_assert (!gdbarch_read_pc_p (gdbarch));
653 gdb_assert (gdbarch_pc_regnum (gdbarch) >= 0);
654 gdb_assert (!gdbarch_write_pc_p (gdbarch));
655
9a325b7b
JB
656 if (r == I387_FISEG_REGNUM (tdep))
657 {
658 long l = *((long *) context_offset) & 0xffff;
659 regcache->raw_supply (r, (char *) &l);
660 }
661 else if (r == I387_FOP_REGNUM (tdep))
662 {
663 long l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
664 regcache->raw_supply (r, (char *) &l);
665 }
666 else if (segment_register_p (r))
667 {
668 /* GDB treats segment registers as 32bit registers, but they are
669 in fact only 16 bits long. Make sure we do not read extra
670 bits from our source buffer. */
671 long l = *((long *) context_offset) & 0xffff;
672 regcache->raw_supply (r, (char *) &l);
673 }
674 else
0a4afda3
TT
675 {
676 if (th->stopped_at_software_breakpoint
677 && r == gdbarch_pc_regnum (gdbarch))
678 {
679 int size = register_size (gdbarch, r);
680 if (size == 4)
681 {
682 uint32_t value;
683 memcpy (&value, context_offset, size);
684 value -= gdbarch_decr_pc_after_break (gdbarch);
685 memcpy (context_offset, &value, size);
686 }
687 else
688 {
689 gdb_assert (size == 8);
690 uint64_t value;
691 memcpy (&value, context_offset, size);
692 value -= gdbarch_decr_pc_after_break (gdbarch);
693 memcpy (context_offset, &value, size);
694 }
695 }
696 regcache->raw_supply (r, context_offset);
697 }
9a325b7b
JB
698}
699
700void
701windows_nat_target::fetch_registers (struct regcache *regcache, int r)
702{
28688adf 703 windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT);
9a325b7b
JB
704
705 /* Check if TH exists. Windows sometimes uses a non-existent
706 thread id in its events. */
707 if (th == NULL)
708 return;
6c7de422 709
3de88e9a 710 if (th->reload_context)
3ade5333 711 {
f20c58f5 712#ifdef __CYGWIN__
a244bdca
CF
713 if (have_saved_context)
714 {
581e13c1
MS
715 /* Lie about where the program actually is stopped since
716 cygwin has informed us that we should consider the signal
717 to have occurred at another location which is stored in
718 "saved_context. */
3de88e9a 719 memcpy (&th->context, &saved_context,
581e13c1 720 __COPY_CONTEXT_SIZE);
a244bdca
CF
721 have_saved_context = 0;
722 }
723 else
46f9f931
HD
724#endif
725#ifdef __x86_64__
726 if (wow64_process)
727 {
728 th->wow64_context.ContextFlags = CONTEXT_DEBUGGER_DR;
729 CHECK (Wow64GetThreadContext (th->h, &th->wow64_context));
730 /* Copy dr values from that thread.
731 But only if there were not modified since last stop.
732 PR gdb/2388 */
733 if (!debug_registers_changed)
734 {
735 dr[0] = th->wow64_context.Dr0;
736 dr[1] = th->wow64_context.Dr1;
737 dr[2] = th->wow64_context.Dr2;
738 dr[3] = th->wow64_context.Dr3;
739 dr[6] = th->wow64_context.Dr6;
740 dr[7] = th->wow64_context.Dr7;
741 }
742 }
743 else
cb832706 744#endif
a244bdca 745 {
a244bdca 746 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
17617f2d 747 CHECK (GetThreadContext (th->h, &th->context));
2b008701 748 /* Copy dr values from that thread.
581e13c1
MS
749 But only if there were not modified since last stop.
750 PR gdb/2388 */
88616312
PM
751 if (!debug_registers_changed)
752 {
753 dr[0] = th->context.Dr0;
754 dr[1] = th->context.Dr1;
755 dr[2] = th->context.Dr2;
756 dr[3] = th->context.Dr3;
757 dr[6] = th->context.Dr6;
758 dr[7] = th->context.Dr7;
759 }
a244bdca 760 }
62fe396b 761 th->reload_context = false;
3ade5333
CF
762 }
763
9a325b7b
JB
764 if (r < 0)
765 for (r = 0; r < gdbarch_num_regs (regcache->arch()); r++)
766 windows_fetch_one_register (regcache, th, r);
3cee93ac 767 else
9a325b7b 768 windows_fetch_one_register (regcache, th, r);
3cee93ac
CF
769}
770
9a325b7b
JB
771/* Collect the register number R from the given regcache, and store
772 its value into the corresponding area of the given thread's context.
3de88e9a 773
9a325b7b
JB
774 This function assumes that R is non-negative. A failed assertion
775 assertion is raised if that is not true. */
3cee93ac
CF
776
777static void
9a325b7b
JB
778windows_store_one_register (const struct regcache *regcache,
779 windows_thread_info *th, int r)
3cee93ac 780{
9a325b7b
JB
781 gdb_assert (r >= 0);
782
46f9f931
HD
783 char *context_ptr = (char *) &th->context;
784#ifdef __x86_64__
785 if (wow64_process)
786 context_ptr = (char *) &th->wow64_context;
787#endif
788
789 regcache->raw_collect (r, context_ptr + mappings[r]);
24e60978
SC
790}
791
3de88e9a
SM
792/* Store a new register value into the context of the thread tied to
793 REGCACHE. */
f6ac5f3d
PA
794
795void
796windows_nat_target::store_registers (struct regcache *regcache, int r)
3cee93ac 797{
28688adf 798 windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT);
3de88e9a
SM
799
800 /* Check if TH exists. Windows sometimes uses a non-existent
581e13c1 801 thread id in its events. */
9a325b7b
JB
802 if (th == NULL)
803 return;
804
805 if (r < 0)
806 for (r = 0; r < gdbarch_num_regs (regcache->arch ()); r++)
807 windows_store_one_register (regcache, th, r);
808 else
809 windows_store_one_register (regcache, th, r);
3cee93ac 810}
24e60978 811
581e13c1 812/* Maintain a linked list of "so" information. */
d0e449a1 813struct lm_info_windows : public lm_info_base
02e423b9 814{
f8fdb78e 815 LPVOID load_addr = 0;
c162ed3e 816 CORE_ADDR text_offset = 0;
3ee6f623
CF
817};
818
819static struct so_list solib_start, *solib_end;
02e423b9 820
de1b3c3d 821static struct so_list *
dc05df57 822windows_make_so (const char *name, LPVOID load_addr)
8e860359 823{
3ee6f623 824 struct so_list *so;
d0d0ab16
CV
825 char *p;
826#ifndef __CYGWIN__
b3c613f2
CF
827 char buf[__PMAX];
828 char cwd[__PMAX];
3f8ad85b
CF
829 WIN32_FIND_DATA w32_fd;
830 HANDLE h = FindFirstFile(name, &w32_fd);
3f8ad85b 831
6badb179
CF
832 if (h == INVALID_HANDLE_VALUE)
833 strcpy (buf, name);
834 else
3f8ad85b 835 {
c914e0cc
CF
836 FindClose (h);
837 strcpy (buf, name);
838 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
839 {
840 p = strrchr (buf, '\\');
841 if (p)
842 p[1] = '\0';
843 SetCurrentDirectory (buf);
844 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
845 SetCurrentDirectory (cwd);
846 }
3f8ad85b 847 }
3ee6f623
CF
848 if (strcasecmp (buf, "ntdll.dll") == 0)
849 {
850 GetSystemDirectory (buf, sizeof (buf));
851 strcat (buf, "\\ntdll.dll");
852 }
d0d0ab16 853#else
b3c613f2 854 cygwin_buf_t buf[__PMAX];
d0d0ab16 855
b3c613f2 856 buf[0] = 0;
d0d0ab16
CV
857 if (access (name, F_OK) != 0)
858 {
859 if (strcasecmp (name, "ntdll.dll") == 0)
b3c613f2 860#ifdef __USEWIDE
d0d0ab16
CV
861 {
862 GetSystemDirectoryW (buf, sizeof (buf) / sizeof (wchar_t));
863 wcscat (buf, L"\\ntdll.dll");
864 }
b3c613f2
CF
865#else
866 {
867 GetSystemDirectoryA (buf, sizeof (buf) / sizeof (wchar_t));
868 strcat (buf, "\\ntdll.dll");
869 }
870#endif
d0d0ab16
CV
871 }
872#endif
41bf6aca 873 so = XCNEW (struct so_list);
f8fdb78e 874 lm_info_windows *li = new lm_info_windows;
d0e449a1
SM
875 so->lm_info = li;
876 li->load_addr = load_addr;
de1b3c3d 877 strcpy (so->so_original_name, name);
10325bc5
PA
878#ifndef __CYGWIN__
879 strcpy (so->so_name, buf);
880#else
d0d0ab16
CV
881 if (buf[0])
882 cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, so->so_name,
883 SO_NAME_MAX_PATH_SIZE);
884 else
885 {
60c5c021 886 char *rname = realpath (name, NULL);
d0d0ab16
CV
887 if (rname && strlen (rname) < SO_NAME_MAX_PATH_SIZE)
888 {
889 strcpy (so->so_name, rname);
890 free (rname);
891 }
892 else
893 error (_("dll path too long"));
894 }
de1b3c3d
PA
895 /* Record cygwin1.dll .text start/end. */
896 p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
897 if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
898 {
de1b3c3d 899 asection *text = NULL;
8e860359 900
192b62ce 901 gdb_bfd_ref_ptr abfd (gdb_bfd_open (so->so_name, "pei-i386", -1));
a244bdca 902
192b62ce 903 if (abfd == NULL)
de1b3c3d
PA
904 return so;
905
192b62ce
TT
906 if (bfd_check_format (abfd.get (), bfd_object))
907 text = bfd_get_section_by_name (abfd.get (), ".text");
de1b3c3d
PA
908
909 if (!text)
192b62ce 910 return so;
de1b3c3d 911
7a9dd1b2 912 /* The symbols in a dll are offset by 0x1000, which is the
de1b3c3d 913 offset from 0 of the first byte in an image - because of the
581e13c1
MS
914 file header and the section alignment. */
915 cygwin_load_start = (CORE_ADDR) (uintptr_t) ((char *)
916 load_addr + 0x1000);
fd361982 917 cygwin_load_end = cygwin_load_start + bfd_section_size (text);
de1b3c3d 918 }
10325bc5 919#endif
de1b3c3d
PA
920
921 return so;
8e860359
CF
922}
923
1cd9feab
JB
924/* Handle a DLL load event, and return 1.
925
926 This function assumes that this event did not occur during inferior
927 initialization, where their event info may be incomplete (see
928 do_initial_windows_stuff and windows_add_all_dlls for more info
929 on how we handle DLL loading during that phase). */
930
bf469271
PA
931static void
932handle_load_dll ()
24e60978 933{
3a4b77d8 934 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
9d8679cc 935 const char *dll_name;
24e60978 936
94481b8c
JB
937 /* Try getting the DLL name via the lpImageName field of the event.
938 Note that Microsoft documents this fields as strictly optional,
939 in the sense that it might be NULL. And the first DLL event in
940 particular is explicitly documented as "likely not pass[ed]"
941 (source: MSDN LOAD_DLL_DEBUG_INFO structure). */
1cd9feab
JB
942 dll_name = get_image_name (current_process_handle,
943 event->lpImageName, event->fUnicode);
3cee93ac 944 if (!dll_name)
bf469271 945 return;
3cee93ac 946
dc05df57 947 solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll);
de1b3c3d 948 solib_end = solib_end->next;
450005e7 949
d0e449a1
SM
950 lm_info_windows *li = (lm_info_windows *) solib_end->lm_info;
951
a74ce742 952 DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end->so_name,
d0e449a1 953 host_address_to_string (li->load_addr)));
450005e7
CF
954}
955
3ee6f623 956static void
dc05df57 957windows_free_so (struct so_list *so)
3ee6f623 958{
f8fdb78e
SM
959 lm_info_windows *li = (lm_info_windows *) so->lm_info;
960
961 delete li;
de1b3c3d 962 xfree (so);
3cb8e7f6
CF
963}
964
3be75f87
JB
965/* Handle a DLL unload event.
966 Return 1 if successful, or zero otherwise.
967
968 This function assumes that this event did not occur during inferior
969 initialization, where their event info may be incomplete (see
970 do_initial_windows_stuff and windows_add_all_dlls for more info
971 on how we handle DLL loading during that phase). */
972
bf469271
PA
973static void
974handle_unload_dll ()
d3ff4a77 975{
d3653bf6 976 LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll;
3ee6f623 977 struct so_list *so;
d3ff4a77
CF
978
979 for (so = &solib_start; so->next != NULL; so = so->next)
d0e449a1
SM
980 {
981 lm_info_windows *li_next = (lm_info_windows *) so->next->lm_info;
a25cd31f 982
d0e449a1
SM
983 if (li_next->load_addr == lpBaseOfDll)
984 {
985 struct so_list *sodel = so->next;
7488902c 986
d0e449a1
SM
987 so->next = sodel->next;
988 if (!so->next)
989 solib_end = so;
990 DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name));
991
992 windows_free_so (sodel);
bf469271 993 return;
d0e449a1
SM
994 }
995 }
3929abe9 996
ecc13e53
JB
997 /* We did not find any DLL that was previously loaded at this address,
998 so register a complaint. We do not report an error, because we have
999 observed that this may be happening under some circumstances. For
1000 instance, running 32bit applications on x64 Windows causes us to receive
1001 4 mysterious UNLOAD_DLL_DEBUG_EVENTs during the startup phase (these
1002 events are apparently caused by the WOW layer, the interface between
1003 32bit and 64bit worlds). */
b98664d3 1004 complaint (_("dll starting at %s not found."),
ecc13e53 1005 host_address_to_string (lpBaseOfDll));
bf469271
PA
1006}
1007
1008/* Call FUNC wrapped in a TRY/CATCH that swallows all GDB
1009 exceptions. */
d3ff4a77 1010
bf469271
PA
1011static void
1012catch_errors (void (*func) ())
1013{
a70b8144 1014 try
bf469271
PA
1015 {
1016 func ();
1017 }
230d2906 1018 catch (const gdb_exception &ex)
bf469271
PA
1019 {
1020 exception_print (gdb_stderr, ex);
1021 }
d3ff4a77
CF
1022}
1023
581e13c1 1024/* Clear list of loaded DLLs. */
3ee6f623 1025static void
dc05df57 1026windows_clear_solib (void)
450005e7 1027{
25057eb0
HD
1028 struct so_list *so;
1029
1030 for (so = solib_start.next; so; so = solib_start.next)
1031 {
1032 solib_start.next = so->next;
1033 windows_free_so (so);
1034 }
1035
450005e7 1036 solib_end = &solib_start;
450005e7 1037}
295732ea 1038
463888ab 1039static void
0b39b52e 1040signal_event_command (const char *args, int from_tty)
463888ab
РИ
1041{
1042 uintptr_t event_id = 0;
1043 char *endargs = NULL;
1044
1045 if (args == NULL)
1046 error (_("signal-event requires an argument (integer event id)"));
1047
1048 event_id = strtoumax (args, &endargs, 10);
1049
1050 if ((errno == ERANGE) || (event_id == 0) || (event_id > UINTPTR_MAX) ||
1051 ((HANDLE) event_id == INVALID_HANDLE_VALUE))
1052 error (_("Failed to convert `%s' to event id"), args);
1053
1054 SetEvent ((HANDLE) event_id);
1055 CloseHandle ((HANDLE) event_id);
1056}
1057
3cee93ac
CF
1058/* Handle DEBUG_STRING output from child process.
1059 Cygwin prepends its messages with a "cygwin:". Interpret this as
581e13c1 1060 a Cygwin signal. Otherwise just print the string as a warning. */
3cee93ac
CF
1061static int
1062handle_output_debug_string (struct target_waitstatus *ourstatus)
1063{
e83e4e24 1064 gdb::unique_xmalloc_ptr<char> s;
a244bdca 1065 int retval = 0;
3cee93ac
CF
1066
1067 if (!target_read_string
2c647436 1068 ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
e83e4e24
TT
1069 &s, 1024, 0)
1070 || !s || !*(s.get ()))
a244bdca 1071 /* nothing to do */;
e83e4e24 1072 else if (!startswith (s.get (), _CYGWIN_SIGNAL_STRING))
3cee93ac 1073 {
10325bc5 1074#ifdef __CYGWIN__
e83e4e24 1075 if (!startswith (s.get (), "cYg"))
10325bc5 1076#endif
040ea00b 1077 {
e83e4e24 1078 char *p = strchr (s.get (), '\0');
040ea00b 1079
e83e4e24 1080 if (p > s.get () && *--p == '\n')
040ea00b 1081 *p = '\0';
e83e4e24 1082 warning (("%s"), s.get ());
040ea00b 1083 }
3cee93ac 1084 }
f20c58f5 1085#ifdef __CYGWIN__
d3a09475 1086 else
3cee93ac 1087 {
581e13c1
MS
1088 /* Got a cygwin signal marker. A cygwin signal is followed by
1089 the signal number itself and then optionally followed by the
1090 thread id and address to saved context within the DLL. If
1091 these are supplied, then the given thread is assumed to have
1092 issued the signal and the context from the thread is assumed
1093 to be stored at the given address in the inferior. Tell gdb
1094 to treat this like a real signal. */
3cee93ac 1095 char *p;
e83e4e24 1096 int sig = strtol (s.get () + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
0ae534d2 1097 gdb_signal gotasig = gdb_signal_from_host (sig);
c62fa0e2 1098
0714f9bf
SS
1099 ourstatus->value.sig = gotasig;
1100 if (gotasig)
a244bdca
CF
1101 {
1102 LPCVOID x;
2c15ef43 1103 SIZE_T n;
c62fa0e2 1104
a244bdca
CF
1105 ourstatus->kind = TARGET_WAITKIND_STOPPED;
1106 retval = strtoul (p, &p, 0);
1107 if (!retval)
ab4ee614 1108 retval = current_event.dwThreadId;
40653b35 1109 else if ((x = (LPCVOID) (uintptr_t) strtoull (p, NULL, 0))
a244bdca 1110 && ReadProcessMemory (current_process_handle, x,
581e13c1
MS
1111 &saved_context,
1112 __COPY_CONTEXT_SIZE, &n)
a244bdca
CF
1113 && n == __COPY_CONTEXT_SIZE)
1114 have_saved_context = 1;
a244bdca 1115 }
3cee93ac 1116 }
cb832706 1117#endif
3cee93ac 1118
a244bdca 1119 return retval;
3cee93ac 1120}
24e60978 1121
c1748f97
PM
1122static int
1123display_selector (HANDLE thread, DWORD sel)
1124{
1125 LDT_ENTRY info;
46f9f931
HD
1126 BOOL ret;
1127#ifdef __x86_64__
1128 if (wow64_process)
1129 ret = Wow64GetThreadSelectorEntry (thread, sel, &info);
1130 else
1131#endif
1132 ret = GetThreadSelectorEntry (thread, sel, &info);
1133 if (ret)
c1748f97
PM
1134 {
1135 int base, limit;
d50a0ce2 1136 printf_filtered ("0x%03x: ", (unsigned) sel);
c1748f97 1137 if (!info.HighWord.Bits.Pres)
baa93fa6
CF
1138 {
1139 puts_filtered ("Segment not present\n");
1140 return 0;
1141 }
c1748f97
PM
1142 base = (info.HighWord.Bits.BaseHi << 24) +
1143 (info.HighWord.Bits.BaseMid << 16)
1144 + info.BaseLow;
1145 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
1146 if (info.HighWord.Bits.Granularity)
caad7706 1147 limit = (limit << 12) | 0xfff;
c1748f97
PM
1148 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
1149 if (info.HighWord.Bits.Default_Big)
baa93fa6 1150 puts_filtered(" 32-bit ");
c1748f97 1151 else
baa93fa6 1152 puts_filtered(" 16-bit ");
c1748f97
PM
1153 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
1154 {
1155 case 0:
baa93fa6
CF
1156 puts_filtered ("Data (Read-Only, Exp-up");
1157 break;
c1748f97 1158 case 1:
baa93fa6
CF
1159 puts_filtered ("Data (Read/Write, Exp-up");
1160 break;
c1748f97 1161 case 2:
baa93fa6
CF
1162 puts_filtered ("Unused segment (");
1163 break;
c1748f97 1164 case 3:
baa93fa6
CF
1165 puts_filtered ("Data (Read/Write, Exp-down");
1166 break;
c1748f97 1167 case 4:
baa93fa6
CF
1168 puts_filtered ("Code (Exec-Only, N.Conf");
1169 break;
c1748f97 1170 case 5:
baa93fa6 1171 puts_filtered ("Code (Exec/Read, N.Conf");
c1748f97
PM
1172 break;
1173 case 6:
baa93fa6 1174 puts_filtered ("Code (Exec-Only, Conf");
c1748f97
PM
1175 break;
1176 case 7:
baa93fa6 1177 puts_filtered ("Code (Exec/Read, Conf");
c1748f97
PM
1178 break;
1179 default:
e432ccf1
JT
1180 printf_filtered ("Unknown type 0x%lx",
1181 (unsigned long) info.HighWord.Bits.Type);
c1748f97
PM
1182 }
1183 if ((info.HighWord.Bits.Type & 0x1) == 0)
baa93fa6 1184 puts_filtered(", N.Acc");
c1748f97
PM
1185 puts_filtered (")\n");
1186 if ((info.HighWord.Bits.Type & 0x10) == 0)
1187 puts_filtered("System selector ");
e432ccf1
JT
1188 printf_filtered ("Priviledge level = %ld. ",
1189 (unsigned long) info.HighWord.Bits.Dpl);
c1748f97 1190 if (info.HighWord.Bits.Granularity)
baa93fa6 1191 puts_filtered ("Page granular.\n");
c1748f97
PM
1192 else
1193 puts_filtered ("Byte granular.\n");
1194 return 1;
1195 }
1196 else
1197 {
5572ce1f
PM
1198 DWORD err = GetLastError ();
1199 if (err == ERROR_NOT_SUPPORTED)
1200 printf_filtered ("Function not supported\n");
1201 else
d50a0ce2 1202 printf_filtered ("Invalid selector 0x%x.\n", (unsigned) sel);
c1748f97
PM
1203 return 0;
1204 }
1205}
1206
1207static void
5fed81ff 1208display_selectors (const char * args, int from_tty)
c1748f97
PM
1209{
1210 if (!current_thread)
1211 {
1212 puts_filtered ("Impossible to display selectors now.\n");
1213 return;
1214 }
1215 if (!args)
1216 {
46f9f931
HD
1217#ifdef __x86_64__
1218 if (wow64_process)
1219 {
1220 puts_filtered ("Selector $cs\n");
1221 display_selector (current_thread->h,
1222 current_thread->wow64_context.SegCs);
1223 puts_filtered ("Selector $ds\n");
1224 display_selector (current_thread->h,
1225 current_thread->wow64_context.SegDs);
1226 puts_filtered ("Selector $es\n");
1227 display_selector (current_thread->h,
1228 current_thread->wow64_context.SegEs);
1229 puts_filtered ("Selector $ss\n");
1230 display_selector (current_thread->h,
1231 current_thread->wow64_context.SegSs);
1232 puts_filtered ("Selector $fs\n");
1233 display_selector (current_thread->h,
1234 current_thread->wow64_context.SegFs);
1235 puts_filtered ("Selector $gs\n");
1236 display_selector (current_thread->h,
1237 current_thread->wow64_context.SegGs);
1238 }
1239 else
1240#endif
1241 {
1242 puts_filtered ("Selector $cs\n");
1243 display_selector (current_thread->h,
1244 current_thread->context.SegCs);
1245 puts_filtered ("Selector $ds\n");
1246 display_selector (current_thread->h,
1247 current_thread->context.SegDs);
1248 puts_filtered ("Selector $es\n");
1249 display_selector (current_thread->h,
1250 current_thread->context.SegEs);
1251 puts_filtered ("Selector $ss\n");
1252 display_selector (current_thread->h,
1253 current_thread->context.SegSs);
1254 puts_filtered ("Selector $fs\n");
1255 display_selector (current_thread->h,
1256 current_thread->context.SegFs);
1257 puts_filtered ("Selector $gs\n");
1258 display_selector (current_thread->h,
1259 current_thread->context.SegGs);
1260 }
c1748f97
PM
1261 }
1262 else
1263 {
1264 int sel;
1265 sel = parse_and_eval_long (args);
1266 printf_filtered ("Selector \"%s\"\n",args);
1267 display_selector (current_thread->h, sel);
1268 }
1269}
1270
7393af7c 1271#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
a74ce742
PM
1272 printf_unfiltered ("gdb: Target exception %s at %s\n", x, \
1273 host_address_to_string (\
1274 current_event.u.Exception.ExceptionRecord.ExceptionAddress))
7393af7c 1275
24cdb46e 1276static handle_exception_result
450005e7 1277handle_exception (struct target_waitstatus *ourstatus)
24e60978 1278{
24cdb46e
РИ
1279 EXCEPTION_RECORD *rec = &current_event.u.Exception.ExceptionRecord;
1280 DWORD code = rec->ExceptionCode;
1281 handle_exception_result result = HANDLE_EXCEPTION_HANDLED;
3cee93ac 1282
7928d571
HD
1283 memcpy (&siginfo_er, rec, sizeof siginfo_er);
1284
29fe111d 1285 ourstatus->kind = TARGET_WAITKIND_STOPPED;
8a892701 1286
581e13c1 1287 /* Record the context of the current thread. */
28688adf
TT
1288 thread_rec (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0),
1289 DONT_SUSPEND);
24e60978 1290
29fe111d 1291 switch (code)
24e60978 1292 {
1ef980b9 1293 case EXCEPTION_ACCESS_VIOLATION:
7393af7c 1294 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
a493e3e2 1295 ourstatus->value.sig = GDB_SIGNAL_SEGV;
10325bc5 1296#ifdef __CYGWIN__
8da8e0b3 1297 {
581e13c1
MS
1298 /* See if the access violation happened within the cygwin DLL
1299 itself. Cygwin uses a kind of exception handling to deal
1300 with passed-in invalid addresses. gdb should not treat
1301 these as real SEGVs since they will be silently handled by
1302 cygwin. A real SEGV will (theoretically) be caught by
1303 cygwin later in the process and will be sent as a
1304 cygwin-specific-signal. So, ignore SEGVs if they show up
1305 within the text segment of the DLL itself. */
2c02bd72 1306 const char *fn;
24cdb46e 1307 CORE_ADDR addr = (CORE_ADDR) (uintptr_t) rec->ExceptionAddress;
581e13c1
MS
1308
1309 if ((!cygwin_exceptions && (addr >= cygwin_load_start
1310 && addr < cygwin_load_end))
a244bdca 1311 || (find_pc_partial_function (addr, &fn, NULL, NULL)
61012eef 1312 && startswith (fn, "KERNEL32!IsBad")))
24cdb46e 1313 return HANDLE_EXCEPTION_UNHANDLED;
8da8e0b3 1314 }
10325bc5 1315#endif
7393af7c
PM
1316 break;
1317 case STATUS_STACK_OVERFLOW:
1318 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
a493e3e2 1319 ourstatus->value.sig = GDB_SIGNAL_SEGV;
7393af7c
PM
1320 break;
1321 case STATUS_FLOAT_DENORMAL_OPERAND:
1322 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
a493e3e2 1323 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1324 break;
1325 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1326 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
a493e3e2 1327 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1328 break;
1329 case STATUS_FLOAT_INEXACT_RESULT:
1330 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
a493e3e2 1331 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1332 break;
1333 case STATUS_FLOAT_INVALID_OPERATION:
1334 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
a493e3e2 1335 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1336 break;
1337 case STATUS_FLOAT_OVERFLOW:
1338 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
a493e3e2 1339 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c
PM
1340 break;
1341 case STATUS_FLOAT_STACK_CHECK:
1342 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
a493e3e2 1343 ourstatus->value.sig = GDB_SIGNAL_FPE;
1ef980b9 1344 break;
3b7c8b74 1345 case STATUS_FLOAT_UNDERFLOW:
7393af7c 1346 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
a493e3e2 1347 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c 1348 break;
3b7c8b74 1349 case STATUS_FLOAT_DIVIDE_BY_ZERO:
7393af7c 1350 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
a493e3e2 1351 ourstatus->value.sig = GDB_SIGNAL_FPE;
7393af7c 1352 break;
3b7c8b74 1353 case STATUS_INTEGER_DIVIDE_BY_ZERO:
7393af7c 1354 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
a493e3e2 1355 ourstatus->value.sig = GDB_SIGNAL_FPE;
3b7c8b74 1356 break;
7393af7c
PM
1357 case STATUS_INTEGER_OVERFLOW:
1358 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
a493e3e2 1359 ourstatus->value.sig = GDB_SIGNAL_FPE;
1ef980b9
SC
1360 break;
1361 case EXCEPTION_BREAKPOINT:
46f9f931
HD
1362#ifdef __x86_64__
1363 if (ignore_first_breakpoint)
1364 {
1365 /* For WOW64 processes, there are always 2 breakpoint exceptions
1366 on startup, first a BREAKPOINT for the 64bit ntdll.dll,
1367 then a WX86_BREAKPOINT for the 32bit ntdll.dll.
1368 Here we only care about the WX86_BREAKPOINT's. */
1369 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1370 ignore_first_breakpoint = false;
1371 }
1372#endif
1373 /* FALLTHROUGH */
1374 case STATUS_WX86_BREAKPOINT:
7393af7c 1375 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
a493e3e2 1376 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1ef980b9
SC
1377 break;
1378 case DBG_CONTROL_C:
7393af7c 1379 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
a493e3e2 1380 ourstatus->value.sig = GDB_SIGNAL_INT;
5b421780
PM
1381 break;
1382 case DBG_CONTROL_BREAK:
7393af7c 1383 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
a493e3e2 1384 ourstatus->value.sig = GDB_SIGNAL_INT;
1ef980b9
SC
1385 break;
1386 case EXCEPTION_SINGLE_STEP:
46f9f931 1387 case STATUS_WX86_SINGLE_STEP:
7393af7c 1388 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
a493e3e2 1389 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1ef980b9 1390 break;
8227c82d 1391 case EXCEPTION_ILLEGAL_INSTRUCTION:
7393af7c 1392 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
a493e3e2 1393 ourstatus->value.sig = GDB_SIGNAL_ILL;
7393af7c
PM
1394 break;
1395 case EXCEPTION_PRIV_INSTRUCTION:
1396 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
a493e3e2 1397 ourstatus->value.sig = GDB_SIGNAL_ILL;
7393af7c
PM
1398 break;
1399 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1400 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
a493e3e2 1401 ourstatus->value.sig = GDB_SIGNAL_ILL;
8227c82d 1402 break;
24cdb46e
РИ
1403 case MS_VC_EXCEPTION:
1404 if (rec->NumberParameters >= 3
1405 && (rec->ExceptionInformation[0] & 0xffffffff) == 0x1000)
1406 {
1407 DWORD named_thread_id;
1408 windows_thread_info *named_thread;
1409 CORE_ADDR thread_name_target;
1410
1411 DEBUG_EXCEPTION_SIMPLE ("MS_VC_EXCEPTION");
1412
1413 thread_name_target = rec->ExceptionInformation[1];
1414 named_thread_id = (DWORD) (0xffffffff & rec->ExceptionInformation[2]);
1415
1416 if (named_thread_id == (DWORD) -1)
1417 named_thread_id = current_event.dwThreadId;
1418
28688adf
TT
1419 named_thread = thread_rec (ptid_t (current_event.dwProcessId,
1420 named_thread_id, 0),
1421 DONT_INVALIDATE_CONTEXT);
24cdb46e
РИ
1422 if (named_thread != NULL)
1423 {
1424 int thread_name_len;
e83e4e24 1425 gdb::unique_xmalloc_ptr<char> thread_name;
24cdb46e
РИ
1426
1427 thread_name_len = target_read_string (thread_name_target,
1428 &thread_name, 1025, NULL);
1429 if (thread_name_len > 0)
1430 {
e83e4e24 1431 thread_name.get ()[thread_name_len - 1] = '\0';
2950fdf7 1432 named_thread->name = std::move (thread_name);
24cdb46e 1433 }
24cdb46e
РИ
1434 }
1435 ourstatus->value.sig = GDB_SIGNAL_TRAP;
1436 result = HANDLE_EXCEPTION_IGNORED;
1437 break;
1438 }
e7ec8713
TT
1439 /* treat improperly formed exception as unknown */
1440 /* FALLTHROUGH */
1ef980b9 1441 default:
581e13c1 1442 /* Treat unhandled first chance exceptions specially. */
02e423b9 1443 if (current_event.u.Exception.dwFirstChance)
24cdb46e 1444 return HANDLE_EXCEPTION_UNHANDLED;
d50a0ce2
CV
1445 printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
1446 (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
a74ce742
PM
1447 host_address_to_string (
1448 current_event.u.Exception.ExceptionRecord.ExceptionAddress));
a493e3e2 1449 ourstatus->value.sig = GDB_SIGNAL_UNKNOWN;
1ef980b9 1450 break;
24e60978 1451 }
24e60978 1452 exception_count++;
7393af7c 1453 last_sig = ourstatus->value.sig;
24cdb46e 1454 return result;
24e60978
SC
1455}
1456
17617f2d
EZ
1457/* Resume thread specified by ID, or all artificially suspended
1458 threads, if we are continuing execution. KILLED non-zero means we
1459 have killed the inferior, so we should ignore weird errors due to
1460 threads shutting down. */
3cee93ac 1461static BOOL
17617f2d 1462windows_continue (DWORD continue_status, int id, int killed)
3cee93ac 1463{
3cee93ac
CF
1464 BOOL res;
1465
0a4afda3
TT
1466 desired_stop_thread_id = id;
1467
1468 /* If there are pending stops, and we might plausibly hit one of
1469 them, we don't want to actually continue the inferior -- we just
1470 want to report the stop. In this case, we just pretend to
1471 continue. See the comment by the definition of "pending_stops"
1472 for details on why this is needed. */
1473 for (const auto &item : pending_stops)
1474 {
1475 if (desired_stop_thread_id == -1
1476 || desired_stop_thread_id == item.thread_id)
1477 {
1478 DEBUG_EVENTS (("windows_continue - pending stop anticipated, "
1479 "desired=0x%x, item=0x%x\n",
1480 desired_stop_thread_id, item.thread_id));
1481 return TRUE;
1482 }
1483 }
1484
0c3d84be 1485 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
0a4afda3
TT
1486 (unsigned) last_wait_event.dwProcessId,
1487 (unsigned) last_wait_event.dwThreadId,
dfe7f3ac 1488 continue_status == DBG_CONTINUE ?
7393af7c 1489 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
6537bb24 1490
93366324 1491 for (windows_thread_info *th : thread_list)
0a4afda3 1492 if (id == -1 || id == (int) th->tid)
6537bb24 1493 {
0a4afda3
TT
1494 if (!th->suspended)
1495 continue;
46f9f931
HD
1496#ifdef __x86_64__
1497 if (wow64_process)
6537bb24 1498 {
46f9f931
HD
1499 if (debug_registers_changed)
1500 {
1501 th->wow64_context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1502 th->wow64_context.Dr0 = dr[0];
1503 th->wow64_context.Dr1 = dr[1];
1504 th->wow64_context.Dr2 = dr[2];
1505 th->wow64_context.Dr3 = dr[3];
1506 th->wow64_context.Dr6 = DR6_CLEAR_VALUE;
1507 th->wow64_context.Dr7 = dr[7];
1508 }
1509 if (th->wow64_context.ContextFlags)
1510 {
1511 DWORD ec = 0;
1512
1513 if (GetExitCodeThread (th->h, &ec)
1514 && ec == STILL_ACTIVE)
1515 {
1516 BOOL status = Wow64SetThreadContext (th->h,
1517 &th->wow64_context);
1518
1519 if (!killed)
1520 CHECK (status);
1521 }
1522 th->wow64_context.ContextFlags = 0;
1523 }
6537bb24 1524 }
46f9f931
HD
1525 else
1526#endif
6537bb24 1527 {
46f9f931 1528 if (debug_registers_changed)
17617f2d 1529 {
46f9f931
HD
1530 th->context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1531 th->context.Dr0 = dr[0];
1532 th->context.Dr1 = dr[1];
1533 th->context.Dr2 = dr[2];
1534 th->context.Dr3 = dr[3];
1535 th->context.Dr6 = DR6_CLEAR_VALUE;
1536 th->context.Dr7 = dr[7];
1537 }
1538 if (th->context.ContextFlags)
1539 {
1540 DWORD ec = 0;
1541
1542 if (GetExitCodeThread (th->h, &ec)
1543 && ec == STILL_ACTIVE)
1544 {
1545 BOOL status = SetThreadContext (th->h, &th->context);
17617f2d 1546
46f9f931
HD
1547 if (!killed)
1548 CHECK (status);
1549 }
1550 th->context.ContextFlags = 0;
17617f2d 1551 }
6537bb24 1552 }
98a03287 1553 th->resume ();
6537bb24 1554 }
0a4afda3
TT
1555 else
1556 {
1557 /* When single-stepping a specific thread, other threads must
1558 be suspended. */
1559 th->suspend ();
1560 }
6537bb24 1561
0a4afda3
TT
1562 res = ContinueDebugEvent (last_wait_event.dwProcessId,
1563 last_wait_event.dwThreadId,
0714f9bf 1564 continue_status);
3cee93ac 1565
68ffc902
JT
1566 if (!res)
1567 error (_("Failed to resume program execution"
1568 " (ContinueDebugEvent failed, error %u)"),
1569 (unsigned int) GetLastError ());
1570
fa4ba8da 1571 debug_registers_changed = 0;
3cee93ac
CF
1572 return res;
1573}
1574
d6dc8049
CF
1575/* Called in pathological case where Windows fails to send a
1576 CREATE_PROCESS_DEBUG_EVENT after an attach. */
3ee6f623 1577static DWORD
5439edaa 1578fake_create_process (void)
3ade5333
CF
1579{
1580 current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1581 current_event.dwProcessId);
bf25528d
CF
1582 if (current_process_handle != NULL)
1583 open_process_used = 1;
1584 else
1585 {
d50a0ce2
CV
1586 error (_("OpenProcess call failed, GetLastError = %u"),
1587 (unsigned) GetLastError ());
bf25528d
CF
1588 /* We can not debug anything in that case. */
1589 }
c559d709 1590 current_thread
7c7411bc
TT
1591 = windows_add_thread (ptid_t (current_event.dwProcessId,
1592 current_event.dwThreadId, 0),
c559d709
JB
1593 current_event.u.CreateThread.hThread,
1594 current_event.u.CreateThread.lpThreadLocalBase,
1595 true /* main_thread_p */);
ab4ee614 1596 return current_event.dwThreadId;
3ade5333
CF
1597}
1598
f6ac5f3d
PA
1599void
1600windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
a244bdca 1601{
876d1cd7 1602 windows_thread_info *th;
a244bdca
CF
1603 DWORD continue_status = DBG_CONTINUE;
1604
2dc38344 1605 /* A specific PTID means `step only this thread id'. */
d7e15655 1606 int resume_all = ptid == minus_one_ptid;
2dc38344
PA
1607
1608 /* If we're continuing all threads, it's the current inferior that
1609 should be handled specially. */
1610 if (resume_all)
1611 ptid = inferior_ptid;
a244bdca 1612
a493e3e2 1613 if (sig != GDB_SIGNAL_0)
a244bdca
CF
1614 {
1615 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1616 {
1617 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1618 }
1619 else if (sig == last_sig)
1620 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1621 else
1622#if 0
1623/* This code does not seem to work, because
1624 the kernel does probably not consider changes in the ExceptionRecord
1625 structure when passing the exception to the inferior.
1626 Note that this seems possible in the exception handler itself. */
1627 {
73c13fe6
TT
1628 for (const xlate_exception &x : xlate)
1629 if (x.us == sig)
a244bdca 1630 {
581e13c1 1631 current_event.u.Exception.ExceptionRecord.ExceptionCode
73c13fe6 1632 = x.them;
a244bdca
CF
1633 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1634 break;
1635 }
1636 if (continue_status == DBG_CONTINUE)
1637 {
1638 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1639 }
1640 }
1641#endif
23942819 1642 DEBUG_EXCEPT(("Can only continue with received signal %d.\n",
a244bdca
CF
1643 last_sig));
1644 }
1645
a493e3e2 1646 last_sig = GDB_SIGNAL_0;
a244bdca 1647
55dfc88f 1648 DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=0x%x, step=%d, sig=%d);\n",
7c7411bc 1649 ptid.pid (), (unsigned) ptid.lwp (), step, sig));
a244bdca 1650
581e13c1 1651 /* Get context for currently selected thread. */
28688adf 1652 th = thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT);
a244bdca
CF
1653 if (th)
1654 {
46f9f931
HD
1655#ifdef __x86_64__
1656 if (wow64_process)
a244bdca 1657 {
46f9f931
HD
1658 if (step)
1659 {
1660 /* Single step by setting t bit. */
1661 struct regcache *regcache = get_current_regcache ();
1662 struct gdbarch *gdbarch = regcache->arch ();
1663 fetch_registers (regcache, gdbarch_ps_regnum (gdbarch));
1664 th->wow64_context.EFlags |= FLAG_TRACE_BIT;
1665 }
a244bdca 1666
46f9f931
HD
1667 if (th->wow64_context.ContextFlags)
1668 {
1669 if (debug_registers_changed)
1670 {
1671 th->wow64_context.Dr0 = dr[0];
1672 th->wow64_context.Dr1 = dr[1];
1673 th->wow64_context.Dr2 = dr[2];
1674 th->wow64_context.Dr3 = dr[3];
1675 th->wow64_context.Dr6 = DR6_CLEAR_VALUE;
1676 th->wow64_context.Dr7 = dr[7];
1677 }
1678 CHECK (Wow64SetThreadContext (th->h, &th->wow64_context));
1679 th->wow64_context.ContextFlags = 0;
1680 }
1681 }
1682 else
1683#endif
a244bdca 1684 {
46f9f931 1685 if (step)
a244bdca 1686 {
46f9f931
HD
1687 /* Single step by setting t bit. */
1688 struct regcache *regcache = get_current_regcache ();
1689 struct gdbarch *gdbarch = regcache->arch ();
1690 fetch_registers (regcache, gdbarch_ps_regnum (gdbarch));
1691 th->context.EFlags |= FLAG_TRACE_BIT;
1692 }
1693
1694 if (th->context.ContextFlags)
1695 {
1696 if (debug_registers_changed)
1697 {
1698 th->context.Dr0 = dr[0];
1699 th->context.Dr1 = dr[1];
1700 th->context.Dr2 = dr[2];
1701 th->context.Dr3 = dr[3];
1702 th->context.Dr6 = DR6_CLEAR_VALUE;
1703 th->context.Dr7 = dr[7];
1704 }
1705 CHECK (SetThreadContext (th->h, &th->context));
1706 th->context.ContextFlags = 0;
a244bdca 1707 }
a244bdca
CF
1708 }
1709 }
1710
1711 /* Allow continuing with the same signal that interrupted us.
581e13c1 1712 Otherwise complain. */
a244bdca 1713
2dc38344 1714 if (resume_all)
17617f2d 1715 windows_continue (continue_status, -1, 0);
2dc38344 1716 else
7c7411bc 1717 windows_continue (continue_status, ptid.lwp (), 0);
a244bdca
CF
1718}
1719
695de547
CF
1720/* Ctrl-C handler used when the inferior is not run in the same console. The
1721 handler is in charge of interrupting the inferior using DebugBreakProcess.
1722 Note that this function is not available prior to Windows XP. In this case
1723 we emit a warning. */
d603d4b3 1724static BOOL WINAPI
695de547
CF
1725ctrl_c_handler (DWORD event_type)
1726{
1727 const int attach_flag = current_inferior ()->attach_flag;
1728
bb0613a5
PM
1729 /* Only handle Ctrl-C and Ctrl-Break events. Ignore others. */
1730 if (event_type != CTRL_C_EVENT && event_type != CTRL_BREAK_EVENT)
695de547
CF
1731 return FALSE;
1732
1733 /* If the inferior and the debugger share the same console, do nothing as
1734 the inferior has also received the Ctrl-C event. */
1735 if (!new_console && !attach_flag)
1736 return TRUE;
1737
1738 if (!DebugBreakProcess (current_process_handle))
581e13c1
MS
1739 warning (_("Could not interrupt program. "
1740 "Press Ctrl-c in the program console."));
695de547
CF
1741
1742 /* Return true to tell that Ctrl-C has been handled. */
1743 return TRUE;
1744}
1745
0a4afda3
TT
1746/* A wrapper for WaitForDebugEvent that sets "last_wait_event"
1747 appropriately. */
1748static BOOL
1749wait_for_debug_event (DEBUG_EVENT *event, DWORD timeout)
1750{
1751 BOOL result = WaitForDebugEvent (event, timeout);
1752 if (result)
1753 last_wait_event = *event;
1754 return result;
1755}
1756
e6ad66bd
JT
1757/* Get the next event from the child. Returns a non-zero thread id if the event
1758 requires handling by WFI (or whatever). */
5b6d1e4f
PA
1759
1760int
1761windows_nat_target::get_windows_debug_event (int pid,
1762 struct target_waitstatus *ourstatus)
1e37c281
JM
1763{
1764 BOOL debug_event;
8a892701 1765 DWORD continue_status, event_code;
876d1cd7 1766 windows_thread_info *th;
e9534bd2 1767 static windows_thread_info dummy_thread_info (0, 0, 0);
e6ad66bd 1768 DWORD thread_id = 0;
1e37c281 1769
0a4afda3
TT
1770 /* If there is a relevant pending stop, report it now. See the
1771 comment by the definition of "pending_stops" for details on why
1772 this is needed. */
1773 for (auto iter = pending_stops.begin ();
1774 iter != pending_stops.end ();
1775 ++iter)
1776 {
1777 if (desired_stop_thread_id == -1
1778 || desired_stop_thread_id == iter->thread_id)
1779 {
1780 thread_id = iter->thread_id;
1781 *ourstatus = iter->status;
1782 current_event = iter->event;
1783
1784 inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
28688adf 1785 current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT);
0a4afda3
TT
1786 current_thread->reload_context = 1;
1787
1788 DEBUG_EVENTS (("get_windows_debug_event - "
1789 "pending stop found in 0x%x (desired=0x%x)\n",
1790 thread_id, desired_stop_thread_id));
1791
1792 pending_stops.erase (iter);
1793 return thread_id;
1794 }
1795 }
1796
a493e3e2 1797 last_sig = GDB_SIGNAL_0;
9d3789f7 1798
0a4afda3 1799 if (!(debug_event = wait_for_debug_event (&current_event, 1000)))
29fe111d 1800 goto out;
1e37c281
JM
1801
1802 event_count++;
1803 continue_status = DBG_CONTINUE;
1e37c281 1804
8a892701 1805 event_code = current_event.dwDebugEventCode;
450005e7 1806 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
87a45c96 1807 th = NULL;
a244bdca 1808 have_saved_context = 0;
8a892701
CF
1809
1810 switch (event_code)
1e37c281
JM
1811 {
1812 case CREATE_THREAD_DEBUG_EVENT:
0c3d84be 1813 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1814 (unsigned) current_event.dwProcessId,
1815 (unsigned) current_event.dwThreadId,
1816 "CREATE_THREAD_DEBUG_EVENT"));
dfe7f3ac 1817 if (saw_create != 1)
3ade5333 1818 {
5b6d1e4f 1819 inferior *inf = find_inferior_pid (this, current_event.dwProcessId);
181e7f93 1820 if (!saw_create && inf->attach_flag)
3ade5333 1821 {
d6dc8049
CF
1822 /* Kludge around a Windows bug where first event is a create
1823 thread event. Caused when attached process does not have
581e13c1 1824 a main thread. */
e6ad66bd
JT
1825 thread_id = fake_create_process ();
1826 if (thread_id)
181e7f93 1827 saw_create++;
3ade5333
CF
1828 }
1829 break;
1830 }
581e13c1 1831 /* Record the existence of this thread. */
e6ad66bd 1832 thread_id = current_event.dwThreadId;
c559d709 1833 th = windows_add_thread
7c7411bc 1834 (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0),
c559d709
JB
1835 current_event.u.CreateThread.hThread,
1836 current_event.u.CreateThread.lpThreadLocalBase,
1837 false /* main_thread_p */);
711e434b 1838
1e37c281
JM
1839 break;
1840
1841 case EXIT_THREAD_DEBUG_EVENT:
0c3d84be 1842 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1843 (unsigned) current_event.dwProcessId,
1844 (unsigned) current_event.dwThreadId,
1845 "EXIT_THREAD_DEBUG_EVENT"));
7c7411bc
TT
1846 windows_delete_thread (ptid_t (current_event.dwProcessId,
1847 current_event.dwThreadId, 0),
c559d709
JB
1848 current_event.u.ExitThread.dwExitCode,
1849 false /* main_thread_p */);
2eab46b1 1850 th = &dummy_thread_info;
1e37c281
JM
1851 break;
1852
1853 case CREATE_PROCESS_DEBUG_EVENT:
0c3d84be 1854 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1855 (unsigned) current_event.dwProcessId,
1856 (unsigned) current_event.dwThreadId,
1857 "CREATE_PROCESS_DEBUG_EVENT"));
700b351b 1858 CloseHandle (current_event.u.CreateProcessInfo.hFile);
dfe7f3ac 1859 if (++saw_create != 1)
bf25528d 1860 break;
1e37c281 1861
dfe7f3ac 1862 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
581e13c1 1863 /* Add the main thread. */
c559d709 1864 th = windows_add_thread
7c7411bc
TT
1865 (ptid_t (current_event.dwProcessId,
1866 current_event.dwThreadId, 0),
c559d709
JB
1867 current_event.u.CreateProcessInfo.hThread,
1868 current_event.u.CreateProcessInfo.lpThreadLocalBase,
1869 true /* main_thread_p */);
e6ad66bd 1870 thread_id = current_event.dwThreadId;
1e37c281
JM
1871 break;
1872
1873 case EXIT_PROCESS_DEBUG_EVENT:
0c3d84be 1874 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1875 (unsigned) current_event.dwProcessId,
1876 (unsigned) current_event.dwThreadId,
1877 "EXIT_PROCESS_DEBUG_EVENT"));
16d905e2
CF
1878 if (!windows_initialization_done)
1879 {
223ffa71 1880 target_terminal::ours ();
bc1e6c81 1881 target_mourn_inferior (inferior_ptid);
16d905e2
CF
1882 error (_("During startup program exited with code 0x%x."),
1883 (unsigned int) current_event.u.ExitProcess.dwExitCode);
1884 }
1885 else if (saw_create == 1)
1886 {
7c7411bc
TT
1887 windows_delete_thread (ptid_t (current_event.dwProcessId,
1888 current_event.dwThreadId, 0),
c559d709 1889 0, true /* main_thread_p */);
559e7e50
EZ
1890 DWORD exit_status = current_event.u.ExitProcess.dwExitCode;
1891 /* If the exit status looks like a fatal exception, but we
1892 don't recognize the exception's code, make the original
1893 exit status value available, to avoid losing
1894 information. */
1895 int exit_signal
1896 = WIFSIGNALED (exit_status) ? WTERMSIG (exit_status) : -1;
1897 if (exit_signal == -1)
1898 {
1899 ourstatus->kind = TARGET_WAITKIND_EXITED;
1900 ourstatus->value.integer = exit_status;
1901 }
1902 else
1903 {
1904 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1905 ourstatus->value.sig = gdb_signal_from_host (exit_signal);
1906 }
8ed5b76e 1907 thread_id = current_event.dwThreadId;
16d905e2 1908 }
8a892701 1909 break;
1e37c281
JM
1910
1911 case LOAD_DLL_DEBUG_EVENT:
0c3d84be 1912 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1913 (unsigned) current_event.dwProcessId,
1914 (unsigned) current_event.dwThreadId,
1915 "LOAD_DLL_DEBUG_EVENT"));
700b351b 1916 CloseHandle (current_event.u.LoadDll.hFile);
ea39ad35 1917 if (saw_create != 1 || ! windows_initialization_done)
dfe7f3ac 1918 break;
bf469271 1919 catch_errors (handle_load_dll);
450005e7
CF
1920 ourstatus->kind = TARGET_WAITKIND_LOADED;
1921 ourstatus->value.integer = 0;
ab4ee614 1922 thread_id = current_event.dwThreadId;
1e37c281
JM
1923 break;
1924
1925 case UNLOAD_DLL_DEBUG_EVENT:
0c3d84be 1926 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1927 (unsigned) current_event.dwProcessId,
1928 (unsigned) current_event.dwThreadId,
1929 "UNLOAD_DLL_DEBUG_EVENT"));
ea39ad35 1930 if (saw_create != 1 || ! windows_initialization_done)
dfe7f3ac 1931 break;
bf469271 1932 catch_errors (handle_unload_dll);
de1b3c3d
PA
1933 ourstatus->kind = TARGET_WAITKIND_LOADED;
1934 ourstatus->value.integer = 0;
ab4ee614 1935 thread_id = current_event.dwThreadId;
d3ff4a77 1936 break;
1e37c281
JM
1937
1938 case EXCEPTION_DEBUG_EVENT:
0c3d84be 1939 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1940 (unsigned) current_event.dwProcessId,
1941 (unsigned) current_event.dwThreadId,
1942 "EXCEPTION_DEBUG_EVENT"));
dfe7f3ac
CF
1943 if (saw_create != 1)
1944 break;
24cdb46e
РИ
1945 switch (handle_exception (ourstatus))
1946 {
1947 case HANDLE_EXCEPTION_UNHANDLED:
1948 default:
1949 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1950 break;
1951 case HANDLE_EXCEPTION_HANDLED:
1952 thread_id = current_event.dwThreadId;
1953 break;
1954 case HANDLE_EXCEPTION_IGNORED:
1955 continue_status = DBG_CONTINUE;
1956 break;
1957 }
1e37c281
JM
1958 break;
1959
581e13c1 1960 case OUTPUT_DEBUG_STRING_EVENT: /* Message from the kernel. */
0c3d84be 1961 DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
8a892701
CF
1962 (unsigned) current_event.dwProcessId,
1963 (unsigned) current_event.dwThreadId,
1964 "OUTPUT_DEBUG_STRING_EVENT"));
dfe7f3ac
CF
1965 if (saw_create != 1)
1966 break;
e6ad66bd 1967 thread_id = handle_output_debug_string (ourstatus);
1e37c281 1968 break;
9d3789f7 1969
1e37c281 1970 default:
dfe7f3ac
CF
1971 if (saw_create != 1)
1972 break;
0c3d84be 1973 printf_unfiltered ("gdb: kernel event for pid=%u tid=0x%x\n",
d50a0ce2
CV
1974 (unsigned) current_event.dwProcessId,
1975 (unsigned) current_event.dwThreadId);
1976 printf_unfiltered (" unknown event code %u\n",
1977 (unsigned) current_event.dwDebugEventCode);
1e37c281
JM
1978 break;
1979 }
1980
e6ad66bd 1981 if (!thread_id || saw_create != 1)
a244bdca 1982 {
0a4afda3
TT
1983 CHECK (windows_continue (continue_status, desired_stop_thread_id, 0));
1984 }
1985 else if (desired_stop_thread_id != -1 && desired_stop_thread_id != thread_id)
1986 {
1987 /* Pending stop. See the comment by the definition of
1988 "pending_stops" for details on why this is needed. */
1989 DEBUG_EVENTS (("get_windows_debug_event - "
1990 "unexpected stop in 0x%x (expecting 0x%x)\n",
1991 thread_id, desired_stop_thread_id));
1992
1993 if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
1994 && (current_event.u.Exception.ExceptionRecord.ExceptionCode
1995 == EXCEPTION_BREAKPOINT)
1996 && windows_initialization_done)
1997 {
28688adf
TT
1998 ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
1999 th = thread_rec (ptid, INVALIDATE_CONTEXT);
0a4afda3
TT
2000 th->stopped_at_software_breakpoint = true;
2001 }
2002 pending_stops.push_back ({thread_id, *ourstatus, current_event});
2003 thread_id = 0;
2004 CHECK (windows_continue (continue_status, desired_stop_thread_id, 0));
a244bdca 2005 }
450005e7 2006 else
9d3789f7 2007 {
7c7411bc 2008 inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
776704b9
JT
2009 current_thread = th;
2010 if (!current_thread)
28688adf 2011 current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT);
9d3789f7 2012 }
1e37c281
JM
2013
2014out:
e6ad66bd 2015 return thread_id;
1e37c281
JM
2016}
2017
2dc38344 2018/* Wait for interesting events to occur in the target process. */
f6ac5f3d
PA
2019ptid_t
2020windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
2021 int options)
24e60978 2022{
2dc38344 2023 int pid = -1;
39f77062 2024
24e60978
SC
2025 /* We loop when we get a non-standard exception rather than return
2026 with a SPURIOUS because resume can try and step or modify things,
3cee93ac 2027 which needs a current_thread->h. But some of these exceptions mark
24e60978 2028 the birth or death of threads, which mean that the current thread
581e13c1 2029 isn't necessarily what you think it is. */
24e60978
SC
2030
2031 while (1)
450005e7 2032 {
c57918b2 2033 int retval;
2b008701 2034
695de547
CF
2035 /* If the user presses Ctrl-c while the debugger is waiting
2036 for an event, he expects the debugger to interrupt his program
2037 and to get the prompt back. There are two possible situations:
2038
2039 - The debugger and the program do not share the console, in
2040 which case the Ctrl-c event only reached the debugger.
2041 In that case, the ctrl_c handler will take care of interrupting
581e13c1
MS
2042 the inferior. Note that this case is working starting with
2043 Windows XP. For Windows 2000, Ctrl-C should be pressed in the
695de547
CF
2044 inferior console.
2045
2046 - The debugger and the program share the same console, in which
2047 case both debugger and inferior will receive the Ctrl-c event.
2048 In that case the ctrl_c handler will ignore the event, as the
2049 Ctrl-c event generated inside the inferior will trigger the
2050 expected debug event.
2051
2052 FIXME: brobecker/2008-05-20: If the inferior receives the
2053 signal first and the delay until GDB receives that signal
2054 is sufficiently long, GDB can sometimes receive the SIGINT
2055 after we have unblocked the CTRL+C handler. This would
2056 lead to the debugger stopping prematurely while handling
2057 the new-thread event that comes with the handling of the SIGINT
2058 inside the inferior, and then stop again immediately when
2059 the user tries to resume the execution in the inferior.
2060 This is a classic race that we should try to fix one day. */
2061 SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
5b6d1e4f 2062 retval = get_windows_debug_event (pid, ourstatus);
695de547 2063 SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
c57918b2 2064
450005e7 2065 if (retval)
0a4afda3
TT
2066 {
2067 ptid_t result = ptid_t (current_event.dwProcessId, retval, 0);
2068
2069 if (current_thread != nullptr)
2070 {
2071 current_thread->stopped_at_software_breakpoint = false;
2072 if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
2073 && (current_event.u.Exception.ExceptionRecord.ExceptionCode
2074 == EXCEPTION_BREAKPOINT)
2075 && windows_initialization_done)
2076 current_thread->stopped_at_software_breakpoint = true;
2077 }
2078
2079 return result;
2080 }
450005e7
CF
2081 else
2082 {
2083 int detach = 0;
3cee93ac 2084
98bbd631
AC
2085 if (deprecated_ui_loop_hook != NULL)
2086 detach = deprecated_ui_loop_hook (0);
0714f9bf 2087
450005e7 2088 if (detach)
f6ac5f3d 2089 kill ();
450005e7
CF
2090 }
2091 }
24e60978
SC
2092}
2093
ea39ad35
JB
2094/* Iterate over all DLLs currently mapped by our inferior, and
2095 add them to our list of solibs. */
94481b8c
JB
2096
2097static void
ea39ad35 2098windows_add_all_dlls (void)
94481b8c 2099{
94481b8c
JB
2100 HMODULE dummy_hmodule;
2101 DWORD cb_needed;
2102 HMODULE *hmodules;
2103 int i;
2104
46f9f931
HD
2105#ifdef __x86_64__
2106 if (wow64_process)
2107 {
2108 if (EnumProcessModulesEx (current_process_handle, &dummy_hmodule,
2109 sizeof (HMODULE), &cb_needed,
2110 LIST_MODULES_32BIT) == 0)
2111 return;
2112 }
2113 else
2114#endif
2115 {
2116 if (EnumProcessModules (current_process_handle, &dummy_hmodule,
2117 sizeof (HMODULE), &cb_needed) == 0)
2118 return;
2119 }
94481b8c
JB
2120
2121 if (cb_needed < 1)
2122 return;
2123
2124 hmodules = (HMODULE *) alloca (cb_needed);
46f9f931
HD
2125#ifdef __x86_64__
2126 if (wow64_process)
2127 {
2128 if (EnumProcessModulesEx (current_process_handle, hmodules,
2129 cb_needed, &cb_needed,
2130 LIST_MODULES_32BIT) == 0)
2131 return;
2132 }
2133 else
2134#endif
2135 {
2136 if (EnumProcessModules (current_process_handle, hmodules,
2137 cb_needed, &cb_needed) == 0)
2138 return;
2139 }
94481b8c 2140
d503b685
HD
2141 char system_dir[__PMAX];
2142 char syswow_dir[__PMAX];
2143 size_t system_dir_len = 0;
ebea7626
HD
2144 bool convert_syswow_dir = false;
2145#ifdef __x86_64__
d503b685 2146 if (wow64_process)
ebea7626 2147#endif
d503b685 2148 {
ebea7626
HD
2149 /* This fails on 32bit Windows because it has no SysWOW64 directory,
2150 and in this case a path conversion isn't necessary. */
2151 UINT len = GetSystemWow64DirectoryA (syswow_dir, sizeof (syswow_dir));
2152 if (len > 0)
2153 {
2154 /* Check that we have passed a large enough buffer. */
2155 gdb_assert (len < sizeof (syswow_dir));
2156
2157 len = GetSystemDirectoryA (system_dir, sizeof (system_dir));
2158 /* Error check. */
2159 gdb_assert (len != 0);
2160 /* Check that we have passed a large enough buffer. */
2161 gdb_assert (len < sizeof (system_dir));
2162
2163 strcat (system_dir, "\\");
2164 strcat (syswow_dir, "\\");
2165 system_dir_len = strlen (system_dir);
2166
2167 convert_syswow_dir = true;
2168 }
2169
d503b685 2170 }
ea39ad35 2171 for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
94481b8c
JB
2172 {
2173 MODULEINFO mi;
774f74c2
PM
2174#ifdef __USEWIDE
2175 wchar_t dll_name[__PMAX];
d503b685 2176 char dll_name_mb[__PMAX];
774f74c2 2177#else
94481b8c 2178 char dll_name[__PMAX];
774f74c2 2179#endif
d503b685 2180 const char *name;
94481b8c
JB
2181 if (GetModuleInformation (current_process_handle, hmodules[i],
2182 &mi, sizeof (mi)) == 0)
2183 continue;
2184 if (GetModuleFileNameEx (current_process_handle, hmodules[i],
2185 dll_name, sizeof (dll_name)) == 0)
2186 continue;
774f74c2 2187#ifdef __USEWIDE
d503b685
HD
2188 wcstombs (dll_name_mb, dll_name, __PMAX);
2189 name = dll_name_mb;
774f74c2
PM
2190#else
2191 name = dll_name;
2192#endif
ebea7626 2193 /* Convert the DLL path of 32bit processes returned by
d503b685
HD
2194 GetModuleFileNameEx from the 64bit system directory to the
2195 32bit syswow64 directory if necessary. */
2196 std::string syswow_dll_path;
ebea7626 2197 if (convert_syswow_dir
d503b685
HD
2198 && strncasecmp (name, system_dir, system_dir_len) == 0
2199 && strchr (name + system_dir_len, '\\') == nullptr)
2200 {
2201 syswow_dll_path = syswow_dir;
2202 syswow_dll_path += name + system_dir_len;
2203 name = syswow_dll_path.c_str();
2204 }
ea39ad35
JB
2205
2206 solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
2207 solib_end = solib_end->next;
94481b8c
JB
2208 }
2209}
2210
9d3789f7 2211static void
dc05df57 2212do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
9d3789f7 2213{
fa4ba8da 2214 int i;
d6b48e9c 2215 struct inferior *inf;
9d3789f7 2216
a493e3e2 2217 last_sig = GDB_SIGNAL_0;
9d3789f7
CF
2218 event_count = 0;
2219 exception_count = 0;
bf25528d 2220 open_process_used = 0;
fa4ba8da 2221 debug_registers_changed = 0;
dfe7f3ac 2222 debug_registers_used = 0;
fa4ba8da
PM
2223 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
2224 dr[i] = 0;
10325bc5 2225#ifdef __CYGWIN__
de1b3c3d 2226 cygwin_load_start = cygwin_load_end = 0;
10325bc5 2227#endif
9d3789f7
CF
2228 current_event.dwProcessId = pid;
2229 memset (&current_event, 0, sizeof (current_event));
6a3cb8e8
PA
2230 if (!target_is_pushed (ops))
2231 push_target (ops);
cb851954 2232 disable_breakpoints_in_shlibs ();
dc05df57 2233 windows_clear_solib ();
88056fbb 2234 clear_proceed_status (0);
9d3789f7
CF
2235 init_wait_for_inferior ();
2236
46f9f931
HD
2237#ifdef __x86_64__
2238 ignore_first_breakpoint = !attaching && wow64_process;
2239
2240 if (!wow64_process)
2241 {
2242 windows_set_context_register_offsets (amd64_mappings);
2243 windows_set_segment_register_p (amd64_windows_segment_register_p);
2244 }
2245 else
2246#endif
2247 {
2248 windows_set_context_register_offsets (i386_mappings);
2249 windows_set_segment_register_p (i386_windows_segment_register_p);
2250 }
2251
6c95b8df
PA
2252 inf = current_inferior ();
2253 inferior_appeared (inf, pid);
181e7f93 2254 inf->attach_flag = attaching;
7f9f62ba 2255
9f9d052e
PM
2256 /* Make the new process the current inferior, so terminal handling
2257 can rely on it. When attaching, we don't know about any thread
2258 id here, but that's OK --- nothing should be referencing the
dc05df57 2259 current thread until we report an event out of windows_wait. */
f2907e49 2260 inferior_ptid = ptid_t (pid);
9f9d052e 2261
223ffa71
TT
2262 target_terminal::init ();
2263 target_terminal::inferior ();
9d3789f7 2264
16d905e2 2265 windows_initialization_done = 0;
c72f45d1 2266
9d3789f7
CF
2267 while (1)
2268 {
c72f45d1
PA
2269 struct target_waitstatus status;
2270
f6ac5f3d 2271 ops->wait (minus_one_ptid, &status, 0);
c72f45d1
PA
2272
2273 /* Note windows_wait returns TARGET_WAITKIND_SPURIOUS for thread
2274 events. */
2275 if (status.kind != TARGET_WAITKIND_LOADED
2276 && status.kind != TARGET_WAITKIND_SPURIOUS)
9d3789f7 2277 break;
c72f45d1 2278
f6ac5f3d 2279 ops->resume (minus_one_ptid, 0, GDB_SIGNAL_0);
9d3789f7 2280 }
eff8332b 2281
ea39ad35 2282 /* Now that the inferior has been started and all DLLs have been mapped,
3be75f87
JB
2283 we can iterate over all DLLs and load them in.
2284
2285 We avoid doing it any earlier because, on certain versions of Windows,
2286 LOAD_DLL_DEBUG_EVENTs are sometimes not complete. In particular,
2287 we have seen on Windows 8.1 that the ntdll.dll load event does not
2288 include the DLL name, preventing us from creating an associated SO.
2289 A possible explanation is that ntdll.dll might be mapped before
2290 the SO info gets created by the Windows system -- ntdll.dll is
2291 the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
2292 do not seem to suffer from that problem.
2293
2294 Rather than try to work around this sort of issue, it is much
2295 simpler to just ignore DLL load/unload events during the startup
2296 phase, and then process them all in one batch now. */
ea39ad35 2297 windows_add_all_dlls ();
94481b8c 2298
16d905e2 2299 windows_initialization_done = 1;
9d3789f7
CF
2300 return;
2301}
2302
616a9dc4
CV
2303/* Try to set or remove a user privilege to the current process. Return -1
2304 if that fails, the previous setting of that privilege otherwise.
2305
2306 This code is copied from the Cygwin source code and rearranged to allow
2307 dynamically loading of the needed symbols from advapi32 which is only
581e13c1 2308 available on NT/2K/XP. */
616a9dc4
CV
2309static int
2310set_process_privilege (const char *privilege, BOOL enable)
2311{
616a9dc4
CV
2312 HANDLE token_hdl = NULL;
2313 LUID restore_priv;
2314 TOKEN_PRIVILEGES new_priv, orig_priv;
2315 int ret = -1;
2316 DWORD size;
2317
616a9dc4
CV
2318 if (!OpenProcessToken (GetCurrentProcess (),
2319 TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
2320 &token_hdl))
2321 goto out;
2322
418c6cb3 2323 if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
616a9dc4
CV
2324 goto out;
2325
2326 new_priv.PrivilegeCount = 1;
2327 new_priv.Privileges[0].Luid = restore_priv;
2328 new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
2329
2330 if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
295732ea 2331 sizeof orig_priv, &orig_priv, &size))
616a9dc4
CV
2332 goto out;
2333#if 0
2334 /* Disabled, otherwise every `attach' in an unprivileged user session
2335 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
581e13c1 2336 windows_attach(). */
616a9dc4 2337 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
581e13c1 2338 be enabled. GetLastError () returns an correct error code, though. */
616a9dc4
CV
2339 if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
2340 goto out;
2341#endif
2342
2343 ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
2344
2345out:
2346 if (token_hdl)
2347 CloseHandle (token_hdl);
2348
2349 return ret;
2350}
2351
02cc9f49 2352/* Attach to process PID, then initialize for debugging it. */
f6ac5f3d
PA
2353
2354void
2355windows_nat_target::attach (const char *args, int from_tty)
24e60978
SC
2356{
2357 BOOL ok;
559e75c0 2358 DWORD pid;
24e60978 2359
74164c56 2360 pid = parse_pid_to_attach (args);
24e60978 2361
616a9dc4
CV
2362 if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
2363 {
2364 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
581e13c1
MS
2365 printf_unfiltered ("This can cause attach to "
2366 "fail on Windows NT/2K/XP\n");
616a9dc4
CV
2367 }
2368
dc05df57 2369 windows_init_thread_list ();
9d3789f7 2370 ok = DebugActiveProcess (pid);
91a175b3 2371 saw_create = 0;
24e60978 2372
10325bc5 2373#ifdef __CYGWIN__
24e60978 2374 if (!ok)
baa93fa6 2375 {
581e13c1 2376 /* Try fall back to Cygwin pid. */
baa93fa6
CF
2377 pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
2378
2379 if (pid > 0)
2380 ok = DebugActiveProcess (pid);
10325bc5
PA
2381 }
2382#endif
baa93fa6 2383
10325bc5 2384 if (!ok)
c9739b6a
TT
2385 error (_("Can't attach to process %u (error %u)"),
2386 (unsigned) pid, (unsigned) GetLastError ());
24e60978 2387
2b008701 2388 DebugSetProcessKillOnExit (FALSE);
3ade5333 2389
24e60978
SC
2390 if (from_tty)
2391 {
d9fa87f4 2392 const char *exec_file = get_exec_file (0);
24e60978
SC
2393
2394 if (exec_file)
2395 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
a068643d 2396 target_pid_to_str (ptid_t (pid)).c_str ());
24e60978
SC
2397 else
2398 printf_unfiltered ("Attaching to %s\n",
a068643d 2399 target_pid_to_str (ptid_t (pid)).c_str ());
24e60978
SC
2400 }
2401
46f9f931
HD
2402#ifdef __x86_64__
2403 HANDLE h = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, pid);
2404 if (h != NULL)
2405 {
2406 BOOL wow64;
2407 if (IsWow64Process (h, &wow64))
2408 wow64_process = wow64;
2409 CloseHandle (h);
2410 }
2411#endif
2412
f6ac5f3d 2413 do_initial_windows_stuff (this, pid, 1);
223ffa71 2414 target_terminal::ours ();
24e60978
SC
2415}
2416
f6ac5f3d
PA
2417void
2418windows_nat_target::detach (inferior *inf, int from_tty)
24e60978 2419{
02cc9f49
CV
2420 int detached = 1;
2421
8473b447 2422 ptid_t ptid = minus_one_ptid;
f6ac5f3d 2423 resume (ptid, 0, GDB_SIGNAL_0);
96998ce7 2424
2b008701
CF
2425 if (!DebugActiveProcessStop (current_event.dwProcessId))
2426 {
d50a0ce2
CV
2427 error (_("Can't detach process %u (error %u)"),
2428 (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
2b008701 2429 detached = 0;
02cc9f49 2430 }
2b008701
CF
2431 DebugSetProcessKillOnExit (FALSE);
2432
02cc9f49 2433 if (detached && from_tty)
24e60978 2434 {
a121b7c1 2435 const char *exec_file = get_exec_file (0);
24e60978
SC
2436 if (exec_file == 0)
2437 exec_file = "";
d50a0ce2
CV
2438 printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
2439 (unsigned) current_event.dwProcessId);
24e60978 2440 }
7f9f62ba 2441
df7e5265 2442 x86_cleanup_dregs ();
39f77062 2443 inferior_ptid = null_ptid;
b7a08269 2444 detach_inferior (inf);
7f9f62ba 2445
f6ac5f3d 2446 maybe_unpush_target ();
24e60978
SC
2447}
2448
47f7ffdb
JB
2449/* Try to determine the executable filename.
2450
2451 EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
2452
2453 Upon success, the filename is stored inside EXE_NAME_RET, and
2454 this function returns nonzero.
2455
2456 Otherwise, this function returns zero and the contents of
2457 EXE_NAME_RET is undefined. */
2458
2459static int
2460windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len)
2461{
2462 DWORD len;
2463 HMODULE dh_buf;
2464 DWORD cbNeeded;
2465
2466 cbNeeded = 0;
46f9f931
HD
2467#ifdef __x86_64__
2468 if (wow64_process)
2469 {
2470 if (!EnumProcessModulesEx (current_process_handle, &dh_buf,
2471 sizeof (HMODULE), &cbNeeded,
2472 LIST_MODULES_32BIT) || !cbNeeded)
2473 return 0;
2474 }
2475 else
2476#endif
2477 {
2478 if (!EnumProcessModules (current_process_handle, &dh_buf,
2479 sizeof (HMODULE), &cbNeeded) || !cbNeeded)
2480 return 0;
2481 }
47f7ffdb
JB
2482
2483 /* We know the executable is always first in the list of modules,
2484 which we just fetched. So no need to fetch more. */
2485
2486#ifdef __CYGWIN__
2487 {
2488 /* Cygwin prefers that the path be in /x/y/z format, so extract
2489 the filename into a temporary buffer first, and then convert it
2490 to POSIX format into the destination buffer. */
0ae534d2 2491 cygwin_buf_t *pathbuf = (cygwin_buf_t *) alloca (exe_name_max_len * sizeof (cygwin_buf_t));
47f7ffdb
JB
2492
2493 len = GetModuleFileNameEx (current_process_handle,
2494 dh_buf, pathbuf, exe_name_max_len);
2495 if (len == 0)
2496 error (_("Error getting executable filename: %u."),
2497 (unsigned) GetLastError ());
2498 if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, exe_name_ret,
2499 exe_name_max_len) < 0)
2500 error (_("Error converting executable filename to POSIX: %d."), errno);
2501 }
2502#else
2503 len = GetModuleFileNameEx (current_process_handle,
2504 dh_buf, exe_name_ret, exe_name_max_len);
2505 if (len == 0)
2506 error (_("Error getting executable filename: %u."),
2507 (unsigned) GetLastError ());
2508#endif
2509
2510 return 1; /* success */
2511}
2512
2513/* The pid_to_exec_file target_ops method for this platform. */
2514
f6ac5f3d
PA
2515char *
2516windows_nat_target::pid_to_exec_file (int pid)
47216e51 2517{
b3c613f2 2518 static char path[__PMAX];
10325bc5 2519#ifdef __CYGWIN__
581e13c1 2520 /* Try to find exe name as symlink target of /proc/<pid>/exe. */
33605d39
CF
2521 int nchars;
2522 char procexe[sizeof ("/proc/4294967295/exe")];
08850b56
PM
2523
2524 xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
33605d39
CF
2525 nchars = readlink (procexe, path, sizeof(path));
2526 if (nchars > 0 && nchars < sizeof (path))
47216e51 2527 {
33605d39
CF
2528 path[nchars] = '\0'; /* Got it */
2529 return path;
47216e51 2530 }
10325bc5
PA
2531#endif
2532
33605d39 2533 /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
581e13c1 2534 of gdb, or we're trying to debug a non-Cygwin windows executable. */
47f7ffdb 2535 if (!windows_get_exec_module_filename (path, sizeof (path)))
33605d39
CF
2536 path[0] = '\0';
2537
2538 return path;
47216e51
CV
2539}
2540
24e60978
SC
2541/* Print status information about what we're accessing. */
2542
f6ac5f3d
PA
2543void
2544windows_nat_target::files_info ()
24e60978 2545{
181e7f93
PA
2546 struct inferior *inf = current_inferior ();
2547
24e60978 2548 printf_unfiltered ("\tUsing the running image of %s %s.\n",
181e7f93 2549 inf->attach_flag ? "attached" : "child",
a068643d 2550 target_pid_to_str (inferior_ptid).c_str ());
24e60978
SC
2551}
2552
cd44747c
PM
2553/* Modify CreateProcess parameters for use of a new separate console.
2554 Parameters are:
2555 *FLAGS: DWORD parameter for general process creation flags.
2556 *SI: STARTUPINFO structure, for which the console window size and
2557 console buffer size is filled in if GDB is running in a console.
2558 to create the new console.
2559 The size of the used font is not available on all versions of
2560 Windows OS. Furthermore, the current font might not be the default
2561 font, but this is still better than before.
2562 If the windows and buffer sizes are computed,
2563 SI->DWFLAGS is changed so that this information is used
2564 by CreateProcess function. */
2565
2566static void
2567windows_set_console_info (STARTUPINFO *si, DWORD *flags)
2568{
2569 HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
2570 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
2571
2572 if (hconsole != INVALID_HANDLE_VALUE)
2573 {
2574 CONSOLE_SCREEN_BUFFER_INFO sbinfo;
2575 COORD font_size;
2576 CONSOLE_FONT_INFO cfi;
2577
2578 GetCurrentConsoleFont (hconsole, FALSE, &cfi);
2579 font_size = GetConsoleFontSize (hconsole, cfi.nFont);
2580 GetConsoleScreenBufferInfo(hconsole, &sbinfo);
2581 si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
2582 si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
2583 if (font_size.X)
2584 si->dwXSize *= font_size.X;
2585 else
2586 si->dwXSize *= 8;
2587 if (font_size.Y)
2588 si->dwYSize *= font_size.Y;
2589 else
2590 si->dwYSize *= 12;
2591 si->dwXCountChars = sbinfo.dwSize.X;
2592 si->dwYCountChars = sbinfo.dwSize.Y;
2593 si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
2594 }
2595 *flags |= CREATE_NEW_CONSOLE;
2596}
2597
c93dbcba
EZ
2598#ifndef __CYGWIN__
2599/* Function called by qsort to sort environment strings. */
2600
2601static int
2602envvar_cmp (const void *a, const void *b)
2603{
2604 const char **p = (const char **) a;
2605 const char **q = (const char **) b;
2606 return strcasecmp (*p, *q);
2607}
2608#endif
2609
b7ff339d
CV
2610#ifdef __CYGWIN__
2611static void
2612clear_win32_environment (char **env)
2613{
2614 int i;
2615 size_t len;
2616 wchar_t *copy = NULL, *equalpos;
2617
2618 for (i = 0; env[i] && *env[i]; i++)
2619 {
2620 len = mbstowcs (NULL, env[i], 0) + 1;
2621 copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2622 mbstowcs (copy, env[i], len);
2623 equalpos = wcschr (copy, L'=');
2624 if (equalpos)
2625 *equalpos = L'\0';
2626 SetEnvironmentVariableW (copy, NULL);
2627 }
2628 xfree (copy);
2629}
2630#endif
2631
8ba42bc5
EZ
2632#ifndef __CYGWIN__
2633
2634/* Redirection of inferior I/O streams for native MS-Windows programs.
2635 Unlike on Unix, where this is handled by invoking the inferior via
2636 the shell, on MS-Windows we need to emulate the cmd.exe shell.
2637
2638 The official documentation of the cmd.exe redirection features is here:
2639
2640 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx
2641
2642 (That page talks about Windows XP, but there's no newer
2643 documentation, so we assume later versions of cmd.exe didn't change
2644 anything.)
2645
2646 Caveat: the documentation on that page seems to include a few lies.
2647 For example, it describes strange constructs 1<&2 and 2<&1, which
2648 seem to work only when 1>&2 resp. 2>&1 would make sense, and so I
2649 think the cmd.exe parser of the redirection symbols simply doesn't
2650 care about the < vs > distinction in these cases. Therefore, the
2651 supported features are explicitly documented below.
2652
2653 The emulation below aims at supporting all the valid use cases
2654 supported by cmd.exe, which include:
2655
2656 < FILE redirect standard input from FILE
2657 0< FILE redirect standard input from FILE
2658 <&N redirect standard input from file descriptor N
2659 0<&N redirect standard input from file descriptor N
2660 > FILE redirect standard output to FILE
2661 >> FILE append standard output to FILE
2662 1>> FILE append standard output to FILE
2663 >&N redirect standard output to file descriptor N
2664 1>&N redirect standard output to file descriptor N
2665 >>&N append standard output to file descriptor N
2666 1>>&N append standard output to file descriptor N
2667 2> FILE redirect standard error to FILE
2668 2>> FILE append standard error to FILE
2669 2>&N redirect standard error to file descriptor N
2670 2>>&N append standard error to file descriptor N
2671
2672 Note that using N > 2 in the above construct is supported, but
2673 requires that the corresponding file descriptor be open by some
2674 means elsewhere or outside GDB. Also note that using ">&0" or
2675 "<&2" will generally fail, because the file descriptor redirected
2676 from is normally open in an incompatible mode (e.g., FD 0 is open
2677 for reading only). IOW, use of such tricks is not recommended;
2678 you are on your own.
2679
2680 We do NOT support redirection of file descriptors above 2, as in
2681 "3>SOME-FILE", because MinGW compiled programs don't (supporting
2682 that needs special handling in the startup code that MinGW
2683 doesn't have). Pipes are also not supported.
2684
2685 As for invalid use cases, where the redirection contains some
2686 error, the emulation below will detect that and produce some
2687 error and/or failure. But the behavior in those cases is not
2688 bug-for-bug compatible with what cmd.exe does in those cases.
2689 That's because what cmd.exe does then is not well defined, and
2690 seems to be a side effect of the cmd.exe parsing of the command
2691 line more than anything else. For example, try redirecting to an
2692 invalid file name, as in "> foo:bar".
2693
2694 There are also minor syntactic deviations from what cmd.exe does
2695 in some corner cases. For example, it doesn't support the likes
2696 of "> &foo" to mean redirect to file named literally "&foo"; we
2697 do support that here, because that, too, sounds like some issue
2698 with the cmd.exe parser. Another nicety is that we support
2699 redirection targets that use file names with forward slashes,
2700 something cmd.exe doesn't -- this comes in handy since GDB
2701 file-name completion can be used when typing the command line for
2702 the inferior. */
2703
2704/* Support routines for redirecting standard handles of the inferior. */
2705
2706/* Parse a single redirection spec, open/duplicate the specified
2707 file/fd, and assign the appropriate value to one of the 3 standard
2708 file descriptors. */
2709static int
2710redir_open (const char *redir_string, int *inp, int *out, int *err)
2711{
2712 int *fd, ref_fd = -2;
2713 int mode;
2714 const char *fname = redir_string + 1;
2715 int rc = *redir_string;
2716
2717 switch (rc)
2718 {
2719 case '0':
2720 fname++;
2721 /* FALLTHROUGH */
2722 case '<':
2723 fd = inp;
2724 mode = O_RDONLY;
2725 break;
2726 case '1': case '2':
2727 fname++;
2728 /* FALLTHROUGH */
2729 case '>':
2730 fd = (rc == '2') ? err : out;
2731 mode = O_WRONLY | O_CREAT;
2732 if (*fname == '>')
2733 {
2734 fname++;
2735 mode |= O_APPEND;
2736 }
2737 else
2738 mode |= O_TRUNC;
2739 break;
2740 default:
2741 return -1;
2742 }
2743
2744 if (*fname == '&' && '0' <= fname[1] && fname[1] <= '9')
2745 {
2746 /* A reference to a file descriptor. */
2747 char *fdtail;
2748 ref_fd = (int) strtol (fname + 1, &fdtail, 10);
2749 if (fdtail > fname + 1 && *fdtail == '\0')
2750 {
2751 /* Don't allow redirection when open modes are incompatible. */
2752 if ((ref_fd == 0 && (fd == out || fd == err))
2753 || ((ref_fd == 1 || ref_fd == 2) && fd == inp))
2754 {
2755 errno = EPERM;
2756 return -1;
2757 }
2758 if (ref_fd == 0)
2759 ref_fd = *inp;
2760 else if (ref_fd == 1)
2761 ref_fd = *out;
2762 else if (ref_fd == 2)
2763 ref_fd = *err;
2764 }
2765 else
2766 {
2767 errno = EBADF;
2768 return -1;
2769 }
2770 }
2771 else
2772 fname++; /* skip the separator space */
2773 /* If the descriptor is already open, close it. This allows
2774 multiple specs of redirections for the same stream, which is
2775 somewhat nonsensical, but still valid and supported by cmd.exe.
2776 (But cmd.exe only opens a single file in this case, the one
2777 specified by the last redirection spec on the command line.) */
2778 if (*fd >= 0)
2779 _close (*fd);
2780 if (ref_fd == -2)
2781 {
2782 *fd = _open (fname, mode, _S_IREAD | _S_IWRITE);
2783 if (*fd < 0)
2784 return -1;
2785 }
2786 else if (ref_fd == -1)
2787 *fd = -1; /* reset to default destination */
2788 else
2789 {
2790 *fd = _dup (ref_fd);
2791 if (*fd < 0)
2792 return -1;
2793 }
2794 /* _open just sets a flag for O_APPEND, which won't be passed to the
2795 inferior, so we need to actually move the file pointer. */
2796 if ((mode & O_APPEND) != 0)
2797 _lseek (*fd, 0L, SEEK_END);
2798 return 0;
2799}
2800
2801/* Canonicalize a single redirection spec and set up the corresponding
2802 file descriptor as specified. */
2803static int
2804redir_set_redirection (const char *s, int *inp, int *out, int *err)
2805{
2806 char buf[__PMAX + 2 + 5]; /* extra space for quotes & redirection string */
2807 char *d = buf;
2808 const char *start = s;
2809 int quote = 0;
2810
2811 *d++ = *s++; /* copy the 1st character, < or > or a digit */
2812 if ((*start == '>' || *start == '1' || *start == '2')
2813 && *s == '>')
2814 {
2815 *d++ = *s++;
2816 if (*s == '>' && *start != '>')
2817 *d++ = *s++;
2818 }
2819 else if (*start == '0' && *s == '<')
2820 *d++ = *s++;
2821 /* cmd.exe recognizes "&N" only immediately after the redirection symbol. */
2822 if (*s != '&')
2823 {
2824 while (isspace (*s)) /* skip whitespace before file name */
2825 s++;
2826 *d++ = ' '; /* separate file name with a single space */
2827 }
2828
2829 /* Copy the file name. */
2830 while (*s)
2831 {
2832 /* Remove quoting characters from the file name in buf[]. */
2833 if (*s == '"') /* could support '..' quoting here */
2834 {
2835 if (!quote)
2836 quote = *s++;
2837 else if (*s == quote)
2838 {
2839 quote = 0;
2840 s++;
2841 }
2842 else
2843 *d++ = *s++;
2844 }
2845 else if (*s == '\\')
2846 {
2847 if (s[1] == '"') /* could support '..' here */
2848 s++;
2849 *d++ = *s++;
2850 }
2851 else if (isspace (*s) && !quote)
2852 break;
2853 else
2854 *d++ = *s++;
2855 if (d - buf >= sizeof (buf) - 1)
2856 {
2857 errno = ENAMETOOLONG;
2858 return 0;
2859 }
2860 }
2861 *d = '\0';
2862
2863 /* Windows doesn't allow redirection characters in file names, so we
2864 can bail out early if they use them, or if there's no target file
2865 name after the redirection symbol. */
2866 if (d[-1] == '>' || d[-1] == '<')
2867 {
2868 errno = ENOENT;
2869 return 0;
2870 }
2871 if (redir_open (buf, inp, out, err) == 0)
2872 return s - start;
2873 return 0;
2874}
2875
2876/* Parse the command line for redirection specs and prepare the file
2877 descriptors for the 3 standard streams accordingly. */
2878static bool
2879redirect_inferior_handles (const char *cmd_orig, char *cmd,
2880 int *inp, int *out, int *err)
2881{
2882 const char *s = cmd_orig;
2883 char *d = cmd;
2884 int quote = 0;
2885 bool retval = false;
2886
2887 while (isspace (*s))
2888 *d++ = *s++;
2889
2890 while (*s)
2891 {
2892 if (*s == '"') /* could also support '..' quoting here */
2893 {
2894 if (!quote)
2895 quote = *s;
2896 else if (*s == quote)
2897 quote = 0;
2898 }
2899 else if (*s == '\\')
2900 {
2901 if (s[1] == '"') /* escaped quote char */
2902 s++;
2903 }
2904 else if (!quote)
2905 {
2906 /* Process a single redirection candidate. */
2907 if (*s == '<' || *s == '>'
2908 || ((*s == '1' || *s == '2') && s[1] == '>')
2909 || (*s == '0' && s[1] == '<'))
2910 {
2911 int skip = redir_set_redirection (s, inp, out, err);
2912
2913 if (skip <= 0)
2914 return false;
2915 retval = true;
2916 s += skip;
2917 }
2918 }
2919 if (*s)
2920 *d++ = *s++;
2921 }
2922 *d = '\0';
2923 return retval;
2924}
2925#endif /* !__CYGWIN__ */
2926
dc05df57 2927/* Start an inferior windows child process and sets inferior_ptid to its pid.
24e60978
SC
2928 EXEC_FILE is the file to run.
2929 ALLARGS is a string containing the arguments to the program.
2930 ENV is the environment vector to pass. Errors reported with error(). */
2931
f6ac5f3d
PA
2932void
2933windows_nat_target::create_inferior (const char *exec_file,
2934 const std::string &origallargs,
2935 char **in_env, int from_tty)
24e60978 2936{
b3c613f2 2937 STARTUPINFO si;
41b4aadc 2938#ifdef __CYGWIN__
b3c613f2
CF
2939 cygwin_buf_t real_path[__PMAX];
2940 cygwin_buf_t shell[__PMAX]; /* Path to shell */
d092c5a2 2941 cygwin_buf_t infcwd[__PMAX];
d0d0ab16 2942 const char *sh;
b3c613f2
CF
2943 cygwin_buf_t *toexec;
2944 cygwin_buf_t *cygallargs;
2945 cygwin_buf_t *args;
b7ff339d
CV
2946 char **old_env = NULL;
2947 PWCHAR w32_env;
d0d0ab16 2948 size_t len;
2becadee
CF
2949 int tty;
2950 int ostdin, ostdout, ostderr;
8ba42bc5 2951#else /* !__CYGWIN__ */
b3c613f2 2952 char shell[__PMAX]; /* Path to shell */
5430098f 2953 const char *toexec;
8ba42bc5
EZ
2954 char *args, *allargs_copy;
2955 size_t args_len, allargs_len;
2956 int fd_inp = -1, fd_out = -1, fd_err = -1;
2957 HANDLE tty = INVALID_HANDLE_VALUE;
8ba42bc5 2958 bool redirected = false;
c93dbcba
EZ
2959 char *w32env;
2960 char *temp;
2961 size_t envlen;
2962 int i;
2963 size_t envsize;
2964 char **env;
8ba42bc5 2965#endif /* !__CYGWIN__ */
096c92dd 2966 const char *allargs = origallargs.c_str ();
d0d0ab16
CV
2967 PROCESS_INFORMATION pi;
2968 BOOL ret;
2969 DWORD flags = 0;
3cb3b8df 2970 const char *inferior_io_terminal = get_inferior_io_terminal ();
24e60978
SC
2971
2972 if (!exec_file)
8a3fe4f8 2973 error (_("No executable specified, use `target exec'."));
24e60978 2974
d092c5a2
SDJ
2975 const char *inferior_cwd = get_inferior_cwd ();
2976 std::string expanded_infcwd;
2977 if (inferior_cwd != NULL)
2978 {
2979 expanded_infcwd = gdb_tilde_expand (inferior_cwd);
2980 /* Mirror slashes on inferior's cwd. */
2981 std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
2982 '/', '\\');
2983 inferior_cwd = expanded_infcwd.c_str ();
2984 }
2985
24e60978
SC
2986 memset (&si, 0, sizeof (si));
2987 si.cb = sizeof (si);
2988
d0d0ab16
CV
2989 if (new_group)
2990 flags |= CREATE_NEW_PROCESS_GROUP;
2991
2992 if (new_console)
cd44747c 2993 windows_set_console_info (&si, &flags);
d0d0ab16 2994
10325bc5 2995#ifdef __CYGWIN__
349b409f 2996 if (!useshell)
dfe7f3ac 2997 {
d0d0ab16
CV
2998 flags |= DEBUG_ONLY_THIS_PROCESS;
2999 if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
b3c613f2 3000 __PMAX * sizeof (cygwin_buf_t)) < 0)
d0d0ab16 3001 error (_("Error starting executable: %d"), errno);
dfe7f3ac 3002 toexec = real_path;
b3c613f2 3003#ifdef __USEWIDE
d0d0ab16
CV
3004 len = mbstowcs (NULL, allargs, 0) + 1;
3005 if (len == (size_t) -1)
3006 error (_("Error starting executable: %d"), errno);
3007 cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
3008 mbstowcs (cygallargs, allargs, len);
8ba42bc5 3009#else /* !__USEWIDE */
60c5c021 3010 cygallargs = allargs;
b3c613f2 3011#endif
dfe7f3ac
CF
3012 }
3013 else
3014 {
974e6844 3015 sh = get_shell ();
b3c613f2 3016 if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
d0d0ab16 3017 error (_("Error starting executable via shell: %d"), errno);
b3c613f2 3018#ifdef __USEWIDE
d0d0ab16
CV
3019 len = sizeof (L" -c 'exec '") + mbstowcs (NULL, exec_file, 0)
3020 + mbstowcs (NULL, allargs, 0) + 2;
3021 cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
3022 swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
8ba42bc5 3023#else /* !__USEWIDE */
08850b56
PM
3024 len = (sizeof (" -c 'exec '") + strlen (exec_file)
3025 + strlen (allargs) + 2);
3026 cygallargs = (char *) alloca (len);
3027 xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
8ba42bc5 3028#endif /* __USEWIDE */
dfe7f3ac 3029 toexec = shell;
d0d0ab16 3030 flags |= DEBUG_PROCESS;
dfe7f3ac 3031 }
b3c613f2 3032
d092c5a2
SDJ
3033 if (inferior_cwd != NULL
3034 && cygwin_conv_path (CCP_POSIX_TO_WIN_W, inferior_cwd,
3035 infcwd, strlen (inferior_cwd)) < 0)
3036 error (_("Error converting inferior cwd: %d"), errno);
3037
b3c613f2
CF
3038#ifdef __USEWIDE
3039 args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
3040 * sizeof (wchar_t));
d0d0ab16
CV
3041 wcscpy (args, toexec);
3042 wcscat (args, L" ");
3043 wcscat (args, cygallargs);
8ba42bc5 3044#else /* !__USEWIDE */
b3c613f2
CF
3045 args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
3046 strcpy (args, toexec);
3047 strcat (args, " ");
3048 strcat (args, cygallargs);
8ba42bc5 3049#endif /* !__USEWIDE */
b3c613f2 3050
b7ff339d
CV
3051#ifdef CW_CVT_ENV_TO_WINENV
3052 /* First try to create a direct Win32 copy of the POSIX environment. */
3053 w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
3054 if (w32_env != (PWCHAR) -1)
3055 flags |= CREATE_UNICODE_ENVIRONMENT;
3056 else
3057 /* If that fails, fall back to old method tweaking GDB's environment. */
8ba42bc5 3058#endif /* CW_CVT_ENV_TO_WINENV */
b7ff339d
CV
3059 {
3060 /* Reset all Win32 environment variables to avoid leftover on next run. */
3061 clear_win32_environment (environ);
3062 /* Prepare the environment vars for CreateProcess. */
3063 old_env = environ;
3064 environ = in_env;
3065 cygwin_internal (CW_SYNC_WINENV);
3066 w32_env = NULL;
3067 }
1750a5ef 3068
2becadee
CF
3069 if (!inferior_io_terminal)
3070 tty = ostdin = ostdout = ostderr = -1;
3071 else
3072 {
3073 tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
3074 if (tty < 0)
3075 {
3076 print_sys_errmsg (inferior_io_terminal, errno);
3077 ostdin = ostdout = ostderr = -1;
3078 }
3079 else
3080 {
3081 ostdin = dup (0);
3082 ostdout = dup (1);
3083 ostderr = dup (2);
3084 dup2 (tty, 0);
3085 dup2 (tty, 1);
3086 dup2 (tty, 2);
3087 }
3088 }
d0d0ab16
CV
3089
3090 windows_init_thread_list ();
b3c613f2
CF
3091 ret = CreateProcess (0,
3092 args, /* command line */
3093 NULL, /* Security */
3094 NULL, /* thread */
3095 TRUE, /* inherit handles */
3096 flags, /* start flags */
b7ff339d 3097 w32_env, /* environment */
d092c5a2
SDJ
3098 inferior_cwd != NULL ? infcwd : NULL, /* current
3099 directory */
b3c613f2
CF
3100 &si,
3101 &pi);
b7ff339d
CV
3102 if (w32_env)
3103 /* Just free the Win32 environment, if it could be created. */
3104 free (w32_env);
3105 else
3106 {
3107 /* Reset all environment variables to avoid leftover on next run. */
3108 clear_win32_environment (in_env);
3109 /* Restore normal GDB environment variables. */
3110 environ = old_env;
3111 cygwin_internal (CW_SYNC_WINENV);
3112 }
3113
d0d0ab16
CV
3114 if (tty >= 0)
3115 {
6af79d7b 3116 ::close (tty);
d0d0ab16
CV
3117 dup2 (ostdin, 0);
3118 dup2 (ostdout, 1);
3119 dup2 (ostderr, 2);
6af79d7b
JT
3120 ::close (ostdin);
3121 ::close (ostdout);
3122 ::close (ostderr);
d0d0ab16 3123 }
8ba42bc5
EZ
3124#else /* !__CYGWIN__ */
3125 allargs_len = strlen (allargs);
3126 allargs_copy = strcpy ((char *) alloca (allargs_len + 1), allargs);
3127 if (strpbrk (allargs_copy, "<>") != NULL)
3128 {
3129 int e = errno;
3130 errno = 0;
3131 redirected =
3132 redirect_inferior_handles (allargs, allargs_copy,
3133 &fd_inp, &fd_out, &fd_err);
3134 if (errno)
6d91ce9a 3135 warning (_("Error in redirection: %s."), safe_strerror (errno));
8ba42bc5
EZ
3136 else
3137 errno = e;
3138 allargs_len = strlen (allargs_copy);
3139 }
3140 /* If not all the standard streams are redirected by the command
3141 line, use inferior_io_terminal for those which aren't. */
3142 if (inferior_io_terminal
3143 && !(fd_inp >= 0 && fd_out >= 0 && fd_err >= 0))
41b4aadc
CF
3144 {
3145 SECURITY_ATTRIBUTES sa;
3146 sa.nLength = sizeof(sa);
3147 sa.lpSecurityDescriptor = 0;
3148 sa.bInheritHandle = TRUE;
3149 tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
3150 0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
3151 if (tty == INVALID_HANDLE_VALUE)
3152 warning (_("Warning: Failed to open TTY %s, error %#x."),
3153 inferior_io_terminal, (unsigned) GetLastError ());
8ba42bc5
EZ
3154 }
3155 if (redirected || tty != INVALID_HANDLE_VALUE)
3156 {
3157 if (fd_inp >= 0)
3158 si.hStdInput = (HANDLE) _get_osfhandle (fd_inp);
3159 else if (tty != INVALID_HANDLE_VALUE)
3160 si.hStdInput = tty;
41b4aadc 3161 else
8ba42bc5
EZ
3162 si.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
3163 if (fd_out >= 0)
3164 si.hStdOutput = (HANDLE) _get_osfhandle (fd_out);
3165 else if (tty != INVALID_HANDLE_VALUE)
3166 si.hStdOutput = tty;
3167 else
3168 si.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
3169 if (fd_err >= 0)
3170 si.hStdError = (HANDLE) _get_osfhandle (fd_err);
3171 else if (tty != INVALID_HANDLE_VALUE)
3172 si.hStdError = tty;
3173 else
3174 si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
3175 si.dwFlags |= STARTF_USESTDHANDLES;
41b4aadc 3176 }
2becadee 3177
8ba42bc5
EZ
3178 toexec = exec_file;
3179 /* Build the command line, a space-separated list of tokens where
3180 the first token is the name of the module to be executed.
3181 To avoid ambiguities introduced by spaces in the module name,
3182 we quote it. */
3183 args_len = strlen (toexec) + 2 /* quotes */ + allargs_len + 2;
3184 args = (char *) alloca (args_len);
3185 xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs_copy);
3186
3187 flags |= DEBUG_ONLY_THIS_PROCESS;
3188
c93dbcba
EZ
3189 /* CreateProcess takes the environment list as a null terminated set of
3190 strings (i.e. two nulls terminate the list). */
3191
3192 /* Get total size for env strings. */
3193 for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
3194 envlen += strlen (in_env[i]) + 1;
3195
3196 envsize = sizeof (in_env[0]) * (i + 1);
3197 env = (char **) alloca (envsize);
3198 memcpy (env, in_env, envsize);
3199 /* Windows programs expect the environment block to be sorted. */
3200 qsort (env, i, sizeof (char *), envvar_cmp);
3201
0ae1c716 3202 w32env = (char *) alloca (envlen + 1);
c93dbcba
EZ
3203
3204 /* Copy env strings into new buffer. */
3205 for (temp = w32env, i = 0; env[i] && *env[i]; i++)
3206 {
3207 strcpy (temp, env[i]);
3208 temp += strlen (temp) + 1;
3209 }
3210
3211 /* Final nil string to terminate new env. */
3212 *temp = 0;
3213
dc05df57 3214 windows_init_thread_list ();
d0d0ab16
CV
3215 ret = CreateProcessA (0,
3216 args, /* command line */
3217 NULL, /* Security */
3218 NULL, /* thread */
3219 TRUE, /* inherit handles */
3220 flags, /* start flags */
c93dbcba 3221 w32env, /* environment */
d092c5a2 3222 inferior_cwd, /* current directory */
d0d0ab16
CV
3223 &si,
3224 &pi);
41b4aadc
CF
3225 if (tty != INVALID_HANDLE_VALUE)
3226 CloseHandle (tty);
8ba42bc5
EZ
3227 if (fd_inp >= 0)
3228 _close (fd_inp);
3229 if (fd_out >= 0)
3230 _close (fd_out);
3231 if (fd_err >= 0)
3232 _close (fd_err);
3233#endif /* !__CYGWIN__ */
2becadee 3234
24e60978 3235 if (!ret)
d50a0ce2 3236 error (_("Error creating process %s, (error %u)."),
8a3fe4f8 3237 exec_file, (unsigned) GetLastError ());
24e60978 3238
46f9f931
HD
3239#ifdef __x86_64__
3240 BOOL wow64;
3241 if (IsWow64Process (pi.hProcess, &wow64))
3242 wow64_process = wow64;
3243#endif
3244
c1766e7d
PM
3245 CloseHandle (pi.hThread);
3246 CloseHandle (pi.hProcess);
3247
dfe7f3ac
CF
3248 if (useshell && shell[0] != '\0')
3249 saw_create = -1;
3250 else
3251 saw_create = 0;
3252
f6ac5f3d 3253 do_initial_windows_stuff (this, pi.dwProcessId, 0);
d3a09475 3254
17617f2d 3255 /* windows_continue (DBG_CONTINUE, -1, 0); */
24e60978
SC
3256}
3257
f6ac5f3d
PA
3258void
3259windows_nat_target::mourn_inferior ()
24e60978 3260{
17617f2d 3261 (void) windows_continue (DBG_CONTINUE, -1, 0);
df7e5265 3262 x86_cleanup_dregs();
bf25528d
CF
3263 if (open_process_used)
3264 {
3265 CHECK (CloseHandle (current_process_handle));
3266 open_process_used = 0;
3267 }
7928d571 3268 siginfo_er.ExceptionCode = 0;
f6ac5f3d 3269 inf_child_target::mourn_inferior ();
24e60978
SC
3270}
3271
24e60978 3272/* Send a SIGINT to the process group. This acts just like the user typed a
581e13c1 3273 ^C on the controlling terminal. */
24e60978 3274
f6ac5f3d
PA
3275void
3276windows_nat_target::interrupt ()
24e60978 3277{
1ef980b9 3278 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1e37c281 3279 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
3a4b77d8 3280 registers_changed (); /* refresh register state */
24e60978
SC
3281}
3282
44f38867
PA
3283/* Helper for windows_xfer_partial that handles memory transfers.
3284 Arguments are like target_xfer_partial. */
3285
9b409511 3286static enum target_xfer_status
44f38867 3287windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
9b409511 3288 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
24e60978 3289{
5732a500 3290 SIZE_T done = 0;
44f38867 3291 BOOL success;
9e52adf9 3292 DWORD lasterror = 0;
44f38867
PA
3293
3294 if (writebuf != NULL)
24e60978 3295 {
a2388568 3296 DEBUG_MEM (("gdb: write target memory, %s bytes at %s\n",
b55e14c7 3297 pulongest (len), core_addr_to_string (memaddr)));
44f38867
PA
3298 success = WriteProcessMemory (current_process_handle,
3299 (LPVOID) (uintptr_t) memaddr, writebuf,
3300 len, &done);
9e52adf9 3301 if (!success)
7126d5c8 3302 lasterror = GetLastError ();
2b008701 3303 FlushInstructionCache (current_process_handle,
2c647436 3304 (LPCVOID) (uintptr_t) memaddr, len);
24e60978
SC
3305 }
3306 else
3307 {
a2388568 3308 DEBUG_MEM (("gdb: read target memory, %s bytes at %s\n",
b55e14c7 3309 pulongest (len), core_addr_to_string (memaddr)));
44f38867
PA
3310 success = ReadProcessMemory (current_process_handle,
3311 (LPCVOID) (uintptr_t) memaddr, readbuf,
3312 len, &done);
9e52adf9 3313 if (!success)
7126d5c8 3314 lasterror = GetLastError ();
24e60978 3315 }
9b409511 3316 *xfered_len = (ULONGEST) done;
9e52adf9 3317 if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
9b409511 3318 return TARGET_XFER_OK;
9e52adf9 3319 else
9b409511 3320 return success ? TARGET_XFER_OK : TARGET_XFER_E_IO;
24e60978
SC
3321}
3322
f6ac5f3d
PA
3323void
3324windows_nat_target::kill ()
24e60978 3325{
3cee93ac
CF
3326 CHECK (TerminateProcess (current_process_handle, 0));
3327
b5edcb45
ILT
3328 for (;;)
3329 {
17617f2d 3330 if (!windows_continue (DBG_CONTINUE, -1, 1))
b5edcb45 3331 break;
0a4afda3 3332 if (!wait_for_debug_event (&current_event, INFINITE))
b5edcb45 3333 break;
3cee93ac 3334 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
b5edcb45
ILT
3335 break;
3336 }
3337
9eee20eb 3338 target_mourn_inferior (inferior_ptid); /* Or just windows_mourn_inferior? */
24e60978
SC
3339}
3340
f6ac5f3d
PA
3341void
3342windows_nat_target::close ()
24e60978 3343{
dc05df57 3344 DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
e99b03dc 3345 inferior_ptid.pid ()));
24e60978 3346}
1ef980b9 3347
581e13c1 3348/* Convert pid to printable format. */
a068643d 3349std::string
f6ac5f3d 3350windows_nat_target::pid_to_str (ptid_t ptid)
24e60978 3351{
7c7411bc
TT
3352 if (ptid.lwp () != 0)
3353 return string_printf ("Thread %d.0x%lx", ptid.pid (), ptid.lwp ());
2dc38344
PA
3354
3355 return normal_pid_to_str (ptid);
3ee6f623
CF
3356}
3357
9b409511 3358static enum target_xfer_status
dc05df57 3359windows_xfer_shared_libraries (struct target_ops *ops,
9b409511
YQ
3360 enum target_object object, const char *annex,
3361 gdb_byte *readbuf, const gdb_byte *writebuf,
3362 ULONGEST offset, ULONGEST len,
3363 ULONGEST *xfered_len)
3cb8e7f6 3364{
de1b3c3d
PA
3365 struct obstack obstack;
3366 const char *buf;
3367 LONGEST len_avail;
3cb8e7f6 3368 struct so_list *so;
3cb8e7f6 3369
de1b3c3d 3370 if (writebuf)
2ed4b548 3371 return TARGET_XFER_E_IO;
3cb8e7f6 3372
de1b3c3d
PA
3373 obstack_init (&obstack);
3374 obstack_grow_str (&obstack, "<library-list>\n");
3375 for (so = solib_start.next; so; so = so->next)
d0e449a1
SM
3376 {
3377 lm_info_windows *li = (lm_info_windows *) so->lm_info;
3378
3379 windows_xfer_shared_library (so->so_name, (CORE_ADDR)
3380 (uintptr_t) li->load_addr,
c162ed3e 3381 &li->text_offset,
d0e449a1
SM
3382 target_gdbarch (), &obstack);
3383 }
de1b3c3d 3384 obstack_grow_str0 (&obstack, "</library-list>\n");
3cb8e7f6 3385
0ae1c716 3386 buf = (const char *) obstack_finish (&obstack);
de1b3c3d
PA
3387 len_avail = strlen (buf);
3388 if (offset >= len_avail)
49dc7f4b
PM
3389 len= 0;
3390 else
3391 {
3392 if (len > len_avail - offset)
3393 len = len_avail - offset;
3394 memcpy (readbuf, buf + offset, len);
3395 }
3cb8e7f6 3396
de1b3c3d 3397 obstack_free (&obstack, NULL);
9b409511 3398 *xfered_len = (ULONGEST) len;
0837c976 3399 return len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF;
3cb8e7f6
CF
3400}
3401
7928d571
HD
3402/* Helper for windows_nat_target::xfer_partial that handles signal info. */
3403
3404static enum target_xfer_status
3405windows_xfer_siginfo (gdb_byte *readbuf, ULONGEST offset, ULONGEST len,
3406 ULONGEST *xfered_len)
3407{
46f9f931
HD
3408 char *buf = (char *) &siginfo_er;
3409 size_t bufsize = sizeof (siginfo_er);
3410
3411#ifdef __x86_64__
3412 EXCEPTION_RECORD32 er32;
3413 if (wow64_process)
3414 {
3415 buf = (char *) &er32;
3416 bufsize = sizeof (er32);
3417
3418 er32.ExceptionCode = siginfo_er.ExceptionCode;
3419 er32.ExceptionFlags = siginfo_er.ExceptionFlags;
3420 er32.ExceptionRecord = (uintptr_t) siginfo_er.ExceptionRecord;
3421 er32.ExceptionAddress = (uintptr_t) siginfo_er.ExceptionAddress;
3422 er32.NumberParameters = siginfo_er.NumberParameters;
3423 int i;
3424 for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++)
3425 er32.ExceptionInformation[i] = siginfo_er.ExceptionInformation[i];
3426 }
3427#endif
3428
7928d571
HD
3429 if (siginfo_er.ExceptionCode == 0)
3430 return TARGET_XFER_E_IO;
3431
3432 if (readbuf == nullptr)
3433 return TARGET_XFER_E_IO;
3434
46f9f931 3435 if (offset > bufsize)
7928d571
HD
3436 return TARGET_XFER_E_IO;
3437
46f9f931
HD
3438 if (offset + len > bufsize)
3439 len = bufsize - offset;
7928d571 3440
46f9f931 3441 memcpy (readbuf, buf + offset, len);
7928d571
HD
3442 *xfered_len = len;
3443
3444 return TARGET_XFER_OK;
3445}
3446
f6ac5f3d
PA
3447enum target_xfer_status
3448windows_nat_target::xfer_partial (enum target_object object,
3449 const char *annex, gdb_byte *readbuf,
2f4f025f
TT
3450 const gdb_byte *writebuf, ULONGEST offset,
3451 ULONGEST len, ULONGEST *xfered_len)
3cb8e7f6 3452{
de1b3c3d 3453 switch (object)
3cb8e7f6 3454 {
de1b3c3d 3455 case TARGET_OBJECT_MEMORY:
9b409511 3456 return windows_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
de1b3c3d
PA
3457
3458 case TARGET_OBJECT_LIBRARIES:
f6ac5f3d 3459 return windows_xfer_shared_libraries (this, object, annex, readbuf,
9b409511 3460 writebuf, offset, len, xfered_len);
3929abe9 3461
7928d571
HD
3462 case TARGET_OBJECT_SIGNAL_INFO:
3463 return windows_xfer_siginfo (readbuf, offset, len, xfered_len);
3464
de1b3c3d 3465 default:
2f4f025f 3466 if (beneath () == NULL)
178d6a63
JB
3467 {
3468 /* This can happen when requesting the transfer of unsupported
3469 objects before a program has been started (and therefore
3470 with the current_target having no target beneath). */
3471 return TARGET_XFER_E_IO;
3472 }
2f4f025f
TT
3473 return beneath ()->xfer_partial (object, annex,
3474 readbuf, writebuf, offset, len,
3475 xfered_len);
3929abe9 3476 }
02c5aecd
CF
3477}
3478
711e434b
PM
3479/* Provide thread local base, i.e. Thread Information Block address.
3480 Returns 1 if ptid is found and sets *ADDR to thread_local_base. */
3481
57810aa7 3482bool
f6ac5f3d 3483windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
711e434b 3484{
876d1cd7 3485 windows_thread_info *th;
711e434b 3486
28688adf 3487 th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT);
711e434b 3488 if (th == NULL)
57810aa7 3489 return false;
711e434b
PM
3490
3491 if (addr != NULL)
3492 *addr = th->thread_local_base;
3493
57810aa7 3494 return true;
711e434b
PM
3495}
3496
f6ac5f3d
PA
3497ptid_t
3498windows_nat_target::get_ada_task_ptid (long lwp, long thread)
1e2f1c5c 3499{
7c7411bc 3500 return ptid_t (inferior_ptid.pid (), lwp, 0);
1e2f1c5c
JB
3501}
3502
24cdb46e
РИ
3503/* Implementation of the to_thread_name method. */
3504
f6ac5f3d
PA
3505const char *
3506windows_nat_target::thread_name (struct thread_info *thr)
24cdb46e 3507{
28688adf 3508 return thread_rec (thr->ptid, DONT_INVALIDATE_CONTEXT)->name.get ();
24cdb46e
РИ
3509}
3510
24e60978 3511
6c265988 3512void _initialize_windows_nat ();
24e60978 3513void
6c265988 3514_initialize_windows_nat ()
24e60978 3515{
df7e5265
GB
3516 x86_dr_low.set_control = cygwin_set_dr7;
3517 x86_dr_low.set_addr = cygwin_set_dr;
3518 x86_dr_low.get_addr = cygwin_get_dr;
3519 x86_dr_low.get_status = cygwin_get_dr6;
3520 x86_dr_low.get_control = cygwin_get_dr7;
51a9c8c5 3521
df7e5265
GB
3522 /* x86_dr_low.debug_register_length field is set by
3523 calling x86_set_debug_register_length function
51a9c8c5 3524 in processor windows specific native file. */
fa58ee11 3525
d9f719f1 3526 add_inf_child_target (&the_windows_nat_target);
1ef980b9 3527
d0d0ab16
CV
3528#ifdef __CYGWIN__
3529 cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
3530#endif
3531
463888ab
РИ
3532 add_com ("signal-event", class_run, signal_event_command, _("\
3533Signal a crashed process with event ID, to allow its debugging.\n\
3534This command is needed in support of setting up GDB as JIT debugger on \
3535MS-Windows. The command should be invoked from the GDB command line using \
3536the '-ex' command-line option. The ID of the event that blocks the \
3537crashed process will be supplied by the Windows JIT debugging mechanism."));
3538
10325bc5 3539#ifdef __CYGWIN__
5bf193a2
AC
3540 add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
3541Set use of shell to start subprocess."), _("\
3542Show use of shell to start subprocess."), NULL,
3543 NULL,
3544 NULL, /* FIXME: i18n: */
3545 &setlist, &showlist);
3546
581e13c1
MS
3547 add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
3548 &cygwin_exceptions, _("\
09280ddf
CF
3549Break when an exception is detected in the Cygwin DLL itself."), _("\
3550Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
3551 NULL,
3552 NULL, /* FIXME: i18n: */
3553 &setlist, &showlist);
10325bc5 3554#endif
09280ddf 3555
5bf193a2
AC
3556 add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
3557Set creation of new console when creating child process."), _("\
3558Show creation of new console when creating child process."), NULL,
3559 NULL,
3560 NULL, /* FIXME: i18n: */
3561 &setlist, &showlist);
3562
3563 add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
3564Set creation of new group when creating child process."), _("\
3565Show creation of new group when creating child process."), NULL,
3566 NULL,
3567 NULL, /* FIXME: i18n: */
3568 &setlist, &showlist);
3569
3570 add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
3571Set whether to display execution in child process."), _("\
3572Show whether to display execution in child process."), NULL,
3573 NULL,
3574 NULL, /* FIXME: i18n: */
3575 &setlist, &showlist);
3576
3577 add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
3578Set whether to display kernel events in child process."), _("\
3579Show whether to display kernel events in child process."), NULL,
3580 NULL,
3581 NULL, /* FIXME: i18n: */
3582 &setlist, &showlist);
3583
3584 add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
3585Set whether to display memory accesses in child process."), _("\
3586Show whether to display memory accesses in child process."), NULL,
3587 NULL,
3588 NULL, /* FIXME: i18n: */
3589 &setlist, &showlist);
3590
3591 add_setshow_boolean_cmd ("debugexceptions", class_support,
3592 &debug_exceptions, _("\
3593Set whether to display kernel exceptions in child process."), _("\
3594Show whether to display kernel exceptions in child process."), NULL,
3595 NULL,
3596 NULL, /* FIXME: i18n: */
3597 &setlist, &showlist);
1ef980b9 3598
711e434b 3599 init_w32_command_list ();
c1748f97
PM
3600
3601 add_cmd ("selector", class_info, display_selectors,
1a966eab 3602 _("Display selectors infos."),
c1748f97 3603 &info_w32_cmdlist);
24e60978 3604}
3cee93ac 3605
fa4ba8da
PM
3606/* Hardware watchpoint support, adapted from go32-nat.c code. */
3607
3608/* Pass the address ADDR to the inferior in the I'th debug register.
3609 Here we just store the address in dr array, the registers will be
dc05df57 3610 actually set up when windows_continue is called. */
9bb9e8ad 3611static void
fa4ba8da
PM
3612cygwin_set_dr (int i, CORE_ADDR addr)
3613{
3614 if (i < 0 || i > 3)
3615 internal_error (__FILE__, __LINE__,
e2e0b3e5 3616 _("Invalid register %d in cygwin_set_dr.\n"), i);
41b4aadc 3617 dr[i] = addr;
fa4ba8da
PM
3618 debug_registers_changed = 1;
3619 debug_registers_used = 1;
3620}
3621
3622/* Pass the value VAL to the inferior in the DR7 debug control
3623 register. Here we just store the address in D_REGS, the watchpoint
dc05df57 3624 will be actually set up in windows_wait. */
9bb9e8ad
PM
3625static void
3626cygwin_set_dr7 (unsigned long val)
fa4ba8da 3627{
9bb9e8ad 3628 dr[7] = (CORE_ADDR) val;
fa4ba8da
PM
3629 debug_registers_changed = 1;
3630 debug_registers_used = 1;
3631}
3632
7b50312a
PA
3633/* Get the value of debug register I from the inferior. */
3634
3635static CORE_ADDR
3636cygwin_get_dr (int i)
3637{
3638 return dr[i];
3639}
3640
fa4ba8da
PM
3641/* Get the value of the DR6 debug status register from the inferior.
3642 Here we just return the value stored in dr[6]
3643 by the last call to thread_rec for current_event.dwThreadId id. */
9bb9e8ad 3644static unsigned long
fa4ba8da
PM
3645cygwin_get_dr6 (void)
3646{
9bb9e8ad 3647 return (unsigned long) dr[6];
fa4ba8da
PM
3648}
3649
7b50312a
PA
3650/* Get the value of the DR7 debug status register from the inferior.
3651 Here we just return the value stored in dr[7] by the last call to
3652 thread_rec for current_event.dwThreadId id. */
3653
3654static unsigned long
3655cygwin_get_dr7 (void)
3656{
3657 return (unsigned long) dr[7];
3658}
3659
2dc38344 3660/* Determine if the thread referenced by "ptid" is alive
3cee93ac 3661 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
581e13c1 3662 it means that the thread has died. Otherwise it is assumed to be alive. */
f6ac5f3d 3663
57810aa7 3664bool
f6ac5f3d 3665windows_nat_target::thread_alive (ptid_t ptid)
3cee93ac 3666{
7c7411bc 3667 gdb_assert (ptid.lwp () != 0);
39f77062 3668
28688adf 3669 return (WaitForSingleObject (thread_rec (ptid, DONT_INVALIDATE_CONTEXT)->h, 0)
8e61ebec 3670 != WAIT_OBJECT_0);
3cee93ac
CF
3671}
3672
6c265988 3673void _initialize_check_for_gdb_ini ();
2a3d5645 3674void
6c265988 3675_initialize_check_for_gdb_ini ()
2a3d5645
CF
3676{
3677 char *homedir;
3678 if (inhibit_gdbinit)
3679 return;
3680
3681 homedir = getenv ("HOME");
3682 if (homedir)
3683 {
3684 char *p;
3685 char *oldini = (char *) alloca (strlen (homedir) +
1270fac6 3686 sizeof ("gdb.ini") + 1);
2a3d5645
CF
3687 strcpy (oldini, homedir);
3688 p = strchr (oldini, '\0');
0ba1096a 3689 if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
2a3d5645
CF
3690 *p++ = '/';
3691 strcpy (p, "gdb.ini");
3692 if (access (oldini, 0) == 0)
3693 {
3694 int len = strlen (oldini);
1270fac6 3695 char *newini = (char *) alloca (len + 2);
08850b56 3696
1270fac6 3697 xsnprintf (newini, len + 2, "%.*s.gdbinit",
08850b56 3698 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
8a3fe4f8 3699 warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2a3d5645
CF
3700 }
3701 }
3702}
33605d39 3703
2b008701 3704/* Define dummy functions which always return error for the rare cases where
581e13c1 3705 these functions could not be found. */
2b008701
CF
3706static BOOL WINAPI
3707bad_DebugActiveProcessStop (DWORD w)
3708{
3709 return FALSE;
3710}
3711static BOOL WINAPI
3712bad_DebugBreakProcess (HANDLE w)
3713{
3714 return FALSE;
3715}
3716static BOOL WINAPI
3717bad_DebugSetProcessKillOnExit (BOOL w)
3718{
3719 return FALSE;
3720}
3721static BOOL WINAPI
3722bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
3723{
3724 return FALSE;
3725}
b3c613f2
CF
3726
3727#ifdef __USEWIDE
2b008701 3728static DWORD WINAPI
b3c613f2 3729bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
2b008701
CF
3730{
3731 return 0;
3732}
d0d0ab16
CV
3733#else
3734static DWORD WINAPI
b3c613f2 3735bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
d0d0ab16
CV
3736{
3737 return 0;
3738}
3739#endif
b3c613f2 3740
2b008701
CF
3741static BOOL WINAPI
3742bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
3743{
3744 return FALSE;
3745}
3746
418c6cb3
CF
3747static BOOL WINAPI
3748bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
3749{
3750 return FALSE;
3751}
3752
cd44747c
PM
3753static BOOL WINAPI
3754bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
3755{
3756 f->nFont = 0;
3757 return 1;
3758}
3759static COORD WINAPI
3760bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
3761{
3762 COORD size;
3763 size.X = 8;
3764 size.Y = 12;
3765 return size;
3766}
3767
2b008701 3768/* Load any functions which may not be available in ancient versions
581e13c1 3769 of Windows. */
d603d4b3 3770
6c265988 3771void _initialize_loadable ();
33605d39 3772void
6c265988 3773_initialize_loadable ()
33605d39 3774{
2b008701
CF
3775 HMODULE hm = NULL;
3776
43499ea3
PA
3777#define GPA(m, func) \
3778 func = (func ## _ftype *) GetProcAddress (m, #func)
3779
2b008701
CF
3780 hm = LoadLibrary ("kernel32.dll");
3781 if (hm)
33605d39 3782 {
43499ea3
PA
3783 GPA (hm, DebugActiveProcessStop);
3784 GPA (hm, DebugBreakProcess);
3785 GPA (hm, DebugSetProcessKillOnExit);
3786 GPA (hm, GetConsoleFontSize);
3787 GPA (hm, DebugActiveProcessStop);
3788 GPA (hm, GetCurrentConsoleFont);
46f9f931
HD
3789#ifdef __x86_64__
3790 GPA (hm, Wow64SuspendThread);
3791 GPA (hm, Wow64GetThreadContext);
3792 GPA (hm, Wow64SetThreadContext);
3793 GPA (hm, Wow64GetThreadSelectorEntry);
3794#endif
2b008701 3795 }
33605d39 3796
2b008701 3797 /* Set variables to dummy versions of these processes if the function
581e13c1 3798 wasn't found in kernel32.dll. */
b3c613f2
CF
3799 if (!DebugBreakProcess)
3800 DebugBreakProcess = bad_DebugBreakProcess;
3801 if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
2b008701 3802 {
b3c613f2
CF
3803 DebugActiveProcessStop = bad_DebugActiveProcessStop;
3804 DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
2b008701 3805 }
cd44747c
PM
3806 if (!GetConsoleFontSize)
3807 GetConsoleFontSize = bad_GetConsoleFontSize;
3808 if (!GetCurrentConsoleFont)
3809 GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
33605d39 3810
2b008701 3811 /* Load optional functions used for retrieving filename information
581e13c1 3812 associated with the currently debugged process or its dlls. */
2b008701
CF
3813 hm = LoadLibrary ("psapi.dll");
3814 if (hm)
3815 {
43499ea3 3816 GPA (hm, EnumProcessModules);
46f9f931
HD
3817#ifdef __x86_64__
3818 GPA (hm, EnumProcessModulesEx);
3819#endif
43499ea3 3820 GPA (hm, GetModuleInformation);
aec47d1d
JB
3821 GetModuleFileNameEx = (GetModuleFileNameEx_ftype *)
3822 GetProcAddress (hm, GetModuleFileNameEx_name);
33605d39
CF
3823 }
3824
b3c613f2 3825 if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
2b008701
CF
3826 {
3827 /* Set variables to dummy versions of these processes if the function
581e13c1 3828 wasn't found in psapi.dll. */
b3c613f2
CF
3829 EnumProcessModules = bad_EnumProcessModules;
3830 GetModuleInformation = bad_GetModuleInformation;
3831 GetModuleFileNameEx = bad_GetModuleFileNameEx;
581e13c1
MS
3832 /* This will probably fail on Windows 9x/Me. Let the user know
3833 that we're missing some functionality. */
3834 warning(_("\
3835cannot automatically find executable file or library to read symbols.\n\
3836Use \"file\" or \"dll\" command to load executable/libraries directly."));
418c6cb3
CF
3837 }
3838
3839 hm = LoadLibrary ("advapi32.dll");
3840 if (hm)
3841 {
43499ea3
PA
3842 GPA (hm, OpenProcessToken);
3843 GPA (hm, LookupPrivilegeValueA);
3844 GPA (hm, AdjustTokenPrivileges);
418c6cb3 3845 /* Only need to set one of these since if OpenProcessToken fails nothing
581e13c1
MS
3846 else is needed. */
3847 if (!OpenProcessToken || !LookupPrivilegeValueA
3848 || !AdjustTokenPrivileges)
b3c613f2 3849 OpenProcessToken = bad_OpenProcessToken;
2b008701 3850 }
43499ea3
PA
3851
3852#undef GPA
33605d39 3853}
This page took 2.673025 seconds and 4 git commands to generate.