gdbserver: Move remote_debug to a single place
[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 (const gdb_exception &ex)
951     {
952       exception_print (gdb_stderr, ex);
953     }
954 }
955
956 /* Clear list of loaded DLLs.  */
957 static void
958 windows_clear_solib (void)
959 {
960   solib_start.next = NULL;
961   solib_end = &solib_start;
962 }
963
964 static void
965 signal_event_command (const char *args, int from_tty)
966 {
967   uintptr_t event_id = 0;
968   char *endargs = NULL;
969
970   if (args == NULL)
971     error (_("signal-event requires an argument (integer event id)"));
972
973   event_id = strtoumax (args, &endargs, 10);
974
975   if ((errno == ERANGE) || (event_id == 0) || (event_id > UINTPTR_MAX) ||
976       ((HANDLE) event_id == INVALID_HANDLE_VALUE))
977     error (_("Failed to convert `%s' to event id"), args);
978
979   SetEvent ((HANDLE) event_id);
980   CloseHandle ((HANDLE) event_id);
981 }
982
983 /* Handle DEBUG_STRING output from child process.
984    Cygwin prepends its messages with a "cygwin:".  Interpret this as
985    a Cygwin signal.  Otherwise just print the string as a warning.  */
986 static int
987 handle_output_debug_string (struct target_waitstatus *ourstatus)
988 {
989   gdb::unique_xmalloc_ptr<char> s;
990   int retval = 0;
991
992   if (!target_read_string
993         ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
994          &s, 1024, 0)
995       || !s || !*(s.get ()))
996     /* nothing to do */;
997   else if (!startswith (s.get (), _CYGWIN_SIGNAL_STRING))
998     {
999 #ifdef __CYGWIN__
1000       if (!startswith (s.get (), "cYg"))
1001 #endif
1002         {
1003           char *p = strchr (s.get (), '\0');
1004
1005           if (p > s.get () && *--p == '\n')
1006             *p = '\0';
1007           warning (("%s"), s.get ());
1008         }
1009     }
1010 #ifdef __CYGWIN__
1011   else
1012     {
1013       /* Got a cygwin signal marker.  A cygwin signal is followed by
1014          the signal number itself and then optionally followed by the
1015          thread id and address to saved context within the DLL.  If
1016          these are supplied, then the given thread is assumed to have
1017          issued the signal and the context from the thread is assumed
1018          to be stored at the given address in the inferior.  Tell gdb
1019          to treat this like a real signal.  */
1020       char *p;
1021       int sig = strtol (s.get () + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
1022       gdb_signal gotasig = gdb_signal_from_host (sig);
1023
1024       ourstatus->value.sig = gotasig;
1025       if (gotasig)
1026         {
1027           LPCVOID x;
1028           SIZE_T n;
1029
1030           ourstatus->kind = TARGET_WAITKIND_STOPPED;
1031           retval = strtoul (p, &p, 0);
1032           if (!retval)
1033             retval = main_thread_id;
1034           else if ((x = (LPCVOID) (uintptr_t) strtoull (p, NULL, 0))
1035                    && ReadProcessMemory (current_process_handle, x,
1036                                          &saved_context,
1037                                          __COPY_CONTEXT_SIZE, &n)
1038                    && n == __COPY_CONTEXT_SIZE)
1039             have_saved_context = 1;
1040         }
1041     }
1042 #endif
1043
1044   return retval;
1045 }
1046
1047 static int
1048 display_selector (HANDLE thread, DWORD sel)
1049 {
1050   LDT_ENTRY info;
1051   if (GetThreadSelectorEntry (thread, sel, &info))
1052     {
1053       int base, limit;
1054       printf_filtered ("0x%03x: ", (unsigned) sel);
1055       if (!info.HighWord.Bits.Pres)
1056         {
1057           puts_filtered ("Segment not present\n");
1058           return 0;
1059         }
1060       base = (info.HighWord.Bits.BaseHi << 24) +
1061              (info.HighWord.Bits.BaseMid << 16)
1062              + info.BaseLow;
1063       limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
1064       if (info.HighWord.Bits.Granularity)
1065         limit = (limit << 12) | 0xfff;
1066       printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
1067       if (info.HighWord.Bits.Default_Big)
1068         puts_filtered(" 32-bit ");
1069       else
1070         puts_filtered(" 16-bit ");
1071       switch ((info.HighWord.Bits.Type & 0xf) >> 1)
1072         {
1073         case 0:
1074           puts_filtered ("Data (Read-Only, Exp-up");
1075           break;
1076         case 1:
1077           puts_filtered ("Data (Read/Write, Exp-up");
1078           break;
1079         case 2:
1080           puts_filtered ("Unused segment (");
1081           break;
1082         case 3:
1083           puts_filtered ("Data (Read/Write, Exp-down");
1084           break;
1085         case 4:
1086           puts_filtered ("Code (Exec-Only, N.Conf");
1087           break;
1088         case 5:
1089           puts_filtered ("Code (Exec/Read, N.Conf");
1090           break;
1091         case 6:
1092           puts_filtered ("Code (Exec-Only, Conf");
1093           break;
1094         case 7:
1095           puts_filtered ("Code (Exec/Read, Conf");
1096           break;
1097         default:
1098           printf_filtered ("Unknown type 0x%lx",
1099                            (unsigned long) 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. ",
1107                        (unsigned long) info.HighWord.Bits.Dpl);
1108       if (info.HighWord.Bits.Granularity)
1109         puts_filtered ("Page granular.\n");
1110       else
1111         puts_filtered ("Byte granular.\n");
1112       return 1;
1113     }
1114   else
1115     {
1116       DWORD err = GetLastError ();
1117       if (err == ERROR_NOT_SUPPORTED)
1118         printf_filtered ("Function not supported\n");
1119       else
1120         printf_filtered ("Invalid selector 0x%x.\n", (unsigned) sel);
1121       return 0;
1122     }
1123 }
1124
1125 static void
1126 display_selectors (const char * args, int from_tty)
1127 {
1128   if (!current_thread)
1129     {
1130       puts_filtered ("Impossible to display selectors now.\n");
1131       return;
1132     }
1133   if (!args)
1134     {
1135
1136       puts_filtered ("Selector $cs\n");
1137       display_selector (current_thread->h,
1138         current_thread->context.SegCs);
1139       puts_filtered ("Selector $ds\n");
1140       display_selector (current_thread->h,
1141         current_thread->context.SegDs);
1142       puts_filtered ("Selector $es\n");
1143       display_selector (current_thread->h,
1144         current_thread->context.SegEs);
1145       puts_filtered ("Selector $ss\n");
1146       display_selector (current_thread->h,
1147         current_thread->context.SegSs);
1148       puts_filtered ("Selector $fs\n");
1149       display_selector (current_thread->h,
1150         current_thread->context.SegFs);
1151       puts_filtered ("Selector $gs\n");
1152       display_selector (current_thread->h,
1153         current_thread->context.SegGs);
1154     }
1155   else
1156     {
1157       int sel;
1158       sel = parse_and_eval_long (args);
1159       printf_filtered ("Selector \"%s\"\n",args);
1160       display_selector (current_thread->h, sel);
1161     }
1162 }
1163
1164 #define DEBUG_EXCEPTION_SIMPLE(x)       if (debug_exceptions) \
1165   printf_unfiltered ("gdb: Target exception %s at %s\n", x, \
1166     host_address_to_string (\
1167       current_event.u.Exception.ExceptionRecord.ExceptionAddress))
1168
1169 static handle_exception_result
1170 handle_exception (struct target_waitstatus *ourstatus)
1171 {
1172   EXCEPTION_RECORD *rec = &current_event.u.Exception.ExceptionRecord;
1173   DWORD code = rec->ExceptionCode;
1174   handle_exception_result result = HANDLE_EXCEPTION_HANDLED;
1175
1176   ourstatus->kind = TARGET_WAITKIND_STOPPED;
1177
1178   /* Record the context of the current thread.  */
1179   thread_rec (current_event.dwThreadId, -1);
1180
1181   switch (code)
1182     {
1183     case EXCEPTION_ACCESS_VIOLATION:
1184       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1185       ourstatus->value.sig = GDB_SIGNAL_SEGV;
1186 #ifdef __CYGWIN__
1187       {
1188         /* See if the access violation happened within the cygwin DLL
1189            itself.  Cygwin uses a kind of exception handling to deal
1190            with passed-in invalid addresses.  gdb should not treat
1191            these as real SEGVs since they will be silently handled by
1192            cygwin.  A real SEGV will (theoretically) be caught by
1193            cygwin later in the process and will be sent as a
1194            cygwin-specific-signal.  So, ignore SEGVs if they show up
1195            within the text segment of the DLL itself.  */
1196         const char *fn;
1197         CORE_ADDR addr = (CORE_ADDR) (uintptr_t) rec->ExceptionAddress;
1198
1199         if ((!cygwin_exceptions && (addr >= cygwin_load_start
1200                                     && addr < cygwin_load_end))
1201             || (find_pc_partial_function (addr, &fn, NULL, NULL)
1202                 && startswith (fn, "KERNEL32!IsBad")))
1203           return HANDLE_EXCEPTION_UNHANDLED;
1204       }
1205 #endif
1206       break;
1207     case STATUS_STACK_OVERFLOW:
1208       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1209       ourstatus->value.sig = GDB_SIGNAL_SEGV;
1210       break;
1211     case STATUS_FLOAT_DENORMAL_OPERAND:
1212       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1213       ourstatus->value.sig = GDB_SIGNAL_FPE;
1214       break;
1215     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1216       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1217       ourstatus->value.sig = GDB_SIGNAL_FPE;
1218       break;
1219     case STATUS_FLOAT_INEXACT_RESULT:
1220       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1221       ourstatus->value.sig = GDB_SIGNAL_FPE;
1222       break;
1223     case STATUS_FLOAT_INVALID_OPERATION:
1224       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1225       ourstatus->value.sig = GDB_SIGNAL_FPE;
1226       break;
1227     case STATUS_FLOAT_OVERFLOW:
1228       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1229       ourstatus->value.sig = GDB_SIGNAL_FPE;
1230       break;
1231     case STATUS_FLOAT_STACK_CHECK:
1232       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1233       ourstatus->value.sig = GDB_SIGNAL_FPE;
1234       break;
1235     case STATUS_FLOAT_UNDERFLOW:
1236       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1237       ourstatus->value.sig = GDB_SIGNAL_FPE;
1238       break;
1239     case STATUS_FLOAT_DIVIDE_BY_ZERO:
1240       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1241       ourstatus->value.sig = GDB_SIGNAL_FPE;
1242       break;
1243     case STATUS_INTEGER_DIVIDE_BY_ZERO:
1244       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1245       ourstatus->value.sig = GDB_SIGNAL_FPE;
1246       break;
1247     case STATUS_INTEGER_OVERFLOW:
1248       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1249       ourstatus->value.sig = GDB_SIGNAL_FPE;
1250       break;
1251     case EXCEPTION_BREAKPOINT:
1252       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1253       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1254       break;
1255     case DBG_CONTROL_C:
1256       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1257       ourstatus->value.sig = GDB_SIGNAL_INT;
1258       break;
1259     case DBG_CONTROL_BREAK:
1260       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1261       ourstatus->value.sig = GDB_SIGNAL_INT;
1262       break;
1263     case EXCEPTION_SINGLE_STEP:
1264       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1265       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1266       break;
1267     case EXCEPTION_ILLEGAL_INSTRUCTION:
1268       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1269       ourstatus->value.sig = GDB_SIGNAL_ILL;
1270       break;
1271     case EXCEPTION_PRIV_INSTRUCTION:
1272       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1273       ourstatus->value.sig = GDB_SIGNAL_ILL;
1274       break;
1275     case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1276       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1277       ourstatus->value.sig = GDB_SIGNAL_ILL;
1278       break;
1279     case MS_VC_EXCEPTION:
1280       if (rec->NumberParameters >= 3
1281           && (rec->ExceptionInformation[0] & 0xffffffff) == 0x1000)
1282         {
1283           DWORD named_thread_id;
1284           windows_thread_info *named_thread;
1285           CORE_ADDR thread_name_target;
1286
1287           DEBUG_EXCEPTION_SIMPLE ("MS_VC_EXCEPTION");
1288
1289           thread_name_target = rec->ExceptionInformation[1];
1290           named_thread_id = (DWORD) (0xffffffff & rec->ExceptionInformation[2]);
1291
1292           if (named_thread_id == (DWORD) -1)
1293             named_thread_id = current_event.dwThreadId;
1294
1295           named_thread = thread_rec (named_thread_id, 0);
1296           if (named_thread != NULL)
1297             {
1298               int thread_name_len;
1299               gdb::unique_xmalloc_ptr<char> thread_name;
1300
1301               thread_name_len = target_read_string (thread_name_target,
1302                                                     &thread_name, 1025, NULL);
1303               if (thread_name_len > 0)
1304                 {
1305                   thread_name.get ()[thread_name_len - 1] = '\0';
1306                   xfree (named_thread->name);
1307                   named_thread->name = thread_name.release ();
1308                 }
1309             }
1310           ourstatus->value.sig = GDB_SIGNAL_TRAP;
1311           result = HANDLE_EXCEPTION_IGNORED;
1312           break;
1313         }
1314         /* treat improperly formed exception as unknown */
1315         /* FALLTHROUGH */
1316     default:
1317       /* Treat unhandled first chance exceptions specially.  */
1318       if (current_event.u.Exception.dwFirstChance)
1319         return HANDLE_EXCEPTION_UNHANDLED;
1320       printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
1321         (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
1322         host_address_to_string (
1323           current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1324       ourstatus->value.sig = GDB_SIGNAL_UNKNOWN;
1325       break;
1326     }
1327   exception_count++;
1328   last_sig = ourstatus->value.sig;
1329   return result;
1330 }
1331
1332 /* Resume thread specified by ID, or all artificially suspended
1333    threads, if we are continuing execution.  KILLED non-zero means we
1334    have killed the inferior, so we should ignore weird errors due to
1335    threads shutting down.  */
1336 static BOOL
1337 windows_continue (DWORD continue_status, int id, int killed)
1338 {
1339   windows_thread_info *th;
1340   BOOL res;
1341
1342   DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n",
1343                   (unsigned) current_event.dwProcessId,
1344                   (unsigned) current_event.dwThreadId,
1345                   continue_status == DBG_CONTINUE ?
1346                   "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1347
1348   for (th = &thread_head; (th = th->next) != NULL;)
1349     if ((id == -1 || id == (int) th->id)
1350         && th->suspended)
1351       {
1352         if (debug_registers_changed)
1353           {
1354             th->context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1355             th->context.Dr0 = dr[0];
1356             th->context.Dr1 = dr[1];
1357             th->context.Dr2 = dr[2];
1358             th->context.Dr3 = dr[3];
1359             th->context.Dr6 = DR6_CLEAR_VALUE;
1360             th->context.Dr7 = dr[7];
1361           }
1362         if (th->context.ContextFlags)
1363           {
1364             DWORD ec = 0;
1365
1366             if (GetExitCodeThread (th->h, &ec)
1367                 && ec == STILL_ACTIVE)
1368               {
1369                 BOOL status = SetThreadContext (th->h, &th->context);
1370
1371                 if (!killed)
1372                   CHECK (status);
1373               }
1374             th->context.ContextFlags = 0;
1375           }
1376         if (th->suspended > 0)
1377           (void) ResumeThread (th->h);
1378         th->suspended = 0;
1379       }
1380
1381   res = ContinueDebugEvent (current_event.dwProcessId,
1382                             current_event.dwThreadId,
1383                             continue_status);
1384
1385   if (!res)
1386     error (_("Failed to resume program execution"
1387              " (ContinueDebugEvent failed, error %u)"),
1388            (unsigned int) GetLastError ());
1389
1390   debug_registers_changed = 0;
1391   return res;
1392 }
1393
1394 /* Called in pathological case where Windows fails to send a
1395    CREATE_PROCESS_DEBUG_EVENT after an attach.  */
1396 static DWORD
1397 fake_create_process (void)
1398 {
1399   current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1400                                         current_event.dwProcessId);
1401   if (current_process_handle != NULL)
1402     open_process_used = 1;
1403   else
1404     {
1405       error (_("OpenProcess call failed, GetLastError = %u"),
1406        (unsigned) GetLastError ());
1407       /*  We can not debug anything in that case.  */
1408     }
1409   main_thread_id = current_event.dwThreadId;
1410   current_thread
1411     = windows_add_thread (ptid_t (current_event.dwProcessId, 0,
1412                                   current_event.dwThreadId),
1413                           current_event.u.CreateThread.hThread,
1414                           current_event.u.CreateThread.lpThreadLocalBase,
1415                           true /* main_thread_p */);
1416   return main_thread_id;
1417 }
1418
1419 void
1420 windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
1421 {
1422   windows_thread_info *th;
1423   DWORD continue_status = DBG_CONTINUE;
1424
1425   /* A specific PTID means `step only this thread id'.  */
1426   int resume_all = ptid == minus_one_ptid;
1427
1428   /* If we're continuing all threads, it's the current inferior that
1429      should be handled specially.  */
1430   if (resume_all)
1431     ptid = inferior_ptid;
1432
1433   if (sig != GDB_SIGNAL_0)
1434     {
1435       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1436         {
1437           DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1438         }
1439       else if (sig == last_sig)
1440         continue_status = DBG_EXCEPTION_NOT_HANDLED;
1441       else
1442 #if 0
1443 /* This code does not seem to work, because
1444   the kernel does probably not consider changes in the ExceptionRecord
1445   structure when passing the exception to the inferior.
1446   Note that this seems possible in the exception handler itself.  */
1447         {
1448           for (const xlate_exception &x : xlate)
1449             if (x.us == sig)
1450               {
1451                 current_event.u.Exception.ExceptionRecord.ExceptionCode
1452                   = x.them;
1453                 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1454                 break;
1455               }
1456           if (continue_status == DBG_CONTINUE)
1457             {
1458               DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1459             }
1460         }
1461 #endif
1462         DEBUG_EXCEPT(("Can only continue with received signal %d.\n",
1463           last_sig));
1464     }
1465
1466   last_sig = GDB_SIGNAL_0;
1467
1468   DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
1469                ptid.pid (), ptid.tid (), step, sig));
1470
1471   /* Get context for currently selected thread.  */
1472   th = thread_rec (inferior_ptid.tid (), FALSE);
1473   if (th)
1474     {
1475       if (step)
1476         {
1477           /* Single step by setting t bit.  */
1478           struct regcache *regcache = get_current_regcache ();
1479           struct gdbarch *gdbarch = regcache->arch ();
1480           fetch_registers (regcache, gdbarch_ps_regnum (gdbarch));
1481           th->context.EFlags |= FLAG_TRACE_BIT;
1482         }
1483
1484       if (th->context.ContextFlags)
1485         {
1486           if (debug_registers_changed)
1487             {
1488               th->context.Dr0 = dr[0];
1489               th->context.Dr1 = dr[1];
1490               th->context.Dr2 = dr[2];
1491               th->context.Dr3 = dr[3];
1492               th->context.Dr6 = DR6_CLEAR_VALUE;
1493               th->context.Dr7 = dr[7];
1494             }
1495           CHECK (SetThreadContext (th->h, &th->context));
1496           th->context.ContextFlags = 0;
1497         }
1498     }
1499
1500   /* Allow continuing with the same signal that interrupted us.
1501      Otherwise complain.  */
1502
1503   if (resume_all)
1504     windows_continue (continue_status, -1, 0);
1505   else
1506     windows_continue (continue_status, ptid.tid (), 0);
1507 }
1508
1509 /* Ctrl-C handler used when the inferior is not run in the same console.  The
1510    handler is in charge of interrupting the inferior using DebugBreakProcess.
1511    Note that this function is not available prior to Windows XP.  In this case
1512    we emit a warning.  */
1513 static BOOL WINAPI
1514 ctrl_c_handler (DWORD event_type)
1515 {
1516   const int attach_flag = current_inferior ()->attach_flag;
1517
1518   /* Only handle Ctrl-C and Ctrl-Break events.  Ignore others.  */
1519   if (event_type != CTRL_C_EVENT && event_type != CTRL_BREAK_EVENT)
1520     return FALSE;
1521
1522   /* If the inferior and the debugger share the same console, do nothing as
1523      the inferior has also received the Ctrl-C event.  */
1524   if (!new_console && !attach_flag)
1525     return TRUE;
1526
1527   if (!DebugBreakProcess (current_process_handle))
1528     warning (_("Could not interrupt program.  "
1529                "Press Ctrl-c in the program console."));
1530
1531   /* Return true to tell that Ctrl-C has been handled.  */
1532   return TRUE;
1533 }
1534
1535 /* Get the next event from the child.  Returns a non-zero thread id if the event
1536    requires handling by WFI (or whatever).  */
1537 static int
1538 get_windows_debug_event (struct target_ops *ops,
1539                          int pid, struct target_waitstatus *ourstatus)
1540 {
1541   BOOL debug_event;
1542   DWORD continue_status, event_code;
1543   windows_thread_info *th;
1544   static windows_thread_info dummy_thread_info;
1545   DWORD thread_id = 0;
1546
1547   last_sig = GDB_SIGNAL_0;
1548
1549   if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1550     goto out;
1551
1552   event_count++;
1553   continue_status = DBG_CONTINUE;
1554
1555   event_code = current_event.dwDebugEventCode;
1556   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1557   th = NULL;
1558   have_saved_context = 0;
1559
1560   switch (event_code)
1561     {
1562     case CREATE_THREAD_DEBUG_EVENT:
1563       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1564                      (unsigned) current_event.dwProcessId,
1565                      (unsigned) current_event.dwThreadId,
1566                      "CREATE_THREAD_DEBUG_EVENT"));
1567       if (saw_create != 1)
1568         {
1569           struct inferior *inf;
1570           inf = find_inferior_pid (current_event.dwProcessId);
1571           if (!saw_create && inf->attach_flag)
1572             {
1573               /* Kludge around a Windows bug where first event is a create
1574                  thread event.  Caused when attached process does not have
1575                  a main thread.  */
1576               thread_id = fake_create_process ();
1577               if (thread_id)
1578                 saw_create++;
1579             }
1580           break;
1581         }
1582       /* Record the existence of this thread.  */
1583       thread_id = current_event.dwThreadId;
1584       th = windows_add_thread
1585         (ptid_t (current_event.dwProcessId, 0, current_event.dwThreadId),
1586          current_event.u.CreateThread.hThread,
1587          current_event.u.CreateThread.lpThreadLocalBase,
1588          false /* main_thread_p */);
1589
1590       break;
1591
1592     case EXIT_THREAD_DEBUG_EVENT:
1593       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1594                      (unsigned) current_event.dwProcessId,
1595                      (unsigned) current_event.dwThreadId,
1596                      "EXIT_THREAD_DEBUG_EVENT"));
1597       windows_delete_thread (ptid_t (current_event.dwProcessId, 0,
1598                                      current_event.dwThreadId),
1599                              current_event.u.ExitThread.dwExitCode,
1600                              false /* main_thread_p */);
1601       th = &dummy_thread_info;
1602       break;
1603
1604     case CREATE_PROCESS_DEBUG_EVENT:
1605       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1606                      (unsigned) current_event.dwProcessId,
1607                      (unsigned) current_event.dwThreadId,
1608                      "CREATE_PROCESS_DEBUG_EVENT"));
1609       CloseHandle (current_event.u.CreateProcessInfo.hFile);
1610       if (++saw_create != 1)
1611         break;
1612
1613       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1614       main_thread_id = current_event.dwThreadId;
1615       /* Add the main thread.  */
1616       th = windows_add_thread
1617         (ptid_t (current_event.dwProcessId, 0,
1618                  current_event.dwThreadId),
1619          current_event.u.CreateProcessInfo.hThread,
1620          current_event.u.CreateProcessInfo.lpThreadLocalBase,
1621          true /* main_thread_p */);
1622       thread_id = current_event.dwThreadId;
1623       break;
1624
1625     case EXIT_PROCESS_DEBUG_EVENT:
1626       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1627                      (unsigned) current_event.dwProcessId,
1628                      (unsigned) current_event.dwThreadId,
1629                      "EXIT_PROCESS_DEBUG_EVENT"));
1630       if (!windows_initialization_done)
1631         {
1632           target_terminal::ours ();
1633           target_mourn_inferior (inferior_ptid);
1634           error (_("During startup program exited with code 0x%x."),
1635                  (unsigned int) current_event.u.ExitProcess.dwExitCode);
1636         }
1637       else if (saw_create == 1)
1638         {
1639           windows_delete_thread (ptid_t (current_event.dwProcessId, 0,
1640                                          main_thread_id),
1641                                  0, true /* main_thread_p */);
1642           ourstatus->kind = TARGET_WAITKIND_EXITED;
1643           ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1644           thread_id = main_thread_id;
1645         }
1646       break;
1647
1648     case LOAD_DLL_DEBUG_EVENT:
1649       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1650                      (unsigned) current_event.dwProcessId,
1651                      (unsigned) current_event.dwThreadId,
1652                      "LOAD_DLL_DEBUG_EVENT"));
1653       CloseHandle (current_event.u.LoadDll.hFile);
1654       if (saw_create != 1 || ! windows_initialization_done)
1655         break;
1656       catch_errors (handle_load_dll);
1657       ourstatus->kind = TARGET_WAITKIND_LOADED;
1658       ourstatus->value.integer = 0;
1659       thread_id = main_thread_id;
1660       break;
1661
1662     case UNLOAD_DLL_DEBUG_EVENT:
1663       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1664                      (unsigned) current_event.dwProcessId,
1665                      (unsigned) current_event.dwThreadId,
1666                      "UNLOAD_DLL_DEBUG_EVENT"));
1667       if (saw_create != 1 || ! windows_initialization_done)
1668         break;
1669       catch_errors (handle_unload_dll);
1670       ourstatus->kind = TARGET_WAITKIND_LOADED;
1671       ourstatus->value.integer = 0;
1672       thread_id = main_thread_id;
1673       break;
1674
1675     case EXCEPTION_DEBUG_EVENT:
1676       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1677                      (unsigned) current_event.dwProcessId,
1678                      (unsigned) current_event.dwThreadId,
1679                      "EXCEPTION_DEBUG_EVENT"));
1680       if (saw_create != 1)
1681         break;
1682       switch (handle_exception (ourstatus))
1683         {
1684         case HANDLE_EXCEPTION_UNHANDLED:
1685         default:
1686           continue_status = DBG_EXCEPTION_NOT_HANDLED;
1687           break;
1688         case HANDLE_EXCEPTION_HANDLED:
1689           thread_id = current_event.dwThreadId;
1690           break;
1691         case HANDLE_EXCEPTION_IGNORED:
1692           continue_status = DBG_CONTINUE;
1693           break;
1694         }
1695       break;
1696
1697     case OUTPUT_DEBUG_STRING_EVENT:     /* Message from the kernel.  */
1698       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1699                      (unsigned) current_event.dwProcessId,
1700                      (unsigned) current_event.dwThreadId,
1701                      "OUTPUT_DEBUG_STRING_EVENT"));
1702       if (saw_create != 1)
1703         break;
1704       thread_id = handle_output_debug_string (ourstatus);
1705       break;
1706
1707     default:
1708       if (saw_create != 1)
1709         break;
1710       printf_unfiltered ("gdb: kernel event for pid=%u tid=0x%x\n",
1711                          (unsigned) current_event.dwProcessId,
1712                          (unsigned) current_event.dwThreadId);
1713       printf_unfiltered ("                 unknown event code %u\n",
1714                          (unsigned) current_event.dwDebugEventCode);
1715       break;
1716     }
1717
1718   if (!thread_id || saw_create != 1)
1719     {
1720       CHECK (windows_continue (continue_status, -1, 0));
1721     }
1722   else
1723     {
1724       inferior_ptid = ptid_t (current_event.dwProcessId, 0, thread_id);
1725       current_thread = th;
1726       if (!current_thread)
1727         current_thread = thread_rec (thread_id, TRUE);
1728     }
1729
1730 out:
1731   return thread_id;
1732 }
1733
1734 /* Wait for interesting events to occur in the target process.  */
1735 ptid_t
1736 windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
1737                           int options)
1738 {
1739   int pid = -1;
1740
1741   /* We loop when we get a non-standard exception rather than return
1742      with a SPURIOUS because resume can try and step or modify things,
1743      which needs a current_thread->h.  But some of these exceptions mark
1744      the birth or death of threads, which mean that the current thread
1745      isn't necessarily what you think it is.  */
1746
1747   while (1)
1748     {
1749       int retval;
1750
1751       /* If the user presses Ctrl-c while the debugger is waiting
1752          for an event, he expects the debugger to interrupt his program
1753          and to get the prompt back.  There are two possible situations:
1754
1755            - The debugger and the program do not share the console, in
1756              which case the Ctrl-c event only reached the debugger.
1757              In that case, the ctrl_c handler will take care of interrupting
1758              the inferior.  Note that this case is working starting with
1759              Windows XP.  For Windows 2000, Ctrl-C should be pressed in the
1760              inferior console.
1761
1762            - The debugger and the program share the same console, in which
1763              case both debugger and inferior will receive the Ctrl-c event.
1764              In that case the ctrl_c handler will ignore the event, as the
1765              Ctrl-c event generated inside the inferior will trigger the
1766              expected debug event.
1767
1768              FIXME: brobecker/2008-05-20: If the inferior receives the
1769              signal first and the delay until GDB receives that signal
1770              is sufficiently long, GDB can sometimes receive the SIGINT
1771              after we have unblocked the CTRL+C handler.  This would
1772              lead to the debugger stopping prematurely while handling
1773              the new-thread event that comes with the handling of the SIGINT
1774              inside the inferior, and then stop again immediately when
1775              the user tries to resume the execution in the inferior.
1776              This is a classic race that we should try to fix one day.  */
1777       SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
1778       retval = get_windows_debug_event (this, pid, ourstatus);
1779       SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
1780
1781       if (retval)
1782         return ptid_t (current_event.dwProcessId, 0, retval);
1783       else
1784         {
1785           int detach = 0;
1786
1787           if (deprecated_ui_loop_hook != NULL)
1788             detach = deprecated_ui_loop_hook (0);
1789
1790           if (detach)
1791             kill ();
1792         }
1793     }
1794 }
1795
1796 /* Iterate over all DLLs currently mapped by our inferior, and
1797    add them to our list of solibs.  */
1798
1799 static void
1800 windows_add_all_dlls (void)
1801 {
1802   HMODULE dummy_hmodule;
1803   DWORD cb_needed;
1804   HMODULE *hmodules;
1805   int i;
1806
1807   if (EnumProcessModules (current_process_handle, &dummy_hmodule,
1808                           sizeof (HMODULE), &cb_needed) == 0)
1809     return;
1810
1811   if (cb_needed < 1)
1812     return;
1813
1814   hmodules = (HMODULE *) alloca (cb_needed);
1815   if (EnumProcessModules (current_process_handle, hmodules,
1816                           cb_needed, &cb_needed) == 0)
1817     return;
1818
1819   for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
1820     {
1821       MODULEINFO mi;
1822 #ifdef __USEWIDE
1823       wchar_t dll_name[__PMAX];
1824       char name[__PMAX];
1825 #else
1826       char dll_name[__PMAX];
1827       char *name;
1828 #endif
1829       if (GetModuleInformation (current_process_handle, hmodules[i],
1830                                 &mi, sizeof (mi)) == 0)
1831         continue;
1832       if (GetModuleFileNameEx (current_process_handle, hmodules[i],
1833                                dll_name, sizeof (dll_name)) == 0)
1834         continue;
1835 #ifdef __USEWIDE
1836       wcstombs (name, dll_name, __PMAX);
1837 #else
1838       name = dll_name;
1839 #endif
1840
1841       solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
1842       solib_end = solib_end->next;
1843     }
1844 }
1845
1846 static void
1847 do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
1848 {
1849   int i;
1850   struct inferior *inf;
1851
1852   last_sig = GDB_SIGNAL_0;
1853   event_count = 0;
1854   exception_count = 0;
1855   open_process_used = 0;
1856   debug_registers_changed = 0;
1857   debug_registers_used = 0;
1858   for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1859     dr[i] = 0;
1860 #ifdef __CYGWIN__
1861   cygwin_load_start = cygwin_load_end = 0;
1862 #endif
1863   current_event.dwProcessId = pid;
1864   memset (&current_event, 0, sizeof (current_event));
1865   if (!target_is_pushed (ops))
1866     push_target (ops);
1867   disable_breakpoints_in_shlibs ();
1868   windows_clear_solib ();
1869   clear_proceed_status (0);
1870   init_wait_for_inferior ();
1871
1872   inf = current_inferior ();
1873   inferior_appeared (inf, pid);
1874   inf->attach_flag = attaching;
1875
1876   /* Make the new process the current inferior, so terminal handling
1877      can rely on it.  When attaching, we don't know about any thread
1878      id here, but that's OK --- nothing should be referencing the
1879      current thread until we report an event out of windows_wait.  */
1880   inferior_ptid = ptid_t (pid);
1881
1882   target_terminal::init ();
1883   target_terminal::inferior ();
1884
1885   windows_initialization_done = 0;
1886
1887   while (1)
1888     {
1889       struct target_waitstatus status;
1890
1891       ops->wait (minus_one_ptid, &status, 0);
1892
1893       /* Note windows_wait returns TARGET_WAITKIND_SPURIOUS for thread
1894          events.  */
1895       if (status.kind != TARGET_WAITKIND_LOADED
1896           && status.kind != TARGET_WAITKIND_SPURIOUS)
1897         break;
1898
1899       ops->resume (minus_one_ptid, 0, GDB_SIGNAL_0);
1900     }
1901
1902   /* Now that the inferior has been started and all DLLs have been mapped,
1903      we can iterate over all DLLs and load them in.
1904
1905      We avoid doing it any earlier because, on certain versions of Windows,
1906      LOAD_DLL_DEBUG_EVENTs are sometimes not complete.  In particular,
1907      we have seen on Windows 8.1 that the ntdll.dll load event does not
1908      include the DLL name, preventing us from creating an associated SO.
1909      A possible explanation is that ntdll.dll might be mapped before
1910      the SO info gets created by the Windows system -- ntdll.dll is
1911      the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
1912      do not seem to suffer from that problem.
1913
1914      Rather than try to work around this sort of issue, it is much
1915      simpler to just ignore DLL load/unload events during the startup
1916      phase, and then process them all in one batch now.  */
1917   windows_add_all_dlls ();
1918
1919   windows_initialization_done = 1;
1920   return;
1921 }
1922
1923 /* Try to set or remove a user privilege to the current process.  Return -1
1924    if that fails, the previous setting of that privilege otherwise.
1925
1926    This code is copied from the Cygwin source code and rearranged to allow
1927    dynamically loading of the needed symbols from advapi32 which is only
1928    available on NT/2K/XP.  */
1929 static int
1930 set_process_privilege (const char *privilege, BOOL enable)
1931 {
1932   HANDLE token_hdl = NULL;
1933   LUID restore_priv;
1934   TOKEN_PRIVILEGES new_priv, orig_priv;
1935   int ret = -1;
1936   DWORD size;
1937
1938   if (!OpenProcessToken (GetCurrentProcess (),
1939                          TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1940                          &token_hdl))
1941     goto out;
1942
1943   if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
1944     goto out;
1945
1946   new_priv.PrivilegeCount = 1;
1947   new_priv.Privileges[0].Luid = restore_priv;
1948   new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1949
1950   if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1951                               sizeof orig_priv, &orig_priv, &size))
1952     goto out;
1953 #if 0
1954   /* Disabled, otherwise every `attach' in an unprivileged user session
1955      would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1956      windows_attach().  */
1957   /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1958      be enabled.  GetLastError () returns an correct error code, though.  */
1959   if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1960     goto out;
1961 #endif
1962
1963   ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1964
1965 out:
1966   if (token_hdl)
1967     CloseHandle (token_hdl);
1968
1969   return ret;
1970 }
1971
1972 /* Attach to process PID, then initialize for debugging it.  */
1973
1974 void
1975 windows_nat_target::attach (const char *args, int from_tty)
1976 {
1977   BOOL ok;
1978   DWORD pid;
1979
1980   pid = parse_pid_to_attach (args);
1981
1982   if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1983     {
1984       printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1985       printf_unfiltered ("This can cause attach to "
1986                          "fail on Windows NT/2K/XP\n");
1987     }
1988
1989   windows_init_thread_list ();
1990   ok = DebugActiveProcess (pid);
1991   saw_create = 0;
1992
1993 #ifdef __CYGWIN__
1994   if (!ok)
1995     {
1996       /* Try fall back to Cygwin pid.  */
1997       pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1998
1999       if (pid > 0)
2000         ok = DebugActiveProcess (pid);
2001   }
2002 #endif
2003
2004   if (!ok)
2005     error (_("Can't attach to process."));
2006
2007   DebugSetProcessKillOnExit (FALSE);
2008
2009   if (from_tty)
2010     {
2011       char *exec_file = (char *) get_exec_file (0);
2012
2013       if (exec_file)
2014         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
2015                            target_pid_to_str (ptid_t (pid)).c_str ());
2016       else
2017         printf_unfiltered ("Attaching to %s\n",
2018                            target_pid_to_str (ptid_t (pid)).c_str ());
2019     }
2020
2021   do_initial_windows_stuff (this, pid, 1);
2022   target_terminal::ours ();
2023 }
2024
2025 void
2026 windows_nat_target::detach (inferior *inf, int from_tty)
2027 {
2028   int detached = 1;
2029
2030   ptid_t ptid = minus_one_ptid;
2031   resume (ptid, 0, GDB_SIGNAL_0);
2032
2033   if (!DebugActiveProcessStop (current_event.dwProcessId))
2034     {
2035       error (_("Can't detach process %u (error %u)"),
2036              (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
2037       detached = 0;
2038     }
2039   DebugSetProcessKillOnExit (FALSE);
2040
2041   if (detached && from_tty)
2042     {
2043       const char *exec_file = get_exec_file (0);
2044       if (exec_file == 0)
2045         exec_file = "";
2046       printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
2047                          (unsigned) current_event.dwProcessId);
2048     }
2049
2050   x86_cleanup_dregs ();
2051   inferior_ptid = null_ptid;
2052   detach_inferior (inf);
2053
2054   maybe_unpush_target ();
2055 }
2056
2057 /* Try to determine the executable filename.
2058
2059    EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
2060
2061    Upon success, the filename is stored inside EXE_NAME_RET, and
2062    this function returns nonzero.
2063
2064    Otherwise, this function returns zero and the contents of
2065    EXE_NAME_RET is undefined.  */
2066
2067 static int
2068 windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len)
2069 {
2070   DWORD len;
2071   HMODULE dh_buf;
2072   DWORD cbNeeded;
2073
2074   cbNeeded = 0;
2075   if (!EnumProcessModules (current_process_handle, &dh_buf,
2076                            sizeof (HMODULE), &cbNeeded) || !cbNeeded)
2077     return 0;
2078
2079   /* We know the executable is always first in the list of modules,
2080      which we just fetched.  So no need to fetch more.  */
2081
2082 #ifdef __CYGWIN__
2083   {
2084     /* Cygwin prefers that the path be in /x/y/z format, so extract
2085        the filename into a temporary buffer first, and then convert it
2086        to POSIX format into the destination buffer.  */
2087     cygwin_buf_t *pathbuf = (cygwin_buf_t *) alloca (exe_name_max_len * sizeof (cygwin_buf_t));
2088
2089     len = GetModuleFileNameEx (current_process_handle,
2090                                dh_buf, pathbuf, exe_name_max_len);
2091     if (len == 0)
2092       error (_("Error getting executable filename: %u."),
2093              (unsigned) GetLastError ());
2094     if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, exe_name_ret,
2095                           exe_name_max_len) < 0)
2096       error (_("Error converting executable filename to POSIX: %d."), errno);
2097   }
2098 #else
2099   len = GetModuleFileNameEx (current_process_handle,
2100                              dh_buf, exe_name_ret, exe_name_max_len);
2101   if (len == 0)
2102     error (_("Error getting executable filename: %u."),
2103            (unsigned) GetLastError ());
2104 #endif
2105
2106     return 1;   /* success */
2107 }
2108
2109 /* The pid_to_exec_file target_ops method for this platform.  */
2110
2111 char *
2112 windows_nat_target::pid_to_exec_file (int pid)
2113 {
2114   static char path[__PMAX];
2115 #ifdef __CYGWIN__
2116   /* Try to find exe name as symlink target of /proc/<pid>/exe.  */
2117   int nchars;
2118   char procexe[sizeof ("/proc/4294967295/exe")];
2119
2120   xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
2121   nchars = readlink (procexe, path, sizeof(path));
2122   if (nchars > 0 && nchars < sizeof (path))
2123     {
2124       path[nchars] = '\0';      /* Got it */
2125       return path;
2126     }
2127 #endif
2128
2129   /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
2130      of gdb, or we're trying to debug a non-Cygwin windows executable.  */
2131   if (!windows_get_exec_module_filename (path, sizeof (path)))
2132     path[0] = '\0';
2133
2134   return path;
2135 }
2136
2137 /* Print status information about what we're accessing.  */
2138
2139 void
2140 windows_nat_target::files_info ()
2141 {
2142   struct inferior *inf = current_inferior ();
2143
2144   printf_unfiltered ("\tUsing the running image of %s %s.\n",
2145                      inf->attach_flag ? "attached" : "child",
2146                      target_pid_to_str (inferior_ptid).c_str ());
2147 }
2148
2149 /* Modify CreateProcess parameters for use of a new separate console.
2150    Parameters are:
2151    *FLAGS: DWORD parameter for general process creation flags.
2152    *SI: STARTUPINFO structure, for which the console window size and
2153    console buffer size is filled in if GDB is running in a console.
2154    to create the new console.
2155    The size of the used font is not available on all versions of
2156    Windows OS.  Furthermore, the current font might not be the default
2157    font, but this is still better than before.
2158    If the windows and buffer sizes are computed,
2159    SI->DWFLAGS is changed so that this information is used
2160    by CreateProcess function.  */
2161
2162 static void
2163 windows_set_console_info (STARTUPINFO *si, DWORD *flags)
2164 {
2165   HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
2166                                 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
2167
2168   if (hconsole != INVALID_HANDLE_VALUE)
2169     {
2170       CONSOLE_SCREEN_BUFFER_INFO sbinfo;
2171       COORD font_size;
2172       CONSOLE_FONT_INFO cfi;
2173
2174       GetCurrentConsoleFont (hconsole, FALSE, &cfi);
2175       font_size = GetConsoleFontSize (hconsole, cfi.nFont);
2176       GetConsoleScreenBufferInfo(hconsole, &sbinfo);
2177       si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
2178       si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
2179       if (font_size.X)
2180         si->dwXSize *= font_size.X;
2181       else
2182         si->dwXSize *= 8;
2183       if (font_size.Y)
2184         si->dwYSize *= font_size.Y;
2185       else
2186         si->dwYSize *= 12;
2187       si->dwXCountChars = sbinfo.dwSize.X;
2188       si->dwYCountChars = sbinfo.dwSize.Y;
2189       si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
2190     }
2191   *flags |= CREATE_NEW_CONSOLE;
2192 }
2193
2194 #ifndef __CYGWIN__
2195 /* Function called by qsort to sort environment strings.  */
2196
2197 static int
2198 envvar_cmp (const void *a, const void *b)
2199 {
2200   const char **p = (const char **) a;
2201   const char **q = (const char **) b;
2202   return strcasecmp (*p, *q);
2203 }
2204 #endif
2205
2206 #ifdef __CYGWIN__
2207 static void
2208 clear_win32_environment (char **env)
2209 {
2210   int i;
2211   size_t len;
2212   wchar_t *copy = NULL, *equalpos;
2213
2214   for (i = 0; env[i] && *env[i]; i++)
2215     {
2216       len = mbstowcs (NULL, env[i], 0) + 1;
2217       copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2218       mbstowcs (copy, env[i], len);
2219       equalpos = wcschr (copy, L'=');
2220       if (equalpos)
2221         *equalpos = L'\0';
2222       SetEnvironmentVariableW (copy, NULL);
2223     }
2224   xfree (copy);
2225 }
2226 #endif
2227
2228 #ifndef __CYGWIN__
2229
2230 /* Redirection of inferior I/O streams for native MS-Windows programs.
2231    Unlike on Unix, where this is handled by invoking the inferior via
2232    the shell, on MS-Windows we need to emulate the cmd.exe shell.
2233
2234    The official documentation of the cmd.exe redirection features is here:
2235
2236      http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx
2237
2238    (That page talks about Windows XP, but there's no newer
2239    documentation, so we assume later versions of cmd.exe didn't change
2240    anything.)
2241
2242    Caveat: the documentation on that page seems to include a few lies.
2243    For example, it describes strange constructs 1<&2 and 2<&1, which
2244    seem to work only when 1>&2 resp. 2>&1 would make sense, and so I
2245    think the cmd.exe parser of the redirection symbols simply doesn't
2246    care about the < vs > distinction in these cases.  Therefore, the
2247    supported features are explicitly documented below.
2248
2249    The emulation below aims at supporting all the valid use cases
2250    supported by cmd.exe, which include:
2251
2252      < FILE    redirect standard input from FILE
2253      0< FILE   redirect standard input from FILE
2254      <&N       redirect standard input from file descriptor N
2255      0<&N      redirect standard input from file descriptor N
2256      > FILE    redirect standard output to FILE
2257      >> FILE   append standard output to FILE
2258      1>> FILE  append standard output to FILE
2259      >&N       redirect standard output to file descriptor N
2260      1>&N      redirect standard output to file descriptor N
2261      >>&N      append standard output to file descriptor N
2262      1>>&N     append standard output to file descriptor N
2263      2> FILE   redirect standard error to FILE
2264      2>> FILE  append standard error to FILE
2265      2>&N      redirect standard error to file descriptor N
2266      2>>&N     append standard error to file descriptor N
2267
2268      Note that using N > 2 in the above construct is supported, but
2269      requires that the corresponding file descriptor be open by some
2270      means elsewhere or outside GDB.  Also note that using ">&0" or
2271      "<&2" will generally fail, because the file descriptor redirected
2272      from is normally open in an incompatible mode (e.g., FD 0 is open
2273      for reading only).  IOW, use of such tricks is not recommended;
2274      you are on your own.
2275
2276      We do NOT support redirection of file descriptors above 2, as in
2277      "3>SOME-FILE", because MinGW compiled programs don't (supporting
2278      that needs special handling in the startup code that MinGW
2279      doesn't have).  Pipes are also not supported.
2280
2281      As for invalid use cases, where the redirection contains some
2282      error, the emulation below will detect that and produce some
2283      error and/or failure.  But the behavior in those cases is not
2284      bug-for-bug compatible with what cmd.exe does in those cases.
2285      That's because what cmd.exe does then is not well defined, and
2286      seems to be a side effect of the cmd.exe parsing of the command
2287      line more than anything else.  For example, try redirecting to an
2288      invalid file name, as in "> foo:bar".
2289
2290      There are also minor syntactic deviations from what cmd.exe does
2291      in some corner cases.  For example, it doesn't support the likes
2292      of "> &foo" to mean redirect to file named literally "&foo"; we
2293      do support that here, because that, too, sounds like some issue
2294      with the cmd.exe parser.  Another nicety is that we support
2295      redirection targets that use file names with forward slashes,
2296      something cmd.exe doesn't -- this comes in handy since GDB
2297      file-name completion can be used when typing the command line for
2298      the inferior.  */
2299
2300 /* Support routines for redirecting standard handles of the inferior.  */
2301
2302 /* Parse a single redirection spec, open/duplicate the specified
2303    file/fd, and assign the appropriate value to one of the 3 standard
2304    file descriptors. */
2305 static int
2306 redir_open (const char *redir_string, int *inp, int *out, int *err)
2307 {
2308   int *fd, ref_fd = -2;
2309   int mode;
2310   const char *fname = redir_string + 1;
2311   int rc = *redir_string;
2312
2313   switch (rc)
2314     {
2315     case '0':
2316       fname++;
2317       /* FALLTHROUGH */
2318     case '<':
2319       fd = inp;
2320       mode = O_RDONLY;
2321       break;
2322     case '1': case '2':
2323       fname++;
2324       /* FALLTHROUGH */
2325     case '>':
2326       fd = (rc == '2') ? err : out;
2327       mode = O_WRONLY | O_CREAT;
2328       if (*fname == '>')
2329         {
2330           fname++;
2331           mode |= O_APPEND;
2332         }
2333       else
2334         mode |= O_TRUNC;
2335       break;
2336     default:
2337       return -1;
2338     }
2339
2340   if (*fname == '&' && '0' <= fname[1] && fname[1] <= '9')
2341     {
2342       /* A reference to a file descriptor.  */
2343       char *fdtail;
2344       ref_fd = (int) strtol (fname + 1, &fdtail, 10);
2345       if (fdtail > fname + 1 && *fdtail == '\0')
2346         {
2347           /* Don't allow redirection when open modes are incompatible.  */
2348           if ((ref_fd == 0 && (fd == out || fd == err))
2349               || ((ref_fd == 1 || ref_fd == 2) && fd == inp))
2350             {
2351               errno = EPERM;
2352               return -1;
2353             }
2354           if (ref_fd == 0)
2355             ref_fd = *inp;
2356           else if (ref_fd == 1)
2357             ref_fd = *out;
2358           else if (ref_fd == 2)
2359             ref_fd = *err;
2360         }
2361       else
2362         {
2363           errno = EBADF;
2364           return -1;
2365         }
2366     }
2367   else
2368     fname++;    /* skip the separator space */
2369   /* If the descriptor is already open, close it.  This allows
2370      multiple specs of redirections for the same stream, which is
2371      somewhat nonsensical, but still valid and supported by cmd.exe.
2372      (But cmd.exe only opens a single file in this case, the one
2373      specified by the last redirection spec on the command line.)  */
2374   if (*fd >= 0)
2375     _close (*fd);
2376   if (ref_fd == -2)
2377     {
2378       *fd = _open (fname, mode, _S_IREAD | _S_IWRITE);
2379       if (*fd < 0)
2380         return -1;
2381     }
2382   else if (ref_fd == -1)
2383     *fd = -1;   /* reset to default destination */
2384   else
2385     {
2386       *fd = _dup (ref_fd);
2387       if (*fd < 0)
2388         return -1;
2389     }
2390   /* _open just sets a flag for O_APPEND, which won't be passed to the
2391      inferior, so we need to actually move the file pointer.  */
2392   if ((mode & O_APPEND) != 0)
2393     _lseek (*fd, 0L, SEEK_END);
2394   return 0;
2395 }
2396
2397 /* Canonicalize a single redirection spec and set up the corresponding
2398    file descriptor as specified.  */
2399 static int
2400 redir_set_redirection (const char *s, int *inp, int *out, int *err)
2401 {
2402   char buf[__PMAX + 2 + 5]; /* extra space for quotes & redirection string */
2403   char *d = buf;
2404   const char *start = s;
2405   int quote = 0;
2406
2407   *d++ = *s++;  /* copy the 1st character, < or > or a digit */
2408   if ((*start == '>' || *start == '1' || *start == '2')
2409       && *s == '>')
2410     {
2411       *d++ = *s++;
2412       if (*s == '>' && *start != '>')
2413         *d++ = *s++;
2414     }
2415   else if (*start == '0' && *s == '<')
2416     *d++ = *s++;
2417   /* cmd.exe recognizes "&N" only immediately after the redirection symbol.  */
2418   if (*s != '&')
2419     {
2420       while (isspace (*s))  /* skip whitespace before file name */
2421         s++;
2422       *d++ = ' ';           /* separate file name with a single space */
2423     }
2424
2425   /* Copy the file name.  */
2426   while (*s)
2427     {
2428       /* Remove quoting characters from the file name in buf[].  */
2429       if (*s == '"')    /* could support '..' quoting here */
2430         {
2431           if (!quote)
2432             quote = *s++;
2433           else if (*s == quote)
2434             {
2435               quote = 0;
2436               s++;
2437             }
2438           else
2439             *d++ = *s++;
2440         }
2441       else if (*s == '\\')
2442         {
2443           if (s[1] == '"')      /* could support '..' here */
2444             s++;
2445           *d++ = *s++;
2446         }
2447       else if (isspace (*s) && !quote)
2448         break;
2449       else
2450         *d++ = *s++;
2451       if (d - buf >= sizeof (buf) - 1)
2452         {
2453           errno = ENAMETOOLONG;
2454           return 0;
2455         }
2456     }
2457   *d = '\0';
2458
2459   /* Windows doesn't allow redirection characters in file names, so we
2460      can bail out early if they use them, or if there's no target file
2461      name after the redirection symbol.  */
2462   if (d[-1] == '>' || d[-1] == '<')
2463     {
2464       errno = ENOENT;
2465       return 0;
2466     }
2467   if (redir_open (buf, inp, out, err) == 0)
2468     return s - start;
2469   return 0;
2470 }
2471
2472 /* Parse the command line for redirection specs and prepare the file
2473    descriptors for the 3 standard streams accordingly.  */
2474 static bool
2475 redirect_inferior_handles (const char *cmd_orig, char *cmd,
2476                            int *inp, int *out, int *err)
2477 {
2478   const char *s = cmd_orig;
2479   char *d = cmd;
2480   int quote = 0;
2481   bool retval = false;
2482
2483   while (isspace (*s))
2484     *d++ = *s++;
2485
2486   while (*s)
2487     {
2488       if (*s == '"')    /* could also support '..' quoting here */
2489         {
2490           if (!quote)
2491             quote = *s;
2492           else if (*s == quote)
2493             quote = 0;
2494         }
2495       else if (*s == '\\')
2496         {
2497           if (s[1] == '"')      /* escaped quote char */
2498             s++;
2499         }
2500       else if (!quote)
2501         {
2502           /* Process a single redirection candidate.  */
2503           if (*s == '<' || *s == '>'
2504               || ((*s == '1' || *s == '2') && s[1] == '>')
2505               || (*s == '0' && s[1] == '<'))
2506             {
2507               int skip = redir_set_redirection (s, inp, out, err);
2508
2509               if (skip <= 0)
2510                 return false;
2511               retval = true;
2512               s += skip;
2513             }
2514         }
2515       if (*s)
2516         *d++ = *s++;
2517     }
2518   *d = '\0';
2519   return retval;
2520 }
2521 #endif  /* !__CYGWIN__ */
2522
2523 /* Start an inferior windows child process and sets inferior_ptid to its pid.
2524    EXEC_FILE is the file to run.
2525    ALLARGS is a string containing the arguments to the program.
2526    ENV is the environment vector to pass.  Errors reported with error().  */
2527
2528 void
2529 windows_nat_target::create_inferior (const char *exec_file,
2530                                      const std::string &origallargs,
2531                                      char **in_env, int from_tty)
2532 {
2533   STARTUPINFO si;
2534 #ifdef __CYGWIN__
2535   cygwin_buf_t real_path[__PMAX];
2536   cygwin_buf_t shell[__PMAX]; /* Path to shell */
2537   cygwin_buf_t infcwd[__PMAX];
2538   const char *sh;
2539   cygwin_buf_t *toexec;
2540   cygwin_buf_t *cygallargs;
2541   cygwin_buf_t *args;
2542   char **old_env = NULL;
2543   PWCHAR w32_env;
2544   size_t len;
2545   int tty;
2546   int ostdin, ostdout, ostderr;
2547 #else  /* !__CYGWIN__ */
2548   char shell[__PMAX]; /* Path to shell */
2549   const char *toexec;
2550   char *args, *allargs_copy;
2551   size_t args_len, allargs_len;
2552   int fd_inp = -1, fd_out = -1, fd_err = -1;
2553   HANDLE tty = INVALID_HANDLE_VALUE;
2554   bool redirected = false;
2555   char *w32env;
2556   char *temp;
2557   size_t envlen;
2558   int i;
2559   size_t envsize;
2560   char **env;
2561 #endif  /* !__CYGWIN__ */
2562   const char *allargs = origallargs.c_str ();
2563   PROCESS_INFORMATION pi;
2564   BOOL ret;
2565   DWORD flags = 0;
2566   const char *inferior_io_terminal = get_inferior_io_terminal ();
2567
2568   if (!exec_file)
2569     error (_("No executable specified, use `target exec'."));
2570
2571   const char *inferior_cwd = get_inferior_cwd ();
2572   std::string expanded_infcwd;
2573   if (inferior_cwd != NULL)
2574     {
2575       expanded_infcwd = gdb_tilde_expand (inferior_cwd);
2576       /* Mirror slashes on inferior's cwd.  */
2577       std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
2578                     '/', '\\');
2579       inferior_cwd = expanded_infcwd.c_str ();
2580     }
2581
2582   memset (&si, 0, sizeof (si));
2583   si.cb = sizeof (si);
2584
2585   if (new_group)
2586     flags |= CREATE_NEW_PROCESS_GROUP;
2587
2588   if (new_console)
2589     windows_set_console_info (&si, &flags);
2590
2591 #ifdef __CYGWIN__
2592   if (!useshell)
2593     {
2594       flags |= DEBUG_ONLY_THIS_PROCESS;
2595       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
2596                             __PMAX * sizeof (cygwin_buf_t)) < 0)
2597         error (_("Error starting executable: %d"), errno);
2598       toexec = real_path;
2599 #ifdef __USEWIDE
2600       len = mbstowcs (NULL, allargs, 0) + 1;
2601       if (len == (size_t) -1)
2602         error (_("Error starting executable: %d"), errno);
2603       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2604       mbstowcs (cygallargs, allargs, len);
2605 #else  /* !__USEWIDE */
2606       cygallargs = allargs;
2607 #endif
2608     }
2609   else
2610     {
2611       sh = get_shell ();
2612       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
2613         error (_("Error starting executable via shell: %d"), errno);
2614 #ifdef __USEWIDE
2615       len = sizeof (L" -c 'exec  '") + mbstowcs (NULL, exec_file, 0)
2616             + mbstowcs (NULL, allargs, 0) + 2;
2617       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2618       swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
2619 #else  /* !__USEWIDE */
2620       len = (sizeof (" -c 'exec  '") + strlen (exec_file)
2621              + strlen (allargs) + 2);
2622       cygallargs = (char *) alloca (len);
2623       xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
2624 #endif  /* __USEWIDE */
2625       toexec = shell;
2626       flags |= DEBUG_PROCESS;
2627     }
2628
2629   if (inferior_cwd != NULL
2630       && cygwin_conv_path (CCP_POSIX_TO_WIN_W, inferior_cwd,
2631                            infcwd, strlen (inferior_cwd)) < 0)
2632     error (_("Error converting inferior cwd: %d"), errno);
2633
2634 #ifdef __USEWIDE
2635   args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
2636                                   * sizeof (wchar_t));
2637   wcscpy (args, toexec);
2638   wcscat (args, L" ");
2639   wcscat (args, cygallargs);
2640 #else  /* !__USEWIDE */
2641   args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
2642   strcpy (args, toexec);
2643   strcat (args, " ");
2644   strcat (args, cygallargs);
2645 #endif  /* !__USEWIDE */
2646
2647 #ifdef CW_CVT_ENV_TO_WINENV
2648   /* First try to create a direct Win32 copy of the POSIX environment. */
2649   w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
2650   if (w32_env != (PWCHAR) -1)
2651     flags |= CREATE_UNICODE_ENVIRONMENT;
2652   else
2653     /* If that fails, fall back to old method tweaking GDB's environment. */
2654 #endif  /* CW_CVT_ENV_TO_WINENV */
2655     {
2656       /* Reset all Win32 environment variables to avoid leftover on next run. */
2657       clear_win32_environment (environ);
2658       /* Prepare the environment vars for CreateProcess.  */
2659       old_env = environ;
2660       environ = in_env;
2661       cygwin_internal (CW_SYNC_WINENV);
2662       w32_env = NULL;
2663     }
2664
2665   if (!inferior_io_terminal)
2666     tty = ostdin = ostdout = ostderr = -1;
2667   else
2668     {
2669       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
2670       if (tty < 0)
2671         {
2672           print_sys_errmsg (inferior_io_terminal, errno);
2673           ostdin = ostdout = ostderr = -1;
2674         }
2675       else
2676         {
2677           ostdin = dup (0);
2678           ostdout = dup (1);
2679           ostderr = dup (2);
2680           dup2 (tty, 0);
2681           dup2 (tty, 1);
2682           dup2 (tty, 2);
2683         }
2684     }
2685
2686   windows_init_thread_list ();
2687   ret = CreateProcess (0,
2688                        args,    /* command line */
2689                        NULL,    /* Security */
2690                        NULL,    /* thread */
2691                        TRUE,    /* inherit handles */
2692                        flags,   /* start flags */
2693                        w32_env, /* environment */
2694                        inferior_cwd != NULL ? infcwd : NULL, /* current
2695                                                                 directory */
2696                        &si,
2697                        &pi);
2698   if (w32_env)
2699     /* Just free the Win32 environment, if it could be created. */
2700     free (w32_env);
2701   else
2702     {
2703       /* Reset all environment variables to avoid leftover on next run. */
2704       clear_win32_environment (in_env);
2705       /* Restore normal GDB environment variables.  */
2706       environ = old_env;
2707       cygwin_internal (CW_SYNC_WINENV);
2708     }
2709
2710   if (tty >= 0)
2711     {
2712       ::close (tty);
2713       dup2 (ostdin, 0);
2714       dup2 (ostdout, 1);
2715       dup2 (ostderr, 2);
2716       ::close (ostdin);
2717       ::close (ostdout);
2718       ::close (ostderr);
2719     }
2720 #else  /* !__CYGWIN__ */
2721   allargs_len = strlen (allargs);
2722   allargs_copy = strcpy ((char *) alloca (allargs_len + 1), allargs);
2723   if (strpbrk (allargs_copy, "<>") != NULL)
2724     {
2725       int e = errno;
2726       errno = 0;
2727       redirected =
2728         redirect_inferior_handles (allargs, allargs_copy,
2729                                    &fd_inp, &fd_out, &fd_err);
2730       if (errno)
2731         warning (_("Error in redirection: %s."), strerror (errno));
2732       else
2733         errno = e;
2734       allargs_len = strlen (allargs_copy);
2735     }
2736   /* If not all the standard streams are redirected by the command
2737      line, use inferior_io_terminal for those which aren't.  */
2738   if (inferior_io_terminal
2739       && !(fd_inp >= 0 && fd_out >= 0 && fd_err >= 0))
2740     {
2741       SECURITY_ATTRIBUTES sa;
2742       sa.nLength = sizeof(sa);
2743       sa.lpSecurityDescriptor = 0;
2744       sa.bInheritHandle = TRUE;
2745       tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
2746                          0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
2747       if (tty == INVALID_HANDLE_VALUE)
2748         warning (_("Warning: Failed to open TTY %s, error %#x."),
2749                  inferior_io_terminal, (unsigned) GetLastError ());
2750     }
2751   if (redirected || tty != INVALID_HANDLE_VALUE)
2752     {
2753       if (fd_inp >= 0)
2754         si.hStdInput = (HANDLE) _get_osfhandle (fd_inp);
2755       else if (tty != INVALID_HANDLE_VALUE)
2756         si.hStdInput = tty;
2757       else
2758         si.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
2759       if (fd_out >= 0)
2760         si.hStdOutput = (HANDLE) _get_osfhandle (fd_out);
2761       else if (tty != INVALID_HANDLE_VALUE)
2762         si.hStdOutput = tty;
2763       else
2764         si.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
2765       if (fd_err >= 0)
2766         si.hStdError = (HANDLE) _get_osfhandle (fd_err);
2767       else if (tty != INVALID_HANDLE_VALUE)
2768         si.hStdError = tty;
2769       else
2770         si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
2771       si.dwFlags |= STARTF_USESTDHANDLES;
2772     }
2773
2774   toexec = exec_file;
2775   /* Build the command line, a space-separated list of tokens where
2776      the first token is the name of the module to be executed.
2777      To avoid ambiguities introduced by spaces in the module name,
2778      we quote it.  */
2779   args_len = strlen (toexec) + 2 /* quotes */ + allargs_len + 2;
2780   args = (char *) alloca (args_len);
2781   xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs_copy);
2782
2783   flags |= DEBUG_ONLY_THIS_PROCESS;
2784
2785   /* CreateProcess takes the environment list as a null terminated set of
2786      strings (i.e. two nulls terminate the list).  */
2787
2788   /* Get total size for env strings.  */
2789   for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
2790     envlen += strlen (in_env[i]) + 1;
2791
2792   envsize = sizeof (in_env[0]) * (i + 1);
2793   env = (char **) alloca (envsize);
2794   memcpy (env, in_env, envsize);
2795   /* Windows programs expect the environment block to be sorted.  */
2796   qsort (env, i, sizeof (char *), envvar_cmp);
2797
2798   w32env = (char *) alloca (envlen + 1);
2799
2800   /* Copy env strings into new buffer.  */
2801   for (temp = w32env, i = 0; env[i] && *env[i]; i++)
2802     {
2803       strcpy (temp, env[i]);
2804       temp += strlen (temp) + 1;
2805     }
2806
2807   /* Final nil string to terminate new env.  */
2808   *temp = 0;
2809
2810   windows_init_thread_list ();
2811   ret = CreateProcessA (0,
2812                         args,   /* command line */
2813                         NULL,   /* Security */
2814                         NULL,   /* thread */
2815                         TRUE,   /* inherit handles */
2816                         flags,  /* start flags */
2817                         w32env, /* environment */
2818                         inferior_cwd, /* current directory */
2819                         &si,
2820                         &pi);
2821   if (tty != INVALID_HANDLE_VALUE)
2822     CloseHandle (tty);
2823   if (fd_inp >= 0)
2824     _close (fd_inp);
2825   if (fd_out >= 0)
2826     _close (fd_out);
2827   if (fd_err >= 0)
2828     _close (fd_err);
2829 #endif  /* !__CYGWIN__ */
2830
2831   if (!ret)
2832     error (_("Error creating process %s, (error %u)."),
2833            exec_file, (unsigned) GetLastError ());
2834
2835   CloseHandle (pi.hThread);
2836   CloseHandle (pi.hProcess);
2837
2838   if (useshell && shell[0] != '\0')
2839     saw_create = -1;
2840   else
2841     saw_create = 0;
2842
2843   do_initial_windows_stuff (this, pi.dwProcessId, 0);
2844
2845   /* windows_continue (DBG_CONTINUE, -1, 0); */
2846 }
2847
2848 void
2849 windows_nat_target::mourn_inferior ()
2850 {
2851   (void) windows_continue (DBG_CONTINUE, -1, 0);
2852   x86_cleanup_dregs();
2853   if (open_process_used)
2854     {
2855       CHECK (CloseHandle (current_process_handle));
2856       open_process_used = 0;
2857     }
2858   inf_child_target::mourn_inferior ();
2859 }
2860
2861 /* Send a SIGINT to the process group.  This acts just like the user typed a
2862    ^C on the controlling terminal.  */
2863
2864 void
2865 windows_nat_target::interrupt ()
2866 {
2867   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
2868   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
2869   registers_changed ();         /* refresh register state */
2870 }
2871
2872 /* Helper for windows_xfer_partial that handles memory transfers.
2873    Arguments are like target_xfer_partial.  */
2874
2875 static enum target_xfer_status
2876 windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
2877                      ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
2878 {
2879   SIZE_T done = 0;
2880   BOOL success;
2881   DWORD lasterror = 0;
2882
2883   if (writebuf != NULL)
2884     {
2885       DEBUG_MEM (("gdb: write target memory, %s bytes at %s\n",
2886                   pulongest (len), core_addr_to_string (memaddr)));
2887       success = WriteProcessMemory (current_process_handle,
2888                                     (LPVOID) (uintptr_t) memaddr, writebuf,
2889                                     len, &done);
2890       if (!success)
2891         lasterror = GetLastError ();
2892       FlushInstructionCache (current_process_handle,
2893                              (LPCVOID) (uintptr_t) memaddr, len);
2894     }
2895   else
2896     {
2897       DEBUG_MEM (("gdb: read target memory, %s bytes at %s\n",
2898                   pulongest (len), core_addr_to_string (memaddr)));
2899       success = ReadProcessMemory (current_process_handle,
2900                                    (LPCVOID) (uintptr_t) memaddr, readbuf,
2901                                    len, &done);
2902       if (!success)
2903         lasterror = GetLastError ();
2904     }
2905   *xfered_len = (ULONGEST) done;
2906   if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
2907     return TARGET_XFER_OK;
2908   else
2909     return success ? TARGET_XFER_OK : TARGET_XFER_E_IO;
2910 }
2911
2912 void
2913 windows_nat_target::kill ()
2914 {
2915   CHECK (TerminateProcess (current_process_handle, 0));
2916
2917   for (;;)
2918     {
2919       if (!windows_continue (DBG_CONTINUE, -1, 1))
2920         break;
2921       if (!WaitForDebugEvent (&current_event, INFINITE))
2922         break;
2923       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2924         break;
2925     }
2926
2927   target_mourn_inferior (inferior_ptid);        /* Or just windows_mourn_inferior?  */
2928 }
2929
2930 void
2931 windows_nat_target::close ()
2932 {
2933   DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2934                 inferior_ptid.pid ()));
2935 }
2936
2937 /* Convert pid to printable format.  */
2938 std::string
2939 windows_nat_target::pid_to_str (ptid_t ptid)
2940 {
2941   if (ptid.tid () != 0)
2942     return string_printf ("Thread %d.0x%lx", ptid.pid (), ptid.tid ());
2943
2944   return normal_pid_to_str (ptid);
2945 }
2946
2947 static enum target_xfer_status
2948 windows_xfer_shared_libraries (struct target_ops *ops,
2949                                enum target_object object, const char *annex,
2950                                gdb_byte *readbuf, const gdb_byte *writebuf,
2951                                ULONGEST offset, ULONGEST len,
2952                                ULONGEST *xfered_len)
2953 {
2954   struct obstack obstack;
2955   const char *buf;
2956   LONGEST len_avail;
2957   struct so_list *so;
2958
2959   if (writebuf)
2960     return TARGET_XFER_E_IO;
2961
2962   obstack_init (&obstack);
2963   obstack_grow_str (&obstack, "<library-list>\n");
2964   for (so = solib_start.next; so; so = so->next)
2965     {
2966       lm_info_windows *li = (lm_info_windows *) so->lm_info;
2967
2968       windows_xfer_shared_library (so->so_name, (CORE_ADDR)
2969                                    (uintptr_t) li->load_addr,
2970                                    target_gdbarch (), &obstack);
2971     }
2972   obstack_grow_str0 (&obstack, "</library-list>\n");
2973
2974   buf = (const char *) obstack_finish (&obstack);
2975   len_avail = strlen (buf);
2976   if (offset >= len_avail)
2977     len= 0;
2978   else
2979     {
2980       if (len > len_avail - offset)
2981         len = len_avail - offset;
2982       memcpy (readbuf, buf + offset, len);
2983     }
2984
2985   obstack_free (&obstack, NULL);
2986   *xfered_len = (ULONGEST) len;
2987   return len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF;
2988 }
2989
2990 enum target_xfer_status
2991 windows_nat_target::xfer_partial (enum target_object object,
2992                                   const char *annex, gdb_byte *readbuf,
2993                                   const gdb_byte *writebuf, ULONGEST offset,
2994                                   ULONGEST len, ULONGEST *xfered_len)
2995 {
2996   switch (object)
2997     {
2998     case TARGET_OBJECT_MEMORY:
2999       return windows_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
3000
3001     case TARGET_OBJECT_LIBRARIES:
3002       return windows_xfer_shared_libraries (this, object, annex, readbuf,
3003                                             writebuf, offset, len, xfered_len);
3004
3005     default:
3006       if (beneath () == NULL)
3007         {
3008           /* This can happen when requesting the transfer of unsupported
3009              objects before a program has been started (and therefore
3010              with the current_target having no target beneath).  */
3011           return TARGET_XFER_E_IO;
3012         }
3013       return beneath ()->xfer_partial (object, annex,
3014                                        readbuf, writebuf, offset, len,
3015                                        xfered_len);
3016     }
3017 }
3018
3019 /* Provide thread local base, i.e. Thread Information Block address.
3020    Returns 1 if ptid is found and sets *ADDR to thread_local_base.  */
3021
3022 bool
3023 windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
3024 {
3025   windows_thread_info *th;
3026
3027   th = thread_rec (ptid.tid (), 0);
3028   if (th == NULL)
3029     return false;
3030
3031   if (addr != NULL)
3032     *addr = th->thread_local_base;
3033
3034   return true;
3035 }
3036
3037 ptid_t
3038 windows_nat_target::get_ada_task_ptid (long lwp, long thread)
3039 {
3040   return ptid_t (inferior_ptid.pid (), 0, lwp);
3041 }
3042
3043 /* Implementation of the to_thread_name method.  */
3044
3045 const char *
3046 windows_nat_target::thread_name (struct thread_info *thr)
3047 {
3048   return thread_rec (thr->ptid.tid (), 0)->name;
3049 }
3050
3051
3052 void
3053 _initialize_windows_nat (void)
3054 {
3055   x86_dr_low.set_control = cygwin_set_dr7;
3056   x86_dr_low.set_addr = cygwin_set_dr;
3057   x86_dr_low.get_addr = cygwin_get_dr;
3058   x86_dr_low.get_status = cygwin_get_dr6;
3059   x86_dr_low.get_control = cygwin_get_dr7;
3060
3061   /* x86_dr_low.debug_register_length field is set by
3062      calling x86_set_debug_register_length function
3063      in processor windows specific native file.  */
3064
3065   add_inf_child_target (&the_windows_nat_target);
3066
3067 #ifdef __CYGWIN__
3068   cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
3069 #endif
3070
3071   add_com ("signal-event", class_run, signal_event_command, _("\
3072 Signal a crashed process with event ID, to allow its debugging.\n\
3073 This command is needed in support of setting up GDB as JIT debugger on \
3074 MS-Windows.  The command should be invoked from the GDB command line using \
3075 the '-ex' command-line option.  The ID of the event that blocks the \
3076 crashed process will be supplied by the Windows JIT debugging mechanism."));
3077
3078 #ifdef __CYGWIN__
3079   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
3080 Set use of shell to start subprocess."), _("\
3081 Show use of shell to start subprocess."), NULL,
3082                            NULL,
3083                            NULL, /* FIXME: i18n: */
3084                            &setlist, &showlist);
3085
3086   add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
3087                            &cygwin_exceptions, _("\
3088 Break when an exception is detected in the Cygwin DLL itself."), _("\
3089 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
3090                            NULL,
3091                            NULL, /* FIXME: i18n: */
3092                            &setlist, &showlist);
3093 #endif
3094
3095   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
3096 Set creation of new console when creating child process."), _("\
3097 Show creation of new console when creating child process."), NULL,
3098                            NULL,
3099                            NULL, /* FIXME: i18n: */
3100                            &setlist, &showlist);
3101
3102   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
3103 Set creation of new group when creating child process."), _("\
3104 Show creation of new group when creating child process."), NULL,
3105                            NULL,
3106                            NULL, /* FIXME: i18n: */
3107                            &setlist, &showlist);
3108
3109   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
3110 Set whether to display execution in child process."), _("\
3111 Show whether to display execution in child process."), NULL,
3112                            NULL,
3113                            NULL, /* FIXME: i18n: */
3114                            &setlist, &showlist);
3115
3116   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
3117 Set whether to display kernel events in child process."), _("\
3118 Show whether to display kernel events in child process."), NULL,
3119                            NULL,
3120                            NULL, /* FIXME: i18n: */
3121                            &setlist, &showlist);
3122
3123   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
3124 Set whether to display memory accesses in child process."), _("\
3125 Show whether to display memory accesses in child process."), NULL,
3126                            NULL,
3127                            NULL, /* FIXME: i18n: */
3128                            &setlist, &showlist);
3129
3130   add_setshow_boolean_cmd ("debugexceptions", class_support,
3131                            &debug_exceptions, _("\
3132 Set whether to display kernel exceptions in child process."), _("\
3133 Show whether to display kernel exceptions in child process."), NULL,
3134                            NULL,
3135                            NULL, /* FIXME: i18n: */
3136                            &setlist, &showlist);
3137
3138   init_w32_command_list ();
3139
3140   add_cmd ("selector", class_info, display_selectors,
3141            _("Display selectors infos."),
3142            &info_w32_cmdlist);
3143 }
3144
3145 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
3146
3147 /* Pass the address ADDR to the inferior in the I'th debug register.
3148    Here we just store the address in dr array, the registers will be
3149    actually set up when windows_continue is called.  */
3150 static void
3151 cygwin_set_dr (int i, CORE_ADDR addr)
3152 {
3153   if (i < 0 || i > 3)
3154     internal_error (__FILE__, __LINE__,
3155                     _("Invalid register %d in cygwin_set_dr.\n"), i);
3156   dr[i] = addr;
3157   debug_registers_changed = 1;
3158   debug_registers_used = 1;
3159 }
3160
3161 /* Pass the value VAL to the inferior in the DR7 debug control
3162    register.  Here we just store the address in D_REGS, the watchpoint
3163    will be actually set up in windows_wait.  */
3164 static void
3165 cygwin_set_dr7 (unsigned long val)
3166 {
3167   dr[7] = (CORE_ADDR) val;
3168   debug_registers_changed = 1;
3169   debug_registers_used = 1;
3170 }
3171
3172 /* Get the value of debug register I from the inferior.  */
3173
3174 static CORE_ADDR
3175 cygwin_get_dr (int i)
3176 {
3177   return dr[i];
3178 }
3179
3180 /* Get the value of the DR6 debug status register from the inferior.
3181    Here we just return the value stored in dr[6]
3182    by the last call to thread_rec for current_event.dwThreadId id.  */
3183 static unsigned long
3184 cygwin_get_dr6 (void)
3185 {
3186   return (unsigned long) dr[6];
3187 }
3188
3189 /* Get the value of the DR7 debug status register from the inferior.
3190    Here we just return the value stored in dr[7] by the last call to
3191    thread_rec for current_event.dwThreadId id.  */
3192
3193 static unsigned long
3194 cygwin_get_dr7 (void)
3195 {
3196   return (unsigned long) dr[7];
3197 }
3198
3199 /* Determine if the thread referenced by "ptid" is alive
3200    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
3201    it means that the thread has died.  Otherwise it is assumed to be alive.  */
3202
3203 bool
3204 windows_nat_target::thread_alive (ptid_t ptid)
3205 {
3206   int tid;
3207
3208   gdb_assert (ptid.tid () != 0);
3209   tid = ptid.tid ();
3210
3211   return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) != WAIT_OBJECT_0;
3212 }
3213
3214 void
3215 _initialize_check_for_gdb_ini (void)
3216 {
3217   char *homedir;
3218   if (inhibit_gdbinit)
3219     return;
3220
3221   homedir = getenv ("HOME");
3222   if (homedir)
3223     {
3224       char *p;
3225       char *oldini = (char *) alloca (strlen (homedir) +
3226                                       sizeof ("gdb.ini") + 1);
3227       strcpy (oldini, homedir);
3228       p = strchr (oldini, '\0');
3229       if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
3230         *p++ = '/';
3231       strcpy (p, "gdb.ini");
3232       if (access (oldini, 0) == 0)
3233         {
3234           int len = strlen (oldini);
3235           char *newini = (char *) alloca (len + 2);
3236
3237           xsnprintf (newini, len + 2, "%.*s.gdbinit",
3238                      (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
3239           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
3240         }
3241     }
3242 }
3243
3244 /* Define dummy functions which always return error for the rare cases where
3245    these functions could not be found.  */
3246 static BOOL WINAPI
3247 bad_DebugActiveProcessStop (DWORD w)
3248 {
3249   return FALSE;
3250 }
3251 static BOOL WINAPI
3252 bad_DebugBreakProcess (HANDLE w)
3253 {
3254   return FALSE;
3255 }
3256 static BOOL WINAPI
3257 bad_DebugSetProcessKillOnExit (BOOL w)
3258 {
3259   return FALSE;
3260 }
3261 static BOOL WINAPI
3262 bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
3263 {
3264   return FALSE;
3265 }
3266
3267 #ifdef __USEWIDE
3268 static DWORD WINAPI
3269 bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
3270 {
3271   return 0;
3272 }
3273 #else
3274 static DWORD WINAPI
3275 bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
3276 {
3277   return 0;
3278 }
3279 #endif
3280
3281 static BOOL WINAPI
3282 bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
3283 {
3284   return FALSE;
3285 }
3286
3287 static BOOL WINAPI
3288 bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
3289 {
3290   return FALSE;
3291 }
3292
3293 static BOOL WINAPI
3294 bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
3295 {
3296   f->nFont = 0;
3297   return 1;
3298 }
3299 static COORD WINAPI
3300 bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
3301 {
3302   COORD size;
3303   size.X = 8;
3304   size.Y = 12;
3305   return size;
3306 }
3307  
3308 /* Load any functions which may not be available in ancient versions
3309    of Windows.  */
3310
3311 void
3312 _initialize_loadable (void)
3313 {
3314   HMODULE hm = NULL;
3315
3316 #define GPA(m, func)                                    \
3317   func = (func ## _ftype *) GetProcAddress (m, #func)
3318
3319   hm = LoadLibrary ("kernel32.dll");
3320   if (hm)
3321     {
3322       GPA (hm, DebugActiveProcessStop);
3323       GPA (hm, DebugBreakProcess);
3324       GPA (hm, DebugSetProcessKillOnExit);
3325       GPA (hm, GetConsoleFontSize);
3326       GPA (hm, DebugActiveProcessStop);
3327       GPA (hm, GetCurrentConsoleFont);
3328     }
3329
3330   /* Set variables to dummy versions of these processes if the function
3331      wasn't found in kernel32.dll.  */
3332   if (!DebugBreakProcess)
3333     DebugBreakProcess = bad_DebugBreakProcess;
3334   if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
3335     {
3336       DebugActiveProcessStop = bad_DebugActiveProcessStop;
3337       DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
3338     }
3339   if (!GetConsoleFontSize)
3340     GetConsoleFontSize = bad_GetConsoleFontSize;
3341   if (!GetCurrentConsoleFont)
3342     GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
3343
3344   /* Load optional functions used for retrieving filename information
3345      associated with the currently debugged process or its dlls.  */
3346   hm = LoadLibrary ("psapi.dll");
3347   if (hm)
3348     {
3349       GPA (hm, EnumProcessModules);
3350       GPA (hm, GetModuleInformation);
3351       GetModuleFileNameEx = (GetModuleFileNameEx_ftype *)
3352         GetProcAddress (hm, GetModuleFileNameEx_name);
3353     }
3354
3355   if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
3356     {
3357       /* Set variables to dummy versions of these processes if the function
3358          wasn't found in psapi.dll.  */
3359       EnumProcessModules = bad_EnumProcessModules;
3360       GetModuleInformation = bad_GetModuleInformation;
3361       GetModuleFileNameEx = bad_GetModuleFileNameEx;
3362       /* This will probably fail on Windows 9x/Me.  Let the user know
3363          that we're missing some functionality.  */
3364       warning(_("\
3365 cannot automatically find executable file or library to read symbols.\n\
3366 Use \"file\" or \"dll\" command to load executable/libraries directly."));
3367     }
3368
3369   hm = LoadLibrary ("advapi32.dll");
3370   if (hm)
3371     {
3372       GPA (hm, OpenProcessToken);
3373       GPA (hm, LookupPrivilegeValueA);
3374       GPA (hm, AdjustTokenPrivileges);
3375       /* Only need to set one of these since if OpenProcessToken fails nothing
3376          else is needed.  */
3377       if (!OpenProcessToken || !LookupPrivilegeValueA
3378           || !AdjustTokenPrivileges)
3379         OpenProcessToken = bad_OpenProcessToken;
3380     }
3381
3382 #undef GPA
3383 }