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