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