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