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