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