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