Update version number and generated files for 2.33 release.
[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 "gdbsupport/gdb_tilde_expand.h"
71 #include "gdbsupport/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
241 /* Counts of things.  */
242 static int exception_count = 0;
243 static int event_count = 0;
244 static int saw_create;
245 static int open_process_used = 0;
246
247 /* User options.  */
248 static int new_console = 0;
249 #ifdef __CYGWIN__
250 static int cygwin_exceptions = 0;
251 #endif
252 static int new_group = 1;
253 static int debug_exec = 0;              /* show execution */
254 static int debug_events = 0;            /* show events from kernel */
255 static int debug_memory = 0;            /* show target memory accesses */
256 static int debug_exceptions = 0;        /* show target exceptions */
257 static int useshell = 0;                /* use shell for subprocesses */
258
259 /* This vector maps GDB's idea of a register's number into an offset
260    in the windows exception context vector.
261
262    It also contains the bit mask needed to load the register in question.
263
264    The contents of this table can only be computed by the units
265    that provide CPU-specific support for Windows native debugging.
266    These units should set the table by calling
267    windows_set_context_register_offsets.
268
269    One day we could read a reg, we could inspect the context we
270    already have loaded, if it doesn't have the bit set that we need,
271    we read that set of registers in using GetThreadContext.  If the
272    context already contains what we need, we just unpack it.  Then to
273    write a register, first we have to ensure that the context contains
274    the other regs of the group, and then we copy the info in and set
275    out bit.  */
276
277 static const int *mappings;
278
279 /* The function to use in order to determine whether a register is
280    a segment register or not.  */
281 static segment_register_p_ftype *segment_register_p;
282
283 /* See windows_nat_target::resume to understand why this is commented
284    out.  */
285 #if 0
286 /* This vector maps the target's idea of an exception (extracted
287    from the DEBUG_EVENT structure) to GDB's idea.  */
288
289 struct xlate_exception
290   {
291     DWORD them;
292     enum gdb_signal us;
293   };
294
295 static const struct xlate_exception xlate[] =
296 {
297   {EXCEPTION_ACCESS_VIOLATION, GDB_SIGNAL_SEGV},
298   {STATUS_STACK_OVERFLOW, GDB_SIGNAL_SEGV},
299   {EXCEPTION_BREAKPOINT, GDB_SIGNAL_TRAP},
300   {DBG_CONTROL_C, GDB_SIGNAL_INT},
301   {EXCEPTION_SINGLE_STEP, GDB_SIGNAL_TRAP},
302   {STATUS_FLOAT_DIVIDE_BY_ZERO, GDB_SIGNAL_FPE}
303 };
304
305 #endif /* 0 */
306
307 struct windows_nat_target final : public x86_nat_target<inf_child_target>
308 {
309   void close () override;
310
311   void attach (const char *, int) override;
312
313   bool attach_no_wait () override
314   { return true; }
315
316   void detach (inferior *, int) override;
317
318   void resume (ptid_t, int , enum gdb_signal) override;
319
320   ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
321
322   void fetch_registers (struct regcache *, int) override;
323   void store_registers (struct regcache *, int) override;
324
325   enum target_xfer_status xfer_partial (enum target_object object,
326                                         const char *annex,
327                                         gdb_byte *readbuf,
328                                         const gdb_byte *writebuf,
329                                         ULONGEST offset, ULONGEST len,
330                                         ULONGEST *xfered_len) override;
331
332   void files_info () override;
333
334   void kill () override;
335
336   void create_inferior (const char *, const std::string &,
337                         char **, int) override;
338
339   void mourn_inferior () override;
340
341   bool thread_alive (ptid_t ptid) override;
342
343   std::string pid_to_str (ptid_t) override;
344
345   void interrupt () override;
346
347   char *pid_to_exec_file (int pid) override;
348
349   ptid_t get_ada_task_ptid (long lwp, long thread) override;
350
351   bool get_tib_address (ptid_t ptid, CORE_ADDR *addr) override;
352
353   const char *thread_name (struct thread_info *) override;
354 };
355
356 static windows_nat_target the_windows_nat_target;
357
358 /* Set the MAPPINGS static global to OFFSETS.
359    See the description of MAPPINGS for more details.  */
360
361 void
362 windows_set_context_register_offsets (const int *offsets)
363 {
364   mappings = offsets;
365 }
366
367 /* See windows-nat.h.  */
368
369 void
370 windows_set_segment_register_p (segment_register_p_ftype *fun)
371 {
372   segment_register_p = fun;
373 }
374
375 static void
376 check (BOOL ok, const char *file, int line)
377 {
378   if (!ok)
379     printf_filtered ("error return %s:%d was %u\n", file, line,
380                      (unsigned) GetLastError ());
381 }
382
383 /* Find a thread record given a thread id.  If GET_CONTEXT is not 0,
384    then also retrieve the context for this thread.  If GET_CONTEXT is
385    negative, then don't suspend the thread.  */
386 static windows_thread_info *
387 thread_rec (DWORD id, int get_context)
388 {
389   windows_thread_info *th;
390
391   for (th = &thread_head; (th = th->next) != NULL;)
392     if (th->id == id)
393       {
394         if (!th->suspended && get_context)
395           {
396             if (get_context > 0 && id != current_event.dwThreadId)
397               {
398                 if (SuspendThread (th->h) == (DWORD) -1)
399                   {
400                     DWORD err = GetLastError ();
401
402                     /* We get Access Denied (5) when trying to suspend
403                        threads that Windows started on behalf of the
404                        debuggee, usually when those threads are just
405                        about to exit.
406                        We can get Invalid Handle (6) if the main thread
407                        has exited.  */
408                     if (err != ERROR_INVALID_HANDLE
409                         && err != ERROR_ACCESS_DENIED)
410                       warning (_("SuspendThread (tid=0x%x) failed."
411                                  " (winerr %u)"),
412                                (unsigned) id, (unsigned) err);
413                     th->suspended = -1;
414                   }
415                 else
416                   th->suspended = 1;
417               }
418             else if (get_context < 0)
419               th->suspended = -1;
420             th->reload_context = 1;
421           }
422         return th;
423       }
424
425   return NULL;
426 }
427
428 /* Add a thread to the thread list.
429
430    PTID is the ptid of the thread to be added.
431    H is its Windows handle.
432    TLB is its thread local base.
433    MAIN_THREAD_P should be true if the thread to be added is
434    the main thread, false otherwise.  */
435
436 static windows_thread_info *
437 windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p)
438 {
439   windows_thread_info *th;
440   DWORD id;
441
442   gdb_assert (ptid.tid () != 0);
443
444   id = ptid.tid ();
445
446   if ((th = thread_rec (id, FALSE)))
447     return th;
448
449   th = XCNEW (windows_thread_info);
450   th->id = id;
451   th->h = h;
452   th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
453   th->next = thread_head.next;
454   thread_head.next = th;
455
456   /* Add this new thread to the list of threads.
457
458      To be consistent with what's done on other platforms, we add
459      the main thread silently (in reality, this thread is really
460      more of a process to the user than a thread).  */
461   if (main_thread_p)
462     add_thread_silent (ptid);
463   else
464     add_thread (ptid);
465
466   /* Set the debug registers for the new thread if they are used.  */
467   if (debug_registers_used)
468     {
469       /* Only change the value of the debug registers.  */
470       th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
471       CHECK (GetThreadContext (th->h, &th->context));
472       th->context.Dr0 = dr[0];
473       th->context.Dr1 = dr[1];
474       th->context.Dr2 = dr[2];
475       th->context.Dr3 = dr[3];
476       th->context.Dr6 = DR6_CLEAR_VALUE;
477       th->context.Dr7 = dr[7];
478       CHECK (SetThreadContext (th->h, &th->context));
479       th->context.ContextFlags = 0;
480     }
481   return th;
482 }
483
484 /* Clear out any old thread list and reinitialize it to a
485    pristine state.  */
486 static void
487 windows_init_thread_list (void)
488 {
489   windows_thread_info *th = &thread_head;
490
491   DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
492   init_thread_list ();
493   while (th->next != NULL)
494     {
495       windows_thread_info *here = th->next;
496       th->next = here->next;
497       xfree (here);
498     }
499   thread_head.next = NULL;
500 }
501
502 /* Delete a thread from the list of threads.
503
504    PTID is the ptid of the thread to be deleted.
505    EXIT_CODE is the thread's exit code.
506    MAIN_THREAD_P should be true if the thread to be deleted is
507    the main thread, false otherwise.  */
508
509 static void
510 windows_delete_thread (ptid_t ptid, DWORD exit_code, bool main_thread_p)
511 {
512   windows_thread_info *th;
513   DWORD id;
514
515   gdb_assert (ptid.tid () != 0);
516
517   id = ptid.tid ();
518
519   /* Emit a notification about the thread being deleted.
520
521      Note that no notification was printed when the main thread
522      was created, and thus, unless in verbose mode, we should be
523      symetrical, and avoid that notification for the main thread
524      here as well.  */
525
526   if (info_verbose)
527     printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid).c_str ());
528   else if (print_thread_events && !main_thread_p)
529     printf_unfiltered (_("[%s exited with code %u]\n"),
530                        target_pid_to_str (ptid).c_str (),
531                        (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
781       gdb_bfd_ref_ptr abfd (gdb_bfd_open (so->so_name, "pei-i386", -1));
782
783       if (abfd == NULL)
784         return so;
785
786       if (bfd_check_format (abfd.get (), bfd_object))
787         text = bfd_get_section_by_name (abfd.get (), ".text");
788
789       if (!text)
790         return so;
791
792       /* The symbols in a dll are offset by 0x1000, which is the
793          offset from 0 of the first byte in an image - because of the
794          file header and the section alignment.  */
795       cygwin_load_start = (CORE_ADDR) (uintptr_t) ((char *)
796                                                    load_addr + 0x1000);
797       cygwin_load_end = cygwin_load_start + bfd_section_size (abfd.get (),
798                                                               text);
799     }
800 #endif
801
802   return so;
803 }
804
805 static char *
806 get_image_name (HANDLE h, void *address, int unicode)
807 {
808 #ifdef __CYGWIN__
809   static char buf[__PMAX];
810 #else
811   static char buf[(2 * __PMAX) + 1];
812 #endif
813   DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
814   char *address_ptr;
815   int len = 0;
816   char b[2];
817   SIZE_T done;
818
819   /* Attempt to read the name of the dll that was detected.
820      This is documented to work only when actively debugging
821      a program.  It will not work for attached processes.  */
822   if (address == NULL)
823     return NULL;
824
825   /* See if we could read the address of a string, and that the
826      address isn't null.  */
827   if (!ReadProcessMemory (h, address,  &address_ptr,
828                           sizeof (address_ptr), &done)
829       || done != sizeof (address_ptr) || !address_ptr)
830     return NULL;
831
832   /* Find the length of the string.  */
833   while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
834          && (b[0] != 0 || b[size - 1] != 0) && done == size)
835     continue;
836
837   if (!unicode)
838     ReadProcessMemory (h, address_ptr, buf, len, &done);
839   else
840     {
841       WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
842       ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
843                          &done);
844 #ifdef __CYGWIN__
845       wcstombs (buf, unicode_address, __PMAX);
846 #else
847       WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
848                            0, 0);
849 #endif
850     }
851
852   return buf;
853 }
854
855 /* Handle a DLL load event, and return 1.
856
857    This function assumes that this event did not occur during inferior
858    initialization, where their event info may be incomplete (see
859    do_initial_windows_stuff and windows_add_all_dlls for more info
860    on how we handle DLL loading during that phase).  */
861
862 static void
863 handle_load_dll ()
864 {
865   LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
866   char *dll_name;
867
868   /* Try getting the DLL name via the lpImageName field of the event.
869      Note that Microsoft documents this fields as strictly optional,
870      in the sense that it might be NULL.  And the first DLL event in
871      particular is explicitly documented as "likely not pass[ed]"
872      (source: MSDN LOAD_DLL_DEBUG_INFO structure).  */
873   dll_name = get_image_name (current_process_handle,
874                              event->lpImageName, event->fUnicode);
875   if (!dll_name)
876     return;
877
878   solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll);
879   solib_end = solib_end->next;
880
881   lm_info_windows *li = (lm_info_windows *) solib_end->lm_info;
882
883   DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end->so_name,
884                  host_address_to_string (li->load_addr)));
885 }
886
887 static void
888 windows_free_so (struct so_list *so)
889 {
890   lm_info_windows *li = (lm_info_windows *) so->lm_info;
891
892   delete li;
893   xfree (so);
894 }
895
896 /* Handle a DLL unload event.
897    Return 1 if successful, or zero otherwise.
898
899    This function assumes that this event did not occur during inferior
900    initialization, where their event info may be incomplete (see
901    do_initial_windows_stuff and windows_add_all_dlls for more info
902    on how we handle DLL loading during that phase).  */
903
904 static void
905 handle_unload_dll ()
906 {
907   LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll;
908   struct so_list *so;
909
910   for (so = &solib_start; so->next != NULL; so = so->next)
911     {
912       lm_info_windows *li_next = (lm_info_windows *) so->next->lm_info;
913
914       if (li_next->load_addr == lpBaseOfDll)
915         {
916           struct so_list *sodel = so->next;
917
918           so->next = sodel->next;
919           if (!so->next)
920             solib_end = so;
921           DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name));
922
923           windows_free_so (sodel);
924           return;
925         }
926     }
927
928   /* We did not find any DLL that was previously loaded at this address,
929      so register a complaint.  We do not report an error, because we have
930      observed that this may be happening under some circumstances.  For
931      instance, running 32bit applications on x64 Windows causes us to receive
932      4 mysterious UNLOAD_DLL_DEBUG_EVENTs during the startup phase (these
933      events are apparently caused by the WOW layer, the interface between
934      32bit and 64bit worlds).  */
935   complaint (_("dll starting at %s not found."),
936              host_address_to_string (lpBaseOfDll));
937 }
938
939 /* Call FUNC wrapped in a TRY/CATCH that swallows all GDB
940    exceptions.  */
941
942 static void
943 catch_errors (void (*func) ())
944 {
945   try
946     {
947       func ();
948     }
949   catch (const gdb_exception &ex)
950     {
951       exception_print (gdb_stderr, ex);
952     }
953 }
954
955 /* Clear list of loaded DLLs.  */
956 static void
957 windows_clear_solib (void)
958 {
959   solib_start.next = NULL;
960   solib_end = &solib_start;
961 }
962
963 static void
964 signal_event_command (const char *args, int from_tty)
965 {
966   uintptr_t event_id = 0;
967   char *endargs = NULL;
968
969   if (args == NULL)
970     error (_("signal-event requires an argument (integer event id)"));
971
972   event_id = strtoumax (args, &endargs, 10);
973
974   if ((errno == ERANGE) || (event_id == 0) || (event_id > UINTPTR_MAX) ||
975       ((HANDLE) event_id == INVALID_HANDLE_VALUE))
976     error (_("Failed to convert `%s' to event id"), args);
977
978   SetEvent ((HANDLE) event_id);
979   CloseHandle ((HANDLE) event_id);
980 }
981
982 /* Handle DEBUG_STRING output from child process.
983    Cygwin prepends its messages with a "cygwin:".  Interpret this as
984    a Cygwin signal.  Otherwise just print the string as a warning.  */
985 static int
986 handle_output_debug_string (struct target_waitstatus *ourstatus)
987 {
988   gdb::unique_xmalloc_ptr<char> s;
989   int retval = 0;
990
991   if (!target_read_string
992         ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
993          &s, 1024, 0)
994       || !s || !*(s.get ()))
995     /* nothing to do */;
996   else if (!startswith (s.get (), _CYGWIN_SIGNAL_STRING))
997     {
998 #ifdef __CYGWIN__
999       if (!startswith (s.get (), "cYg"))
1000 #endif
1001         {
1002           char *p = strchr (s.get (), '\0');
1003
1004           if (p > s.get () && *--p == '\n')
1005             *p = '\0';
1006           warning (("%s"), s.get ());
1007         }
1008     }
1009 #ifdef __CYGWIN__
1010   else
1011     {
1012       /* Got a cygwin signal marker.  A cygwin signal is followed by
1013          the signal number itself and then optionally followed by the
1014          thread id and address to saved context within the DLL.  If
1015          these are supplied, then the given thread is assumed to have
1016          issued the signal and the context from the thread is assumed
1017          to be stored at the given address in the inferior.  Tell gdb
1018          to treat this like a real signal.  */
1019       char *p;
1020       int sig = strtol (s.get () + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
1021       gdb_signal gotasig = gdb_signal_from_host (sig);
1022
1023       ourstatus->value.sig = gotasig;
1024       if (gotasig)
1025         {
1026           LPCVOID x;
1027           SIZE_T n;
1028
1029           ourstatus->kind = TARGET_WAITKIND_STOPPED;
1030           retval = strtoul (p, &p, 0);
1031           if (!retval)
1032             retval = current_event.dwThreadId;
1033           else if ((x = (LPCVOID) (uintptr_t) strtoull (p, NULL, 0))
1034                    && ReadProcessMemory (current_process_handle, x,
1035                                          &saved_context,
1036                                          __COPY_CONTEXT_SIZE, &n)
1037                    && n == __COPY_CONTEXT_SIZE)
1038             have_saved_context = 1;
1039         }
1040     }
1041 #endif
1042
1043   return retval;
1044 }
1045
1046 static int
1047 display_selector (HANDLE thread, DWORD sel)
1048 {
1049   LDT_ENTRY info;
1050   if (GetThreadSelectorEntry (thread, sel, &info))
1051     {
1052       int base, limit;
1053       printf_filtered ("0x%03x: ", (unsigned) sel);
1054       if (!info.HighWord.Bits.Pres)
1055         {
1056           puts_filtered ("Segment not present\n");
1057           return 0;
1058         }
1059       base = (info.HighWord.Bits.BaseHi << 24) +
1060              (info.HighWord.Bits.BaseMid << 16)
1061              + info.BaseLow;
1062       limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
1063       if (info.HighWord.Bits.Granularity)
1064         limit = (limit << 12) | 0xfff;
1065       printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
1066       if (info.HighWord.Bits.Default_Big)
1067         puts_filtered(" 32-bit ");
1068       else
1069         puts_filtered(" 16-bit ");
1070       switch ((info.HighWord.Bits.Type & 0xf) >> 1)
1071         {
1072         case 0:
1073           puts_filtered ("Data (Read-Only, Exp-up");
1074           break;
1075         case 1:
1076           puts_filtered ("Data (Read/Write, Exp-up");
1077           break;
1078         case 2:
1079           puts_filtered ("Unused segment (");
1080           break;
1081         case 3:
1082           puts_filtered ("Data (Read/Write, Exp-down");
1083           break;
1084         case 4:
1085           puts_filtered ("Code (Exec-Only, N.Conf");
1086           break;
1087         case 5:
1088           puts_filtered ("Code (Exec/Read, N.Conf");
1089           break;
1090         case 6:
1091           puts_filtered ("Code (Exec-Only, Conf");
1092           break;
1093         case 7:
1094           puts_filtered ("Code (Exec/Read, Conf");
1095           break;
1096         default:
1097           printf_filtered ("Unknown type 0x%lx",
1098                            (unsigned long) info.HighWord.Bits.Type);
1099         }
1100       if ((info.HighWord.Bits.Type & 0x1) == 0)
1101         puts_filtered(", N.Acc");
1102       puts_filtered (")\n");
1103       if ((info.HighWord.Bits.Type & 0x10) == 0)
1104         puts_filtered("System selector ");
1105       printf_filtered ("Priviledge level = %ld. ",
1106                        (unsigned long) 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   current_thread
1409     = windows_add_thread (ptid_t (current_event.dwProcessId, 0,
1410                                   current_event.dwThreadId),
1411                           current_event.u.CreateThread.hThread,
1412                           current_event.u.CreateThread.lpThreadLocalBase,
1413                           true /* main_thread_p */);
1414   return current_event.dwThreadId;
1415 }
1416
1417 void
1418 windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig)
1419 {
1420   windows_thread_info *th;
1421   DWORD continue_status = DBG_CONTINUE;
1422
1423   /* A specific PTID means `step only this thread id'.  */
1424   int resume_all = ptid == minus_one_ptid;
1425
1426   /* If we're continuing all threads, it's the current inferior that
1427      should be handled specially.  */
1428   if (resume_all)
1429     ptid = inferior_ptid;
1430
1431   if (sig != GDB_SIGNAL_0)
1432     {
1433       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1434         {
1435           DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1436         }
1437       else if (sig == last_sig)
1438         continue_status = DBG_EXCEPTION_NOT_HANDLED;
1439       else
1440 #if 0
1441 /* This code does not seem to work, because
1442   the kernel does probably not consider changes in the ExceptionRecord
1443   structure when passing the exception to the inferior.
1444   Note that this seems possible in the exception handler itself.  */
1445         {
1446           for (const xlate_exception &x : xlate)
1447             if (x.us == sig)
1448               {
1449                 current_event.u.Exception.ExceptionRecord.ExceptionCode
1450                   = x.them;
1451                 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1452                 break;
1453               }
1454           if (continue_status == DBG_CONTINUE)
1455             {
1456               DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1457             }
1458         }
1459 #endif
1460         DEBUG_EXCEPT(("Can only continue with received signal %d.\n",
1461           last_sig));
1462     }
1463
1464   last_sig = GDB_SIGNAL_0;
1465
1466   DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
1467                ptid.pid (), ptid.tid (), step, sig));
1468
1469   /* Get context for currently selected thread.  */
1470   th = thread_rec (inferior_ptid.tid (), FALSE);
1471   if (th)
1472     {
1473       if (step)
1474         {
1475           /* Single step by setting t bit.  */
1476           struct regcache *regcache = get_current_regcache ();
1477           struct gdbarch *gdbarch = regcache->arch ();
1478           fetch_registers (regcache, gdbarch_ps_regnum (gdbarch));
1479           th->context.EFlags |= FLAG_TRACE_BIT;
1480         }
1481
1482       if (th->context.ContextFlags)
1483         {
1484           if (debug_registers_changed)
1485             {
1486               th->context.Dr0 = dr[0];
1487               th->context.Dr1 = dr[1];
1488               th->context.Dr2 = dr[2];
1489               th->context.Dr3 = dr[3];
1490               th->context.Dr6 = DR6_CLEAR_VALUE;
1491               th->context.Dr7 = dr[7];
1492             }
1493           CHECK (SetThreadContext (th->h, &th->context));
1494           th->context.ContextFlags = 0;
1495         }
1496     }
1497
1498   /* Allow continuing with the same signal that interrupted us.
1499      Otherwise complain.  */
1500
1501   if (resume_all)
1502     windows_continue (continue_status, -1, 0);
1503   else
1504     windows_continue (continue_status, ptid.tid (), 0);
1505 }
1506
1507 /* Ctrl-C handler used when the inferior is not run in the same console.  The
1508    handler is in charge of interrupting the inferior using DebugBreakProcess.
1509    Note that this function is not available prior to Windows XP.  In this case
1510    we emit a warning.  */
1511 static BOOL WINAPI
1512 ctrl_c_handler (DWORD event_type)
1513 {
1514   const int attach_flag = current_inferior ()->attach_flag;
1515
1516   /* Only handle Ctrl-C and Ctrl-Break events.  Ignore others.  */
1517   if (event_type != CTRL_C_EVENT && event_type != CTRL_BREAK_EVENT)
1518     return FALSE;
1519
1520   /* If the inferior and the debugger share the same console, do nothing as
1521      the inferior has also received the Ctrl-C event.  */
1522   if (!new_console && !attach_flag)
1523     return TRUE;
1524
1525   if (!DebugBreakProcess (current_process_handle))
1526     warning (_("Could not interrupt program.  "
1527                "Press Ctrl-c in the program console."));
1528
1529   /* Return true to tell that Ctrl-C has been handled.  */
1530   return TRUE;
1531 }
1532
1533 /* Get the next event from the child.  Returns a non-zero thread id if the event
1534    requires handling by WFI (or whatever).  */
1535 static int
1536 get_windows_debug_event (struct target_ops *ops,
1537                          int pid, struct target_waitstatus *ourstatus)
1538 {
1539   BOOL debug_event;
1540   DWORD continue_status, event_code;
1541   windows_thread_info *th;
1542   static windows_thread_info dummy_thread_info;
1543   DWORD thread_id = 0;
1544
1545   last_sig = GDB_SIGNAL_0;
1546
1547   if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1548     goto out;
1549
1550   event_count++;
1551   continue_status = DBG_CONTINUE;
1552
1553   event_code = current_event.dwDebugEventCode;
1554   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1555   th = NULL;
1556   have_saved_context = 0;
1557
1558   switch (event_code)
1559     {
1560     case CREATE_THREAD_DEBUG_EVENT:
1561       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1562                      (unsigned) current_event.dwProcessId,
1563                      (unsigned) current_event.dwThreadId,
1564                      "CREATE_THREAD_DEBUG_EVENT"));
1565       if (saw_create != 1)
1566         {
1567           struct inferior *inf;
1568           inf = find_inferior_pid (current_event.dwProcessId);
1569           if (!saw_create && inf->attach_flag)
1570             {
1571               /* Kludge around a Windows bug where first event is a create
1572                  thread event.  Caused when attached process does not have
1573                  a main thread.  */
1574               thread_id = fake_create_process ();
1575               if (thread_id)
1576                 saw_create++;
1577             }
1578           break;
1579         }
1580       /* Record the existence of this thread.  */
1581       thread_id = current_event.dwThreadId;
1582       th = windows_add_thread
1583         (ptid_t (current_event.dwProcessId, 0, current_event.dwThreadId),
1584          current_event.u.CreateThread.hThread,
1585          current_event.u.CreateThread.lpThreadLocalBase,
1586          false /* main_thread_p */);
1587
1588       break;
1589
1590     case EXIT_THREAD_DEBUG_EVENT:
1591       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1592                      (unsigned) current_event.dwProcessId,
1593                      (unsigned) current_event.dwThreadId,
1594                      "EXIT_THREAD_DEBUG_EVENT"));
1595       windows_delete_thread (ptid_t (current_event.dwProcessId, 0,
1596                                      current_event.dwThreadId),
1597                              current_event.u.ExitThread.dwExitCode,
1598                              false /* main_thread_p */);
1599       th = &dummy_thread_info;
1600       break;
1601
1602     case CREATE_PROCESS_DEBUG_EVENT:
1603       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1604                      (unsigned) current_event.dwProcessId,
1605                      (unsigned) current_event.dwThreadId,
1606                      "CREATE_PROCESS_DEBUG_EVENT"));
1607       CloseHandle (current_event.u.CreateProcessInfo.hFile);
1608       if (++saw_create != 1)
1609         break;
1610
1611       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1612       /* Add the main thread.  */
1613       th = windows_add_thread
1614         (ptid_t (current_event.dwProcessId, 0,
1615                  current_event.dwThreadId),
1616          current_event.u.CreateProcessInfo.hThread,
1617          current_event.u.CreateProcessInfo.lpThreadLocalBase,
1618          true /* main_thread_p */);
1619       thread_id = current_event.dwThreadId;
1620       break;
1621
1622     case EXIT_PROCESS_DEBUG_EVENT:
1623       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1624                      (unsigned) current_event.dwProcessId,
1625                      (unsigned) current_event.dwThreadId,
1626                      "EXIT_PROCESS_DEBUG_EVENT"));
1627       if (!windows_initialization_done)
1628         {
1629           target_terminal::ours ();
1630           target_mourn_inferior (inferior_ptid);
1631           error (_("During startup program exited with code 0x%x."),
1632                  (unsigned int) current_event.u.ExitProcess.dwExitCode);
1633         }
1634       else if (saw_create == 1)
1635         {
1636           windows_delete_thread (ptid_t (current_event.dwProcessId, 0,
1637                                          current_event.dwThreadId),
1638                                  0, true /* main_thread_p */);
1639           ourstatus->kind = TARGET_WAITKIND_EXITED;
1640           ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1641           thread_id = current_event.dwThreadId;
1642         }
1643       break;
1644
1645     case LOAD_DLL_DEBUG_EVENT:
1646       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1647                      (unsigned) current_event.dwProcessId,
1648                      (unsigned) current_event.dwThreadId,
1649                      "LOAD_DLL_DEBUG_EVENT"));
1650       CloseHandle (current_event.u.LoadDll.hFile);
1651       if (saw_create != 1 || ! windows_initialization_done)
1652         break;
1653       catch_errors (handle_load_dll);
1654       ourstatus->kind = TARGET_WAITKIND_LOADED;
1655       ourstatus->value.integer = 0;
1656       thread_id = current_event.dwThreadId;
1657       break;
1658
1659     case UNLOAD_DLL_DEBUG_EVENT:
1660       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1661                      (unsigned) current_event.dwProcessId,
1662                      (unsigned) current_event.dwThreadId,
1663                      "UNLOAD_DLL_DEBUG_EVENT"));
1664       if (saw_create != 1 || ! windows_initialization_done)
1665         break;
1666       catch_errors (handle_unload_dll);
1667       ourstatus->kind = TARGET_WAITKIND_LOADED;
1668       ourstatus->value.integer = 0;
1669       thread_id = current_event.dwThreadId;
1670       break;
1671
1672     case EXCEPTION_DEBUG_EVENT:
1673       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1674                      (unsigned) current_event.dwProcessId,
1675                      (unsigned) current_event.dwThreadId,
1676                      "EXCEPTION_DEBUG_EVENT"));
1677       if (saw_create != 1)
1678         break;
1679       switch (handle_exception (ourstatus))
1680         {
1681         case HANDLE_EXCEPTION_UNHANDLED:
1682         default:
1683           continue_status = DBG_EXCEPTION_NOT_HANDLED;
1684           break;
1685         case HANDLE_EXCEPTION_HANDLED:
1686           thread_id = current_event.dwThreadId;
1687           break;
1688         case HANDLE_EXCEPTION_IGNORED:
1689           continue_status = DBG_CONTINUE;
1690           break;
1691         }
1692       break;
1693
1694     case OUTPUT_DEBUG_STRING_EVENT:     /* Message from the kernel.  */
1695       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1696                      (unsigned) current_event.dwProcessId,
1697                      (unsigned) current_event.dwThreadId,
1698                      "OUTPUT_DEBUG_STRING_EVENT"));
1699       if (saw_create != 1)
1700         break;
1701       thread_id = handle_output_debug_string (ourstatus);
1702       break;
1703
1704     default:
1705       if (saw_create != 1)
1706         break;
1707       printf_unfiltered ("gdb: kernel event for pid=%u tid=0x%x\n",
1708                          (unsigned) current_event.dwProcessId,
1709                          (unsigned) current_event.dwThreadId);
1710       printf_unfiltered ("                 unknown event code %u\n",
1711                          (unsigned) current_event.dwDebugEventCode);
1712       break;
1713     }
1714
1715   if (!thread_id || saw_create != 1)
1716     {
1717       CHECK (windows_continue (continue_status, -1, 0));
1718     }
1719   else
1720     {
1721       inferior_ptid = ptid_t (current_event.dwProcessId, 0, thread_id);
1722       current_thread = th;
1723       if (!current_thread)
1724         current_thread = thread_rec (thread_id, TRUE);
1725     }
1726
1727 out:
1728   return thread_id;
1729 }
1730
1731 /* Wait for interesting events to occur in the target process.  */
1732 ptid_t
1733 windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
1734                           int options)
1735 {
1736   int pid = -1;
1737
1738   /* We loop when we get a non-standard exception rather than return
1739      with a SPURIOUS because resume can try and step or modify things,
1740      which needs a current_thread->h.  But some of these exceptions mark
1741      the birth or death of threads, which mean that the current thread
1742      isn't necessarily what you think it is.  */
1743
1744   while (1)
1745     {
1746       int retval;
1747
1748       /* If the user presses Ctrl-c while the debugger is waiting
1749          for an event, he expects the debugger to interrupt his program
1750          and to get the prompt back.  There are two possible situations:
1751
1752            - The debugger and the program do not share the console, in
1753              which case the Ctrl-c event only reached the debugger.
1754              In that case, the ctrl_c handler will take care of interrupting
1755              the inferior.  Note that this case is working starting with
1756              Windows XP.  For Windows 2000, Ctrl-C should be pressed in the
1757              inferior console.
1758
1759            - The debugger and the program share the same console, in which
1760              case both debugger and inferior will receive the Ctrl-c event.
1761              In that case the ctrl_c handler will ignore the event, as the
1762              Ctrl-c event generated inside the inferior will trigger the
1763              expected debug event.
1764
1765              FIXME: brobecker/2008-05-20: If the inferior receives the
1766              signal first and the delay until GDB receives that signal
1767              is sufficiently long, GDB can sometimes receive the SIGINT
1768              after we have unblocked the CTRL+C handler.  This would
1769              lead to the debugger stopping prematurely while handling
1770              the new-thread event that comes with the handling of the SIGINT
1771              inside the inferior, and then stop again immediately when
1772              the user tries to resume the execution in the inferior.
1773              This is a classic race that we should try to fix one day.  */
1774       SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
1775       retval = get_windows_debug_event (this, pid, ourstatus);
1776       SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
1777
1778       if (retval)
1779         return ptid_t (current_event.dwProcessId, 0, retval);
1780       else
1781         {
1782           int detach = 0;
1783
1784           if (deprecated_ui_loop_hook != NULL)
1785             detach = deprecated_ui_loop_hook (0);
1786
1787           if (detach)
1788             kill ();
1789         }
1790     }
1791 }
1792
1793 /* Iterate over all DLLs currently mapped by our inferior, and
1794    add them to our list of solibs.  */
1795
1796 static void
1797 windows_add_all_dlls (void)
1798 {
1799   HMODULE dummy_hmodule;
1800   DWORD cb_needed;
1801   HMODULE *hmodules;
1802   int i;
1803
1804   if (EnumProcessModules (current_process_handle, &dummy_hmodule,
1805                           sizeof (HMODULE), &cb_needed) == 0)
1806     return;
1807
1808   if (cb_needed < 1)
1809     return;
1810
1811   hmodules = (HMODULE *) alloca (cb_needed);
1812   if (EnumProcessModules (current_process_handle, hmodules,
1813                           cb_needed, &cb_needed) == 0)
1814     return;
1815
1816   for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
1817     {
1818       MODULEINFO mi;
1819 #ifdef __USEWIDE
1820       wchar_t dll_name[__PMAX];
1821       char name[__PMAX];
1822 #else
1823       char dll_name[__PMAX];
1824       char *name;
1825 #endif
1826       if (GetModuleInformation (current_process_handle, hmodules[i],
1827                                 &mi, sizeof (mi)) == 0)
1828         continue;
1829       if (GetModuleFileNameEx (current_process_handle, hmodules[i],
1830                                dll_name, sizeof (dll_name)) == 0)
1831         continue;
1832 #ifdef __USEWIDE
1833       wcstombs (name, dll_name, __PMAX);
1834 #else
1835       name = dll_name;
1836 #endif
1837
1838       solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
1839       solib_end = solib_end->next;
1840     }
1841 }
1842
1843 static void
1844 do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
1845 {
1846   int i;
1847   struct inferior *inf;
1848
1849   last_sig = GDB_SIGNAL_0;
1850   event_count = 0;
1851   exception_count = 0;
1852   open_process_used = 0;
1853   debug_registers_changed = 0;
1854   debug_registers_used = 0;
1855   for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1856     dr[i] = 0;
1857 #ifdef __CYGWIN__
1858   cygwin_load_start = cygwin_load_end = 0;
1859 #endif
1860   current_event.dwProcessId = pid;
1861   memset (&current_event, 0, sizeof (current_event));
1862   if (!target_is_pushed (ops))
1863     push_target (ops);
1864   disable_breakpoints_in_shlibs ();
1865   windows_clear_solib ();
1866   clear_proceed_status (0);
1867   init_wait_for_inferior ();
1868
1869   inf = current_inferior ();
1870   inferior_appeared (inf, pid);
1871   inf->attach_flag = attaching;
1872
1873   /* Make the new process the current inferior, so terminal handling
1874      can rely on it.  When attaching, we don't know about any thread
1875      id here, but that's OK --- nothing should be referencing the
1876      current thread until we report an event out of windows_wait.  */
1877   inferior_ptid = ptid_t (pid);
1878
1879   target_terminal::init ();
1880   target_terminal::inferior ();
1881
1882   windows_initialization_done = 0;
1883
1884   while (1)
1885     {
1886       struct target_waitstatus status;
1887
1888       ops->wait (minus_one_ptid, &status, 0);
1889
1890       /* Note windows_wait returns TARGET_WAITKIND_SPURIOUS for thread
1891          events.  */
1892       if (status.kind != TARGET_WAITKIND_LOADED
1893           && status.kind != TARGET_WAITKIND_SPURIOUS)
1894         break;
1895
1896       ops->resume (minus_one_ptid, 0, GDB_SIGNAL_0);
1897     }
1898
1899   /* Now that the inferior has been started and all DLLs have been mapped,
1900      we can iterate over all DLLs and load them in.
1901
1902      We avoid doing it any earlier because, on certain versions of Windows,
1903      LOAD_DLL_DEBUG_EVENTs are sometimes not complete.  In particular,
1904      we have seen on Windows 8.1 that the ntdll.dll load event does not
1905      include the DLL name, preventing us from creating an associated SO.
1906      A possible explanation is that ntdll.dll might be mapped before
1907      the SO info gets created by the Windows system -- ntdll.dll is
1908      the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
1909      do not seem to suffer from that problem.
1910
1911      Rather than try to work around this sort of issue, it is much
1912      simpler to just ignore DLL load/unload events during the startup
1913      phase, and then process them all in one batch now.  */
1914   windows_add_all_dlls ();
1915
1916   windows_initialization_done = 1;
1917   return;
1918 }
1919
1920 /* Try to set or remove a user privilege to the current process.  Return -1
1921    if that fails, the previous setting of that privilege otherwise.
1922
1923    This code is copied from the Cygwin source code and rearranged to allow
1924    dynamically loading of the needed symbols from advapi32 which is only
1925    available on NT/2K/XP.  */
1926 static int
1927 set_process_privilege (const char *privilege, BOOL enable)
1928 {
1929   HANDLE token_hdl = NULL;
1930   LUID restore_priv;
1931   TOKEN_PRIVILEGES new_priv, orig_priv;
1932   int ret = -1;
1933   DWORD size;
1934
1935   if (!OpenProcessToken (GetCurrentProcess (),
1936                          TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1937                          &token_hdl))
1938     goto out;
1939
1940   if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
1941     goto out;
1942
1943   new_priv.PrivilegeCount = 1;
1944   new_priv.Privileges[0].Luid = restore_priv;
1945   new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1946
1947   if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1948                               sizeof orig_priv, &orig_priv, &size))
1949     goto out;
1950 #if 0
1951   /* Disabled, otherwise every `attach' in an unprivileged user session
1952      would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1953      windows_attach().  */
1954   /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1955      be enabled.  GetLastError () returns an correct error code, though.  */
1956   if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1957     goto out;
1958 #endif
1959
1960   ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1961
1962 out:
1963   if (token_hdl)
1964     CloseHandle (token_hdl);
1965
1966   return ret;
1967 }
1968
1969 /* Attach to process PID, then initialize for debugging it.  */
1970
1971 void
1972 windows_nat_target::attach (const char *args, int from_tty)
1973 {
1974   BOOL ok;
1975   DWORD pid;
1976
1977   pid = parse_pid_to_attach (args);
1978
1979   if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1980     {
1981       printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1982       printf_unfiltered ("This can cause attach to "
1983                          "fail on Windows NT/2K/XP\n");
1984     }
1985
1986   windows_init_thread_list ();
1987   ok = DebugActiveProcess (pid);
1988   saw_create = 0;
1989
1990 #ifdef __CYGWIN__
1991   if (!ok)
1992     {
1993       /* Try fall back to Cygwin pid.  */
1994       pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1995
1996       if (pid > 0)
1997         ok = DebugActiveProcess (pid);
1998   }
1999 #endif
2000
2001   if (!ok)
2002     error (_("Can't attach to process."));
2003
2004   DebugSetProcessKillOnExit (FALSE);
2005
2006   if (from_tty)
2007     {
2008       char *exec_file = (char *) get_exec_file (0);
2009
2010       if (exec_file)
2011         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
2012                            target_pid_to_str (ptid_t (pid)).c_str ());
2013       else
2014         printf_unfiltered ("Attaching to %s\n",
2015                            target_pid_to_str (ptid_t (pid)).c_str ());
2016     }
2017
2018   do_initial_windows_stuff (this, pid, 1);
2019   target_terminal::ours ();
2020 }
2021
2022 void
2023 windows_nat_target::detach (inferior *inf, int from_tty)
2024 {
2025   int detached = 1;
2026
2027   ptid_t ptid = minus_one_ptid;
2028   resume (ptid, 0, GDB_SIGNAL_0);
2029
2030   if (!DebugActiveProcessStop (current_event.dwProcessId))
2031     {
2032       error (_("Can't detach process %u (error %u)"),
2033              (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
2034       detached = 0;
2035     }
2036   DebugSetProcessKillOnExit (FALSE);
2037
2038   if (detached && from_tty)
2039     {
2040       const char *exec_file = get_exec_file (0);
2041       if (exec_file == 0)
2042         exec_file = "";
2043       printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
2044                          (unsigned) current_event.dwProcessId);
2045     }
2046
2047   x86_cleanup_dregs ();
2048   inferior_ptid = null_ptid;
2049   detach_inferior (inf);
2050
2051   maybe_unpush_target ();
2052 }
2053
2054 /* Try to determine the executable filename.
2055
2056    EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
2057
2058    Upon success, the filename is stored inside EXE_NAME_RET, and
2059    this function returns nonzero.
2060
2061    Otherwise, this function returns zero and the contents of
2062    EXE_NAME_RET is undefined.  */
2063
2064 static int
2065 windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len)
2066 {
2067   DWORD len;
2068   HMODULE dh_buf;
2069   DWORD cbNeeded;
2070
2071   cbNeeded = 0;
2072   if (!EnumProcessModules (current_process_handle, &dh_buf,
2073                            sizeof (HMODULE), &cbNeeded) || !cbNeeded)
2074     return 0;
2075
2076   /* We know the executable is always first in the list of modules,
2077      which we just fetched.  So no need to fetch more.  */
2078
2079 #ifdef __CYGWIN__
2080   {
2081     /* Cygwin prefers that the path be in /x/y/z format, so extract
2082        the filename into a temporary buffer first, and then convert it
2083        to POSIX format into the destination buffer.  */
2084     cygwin_buf_t *pathbuf = (cygwin_buf_t *) alloca (exe_name_max_len * sizeof (cygwin_buf_t));
2085
2086     len = GetModuleFileNameEx (current_process_handle,
2087                                dh_buf, pathbuf, exe_name_max_len);
2088     if (len == 0)
2089       error (_("Error getting executable filename: %u."),
2090              (unsigned) GetLastError ());
2091     if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, exe_name_ret,
2092                           exe_name_max_len) < 0)
2093       error (_("Error converting executable filename to POSIX: %d."), errno);
2094   }
2095 #else
2096   len = GetModuleFileNameEx (current_process_handle,
2097                              dh_buf, exe_name_ret, exe_name_max_len);
2098   if (len == 0)
2099     error (_("Error getting executable filename: %u."),
2100            (unsigned) GetLastError ());
2101 #endif
2102
2103     return 1;   /* success */
2104 }
2105
2106 /* The pid_to_exec_file target_ops method for this platform.  */
2107
2108 char *
2109 windows_nat_target::pid_to_exec_file (int pid)
2110 {
2111   static char path[__PMAX];
2112 #ifdef __CYGWIN__
2113   /* Try to find exe name as symlink target of /proc/<pid>/exe.  */
2114   int nchars;
2115   char procexe[sizeof ("/proc/4294967295/exe")];
2116
2117   xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
2118   nchars = readlink (procexe, path, sizeof(path));
2119   if (nchars > 0 && nchars < sizeof (path))
2120     {
2121       path[nchars] = '\0';      /* Got it */
2122       return path;
2123     }
2124 #endif
2125
2126   /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
2127      of gdb, or we're trying to debug a non-Cygwin windows executable.  */
2128   if (!windows_get_exec_module_filename (path, sizeof (path)))
2129     path[0] = '\0';
2130
2131   return path;
2132 }
2133
2134 /* Print status information about what we're accessing.  */
2135
2136 void
2137 windows_nat_target::files_info ()
2138 {
2139   struct inferior *inf = current_inferior ();
2140
2141   printf_unfiltered ("\tUsing the running image of %s %s.\n",
2142                      inf->attach_flag ? "attached" : "child",
2143                      target_pid_to_str (inferior_ptid).c_str ());
2144 }
2145
2146 /* Modify CreateProcess parameters for use of a new separate console.
2147    Parameters are:
2148    *FLAGS: DWORD parameter for general process creation flags.
2149    *SI: STARTUPINFO structure, for which the console window size and
2150    console buffer size is filled in if GDB is running in a console.
2151    to create the new console.
2152    The size of the used font is not available on all versions of
2153    Windows OS.  Furthermore, the current font might not be the default
2154    font, but this is still better than before.
2155    If the windows and buffer sizes are computed,
2156    SI->DWFLAGS is changed so that this information is used
2157    by CreateProcess function.  */
2158
2159 static void
2160 windows_set_console_info (STARTUPINFO *si, DWORD *flags)
2161 {
2162   HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
2163                                 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
2164
2165   if (hconsole != INVALID_HANDLE_VALUE)
2166     {
2167       CONSOLE_SCREEN_BUFFER_INFO sbinfo;
2168       COORD font_size;
2169       CONSOLE_FONT_INFO cfi;
2170
2171       GetCurrentConsoleFont (hconsole, FALSE, &cfi);
2172       font_size = GetConsoleFontSize (hconsole, cfi.nFont);
2173       GetConsoleScreenBufferInfo(hconsole, &sbinfo);
2174       si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
2175       si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
2176       if (font_size.X)
2177         si->dwXSize *= font_size.X;
2178       else
2179         si->dwXSize *= 8;
2180       if (font_size.Y)
2181         si->dwYSize *= font_size.Y;
2182       else
2183         si->dwYSize *= 12;
2184       si->dwXCountChars = sbinfo.dwSize.X;
2185       si->dwYCountChars = sbinfo.dwSize.Y;
2186       si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
2187     }
2188   *flags |= CREATE_NEW_CONSOLE;
2189 }
2190
2191 #ifndef __CYGWIN__
2192 /* Function called by qsort to sort environment strings.  */
2193
2194 static int
2195 envvar_cmp (const void *a, const void *b)
2196 {
2197   const char **p = (const char **) a;
2198   const char **q = (const char **) b;
2199   return strcasecmp (*p, *q);
2200 }
2201 #endif
2202
2203 #ifdef __CYGWIN__
2204 static void
2205 clear_win32_environment (char **env)
2206 {
2207   int i;
2208   size_t len;
2209   wchar_t *copy = NULL, *equalpos;
2210
2211   for (i = 0; env[i] && *env[i]; i++)
2212     {
2213       len = mbstowcs (NULL, env[i], 0) + 1;
2214       copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2215       mbstowcs (copy, env[i], len);
2216       equalpos = wcschr (copy, L'=');
2217       if (equalpos)
2218         *equalpos = L'\0';
2219       SetEnvironmentVariableW (copy, NULL);
2220     }
2221   xfree (copy);
2222 }
2223 #endif
2224
2225 #ifndef __CYGWIN__
2226
2227 /* Redirection of inferior I/O streams for native MS-Windows programs.
2228    Unlike on Unix, where this is handled by invoking the inferior via
2229    the shell, on MS-Windows we need to emulate the cmd.exe shell.
2230
2231    The official documentation of the cmd.exe redirection features is here:
2232
2233      http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx
2234
2235    (That page talks about Windows XP, but there's no newer
2236    documentation, so we assume later versions of cmd.exe didn't change
2237    anything.)
2238
2239    Caveat: the documentation on that page seems to include a few lies.
2240    For example, it describes strange constructs 1<&2 and 2<&1, which
2241    seem to work only when 1>&2 resp. 2>&1 would make sense, and so I
2242    think the cmd.exe parser of the redirection symbols simply doesn't
2243    care about the < vs > distinction in these cases.  Therefore, the
2244    supported features are explicitly documented below.
2245
2246    The emulation below aims at supporting all the valid use cases
2247    supported by cmd.exe, which include:
2248
2249      < FILE    redirect standard input from FILE
2250      0< FILE   redirect standard input from FILE
2251      <&N       redirect standard input from file descriptor N
2252      0<&N      redirect standard input from file descriptor N
2253      > FILE    redirect standard output to FILE
2254      >> FILE   append standard output to FILE
2255      1>> FILE  append standard output to FILE
2256      >&N       redirect standard output to file descriptor N
2257      1>&N      redirect standard output to file descriptor N
2258      >>&N      append standard output to file descriptor N
2259      1>>&N     append standard output to file descriptor N
2260      2> FILE   redirect standard error to FILE
2261      2>> FILE  append standard error to FILE
2262      2>&N      redirect standard error to file descriptor N
2263      2>>&N     append standard error to file descriptor N
2264
2265      Note that using N > 2 in the above construct is supported, but
2266      requires that the corresponding file descriptor be open by some
2267      means elsewhere or outside GDB.  Also note that using ">&0" or
2268      "<&2" will generally fail, because the file descriptor redirected
2269      from is normally open in an incompatible mode (e.g., FD 0 is open
2270      for reading only).  IOW, use of such tricks is not recommended;
2271      you are on your own.
2272
2273      We do NOT support redirection of file descriptors above 2, as in
2274      "3>SOME-FILE", because MinGW compiled programs don't (supporting
2275      that needs special handling in the startup code that MinGW
2276      doesn't have).  Pipes are also not supported.
2277
2278      As for invalid use cases, where the redirection contains some
2279      error, the emulation below will detect that and produce some
2280      error and/or failure.  But the behavior in those cases is not
2281      bug-for-bug compatible with what cmd.exe does in those cases.
2282      That's because what cmd.exe does then is not well defined, and
2283      seems to be a side effect of the cmd.exe parsing of the command
2284      line more than anything else.  For example, try redirecting to an
2285      invalid file name, as in "> foo:bar".
2286
2287      There are also minor syntactic deviations from what cmd.exe does
2288      in some corner cases.  For example, it doesn't support the likes
2289      of "> &foo" to mean redirect to file named literally "&foo"; we
2290      do support that here, because that, too, sounds like some issue
2291      with the cmd.exe parser.  Another nicety is that we support
2292      redirection targets that use file names with forward slashes,
2293      something cmd.exe doesn't -- this comes in handy since GDB
2294      file-name completion can be used when typing the command line for
2295      the inferior.  */
2296
2297 /* Support routines for redirecting standard handles of the inferior.  */
2298
2299 /* Parse a single redirection spec, open/duplicate the specified
2300    file/fd, and assign the appropriate value to one of the 3 standard
2301    file descriptors. */
2302 static int
2303 redir_open (const char *redir_string, int *inp, int *out, int *err)
2304 {
2305   int *fd, ref_fd = -2;
2306   int mode;
2307   const char *fname = redir_string + 1;
2308   int rc = *redir_string;
2309
2310   switch (rc)
2311     {
2312     case '0':
2313       fname++;
2314       /* FALLTHROUGH */
2315     case '<':
2316       fd = inp;
2317       mode = O_RDONLY;
2318       break;
2319     case '1': case '2':
2320       fname++;
2321       /* FALLTHROUGH */
2322     case '>':
2323       fd = (rc == '2') ? err : out;
2324       mode = O_WRONLY | O_CREAT;
2325       if (*fname == '>')
2326         {
2327           fname++;
2328           mode |= O_APPEND;
2329         }
2330       else
2331         mode |= O_TRUNC;
2332       break;
2333     default:
2334       return -1;
2335     }
2336
2337   if (*fname == '&' && '0' <= fname[1] && fname[1] <= '9')
2338     {
2339       /* A reference to a file descriptor.  */
2340       char *fdtail;
2341       ref_fd = (int) strtol (fname + 1, &fdtail, 10);
2342       if (fdtail > fname + 1 && *fdtail == '\0')
2343         {
2344           /* Don't allow redirection when open modes are incompatible.  */
2345           if ((ref_fd == 0 && (fd == out || fd == err))
2346               || ((ref_fd == 1 || ref_fd == 2) && fd == inp))
2347             {
2348               errno = EPERM;
2349               return -1;
2350             }
2351           if (ref_fd == 0)
2352             ref_fd = *inp;
2353           else if (ref_fd == 1)
2354             ref_fd = *out;
2355           else if (ref_fd == 2)
2356             ref_fd = *err;
2357         }
2358       else
2359         {
2360           errno = EBADF;
2361           return -1;
2362         }
2363     }
2364   else
2365     fname++;    /* skip the separator space */
2366   /* If the descriptor is already open, close it.  This allows
2367      multiple specs of redirections for the same stream, which is
2368      somewhat nonsensical, but still valid and supported by cmd.exe.
2369      (But cmd.exe only opens a single file in this case, the one
2370      specified by the last redirection spec on the command line.)  */
2371   if (*fd >= 0)
2372     _close (*fd);
2373   if (ref_fd == -2)
2374     {
2375       *fd = _open (fname, mode, _S_IREAD | _S_IWRITE);
2376       if (*fd < 0)
2377         return -1;
2378     }
2379   else if (ref_fd == -1)
2380     *fd = -1;   /* reset to default destination */
2381   else
2382     {
2383       *fd = _dup (ref_fd);
2384       if (*fd < 0)
2385         return -1;
2386     }
2387   /* _open just sets a flag for O_APPEND, which won't be passed to the
2388      inferior, so we need to actually move the file pointer.  */
2389   if ((mode & O_APPEND) != 0)
2390     _lseek (*fd, 0L, SEEK_END);
2391   return 0;
2392 }
2393
2394 /* Canonicalize a single redirection spec and set up the corresponding
2395    file descriptor as specified.  */
2396 static int
2397 redir_set_redirection (const char *s, int *inp, int *out, int *err)
2398 {
2399   char buf[__PMAX + 2 + 5]; /* extra space for quotes & redirection string */
2400   char *d = buf;
2401   const char *start = s;
2402   int quote = 0;
2403
2404   *d++ = *s++;  /* copy the 1st character, < or > or a digit */
2405   if ((*start == '>' || *start == '1' || *start == '2')
2406       && *s == '>')
2407     {
2408       *d++ = *s++;
2409       if (*s == '>' && *start != '>')
2410         *d++ = *s++;
2411     }
2412   else if (*start == '0' && *s == '<')
2413     *d++ = *s++;
2414   /* cmd.exe recognizes "&N" only immediately after the redirection symbol.  */
2415   if (*s != '&')
2416     {
2417       while (isspace (*s))  /* skip whitespace before file name */
2418         s++;
2419       *d++ = ' ';           /* separate file name with a single space */
2420     }
2421
2422   /* Copy the file name.  */
2423   while (*s)
2424     {
2425       /* Remove quoting characters from the file name in buf[].  */
2426       if (*s == '"')    /* could support '..' quoting here */
2427         {
2428           if (!quote)
2429             quote = *s++;
2430           else if (*s == quote)
2431             {
2432               quote = 0;
2433               s++;
2434             }
2435           else
2436             *d++ = *s++;
2437         }
2438       else if (*s == '\\')
2439         {
2440           if (s[1] == '"')      /* could support '..' here */
2441             s++;
2442           *d++ = *s++;
2443         }
2444       else if (isspace (*s) && !quote)
2445         break;
2446       else
2447         *d++ = *s++;
2448       if (d - buf >= sizeof (buf) - 1)
2449         {
2450           errno = ENAMETOOLONG;
2451           return 0;
2452         }
2453     }
2454   *d = '\0';
2455
2456   /* Windows doesn't allow redirection characters in file names, so we
2457      can bail out early if they use them, or if there's no target file
2458      name after the redirection symbol.  */
2459   if (d[-1] == '>' || d[-1] == '<')
2460     {
2461       errno = ENOENT;
2462       return 0;
2463     }
2464   if (redir_open (buf, inp, out, err) == 0)
2465     return s - start;
2466   return 0;
2467 }
2468
2469 /* Parse the command line for redirection specs and prepare the file
2470    descriptors for the 3 standard streams accordingly.  */
2471 static bool
2472 redirect_inferior_handles (const char *cmd_orig, char *cmd,
2473                            int *inp, int *out, int *err)
2474 {
2475   const char *s = cmd_orig;
2476   char *d = cmd;
2477   int quote = 0;
2478   bool retval = false;
2479
2480   while (isspace (*s))
2481     *d++ = *s++;
2482
2483   while (*s)
2484     {
2485       if (*s == '"')    /* could also support '..' quoting here */
2486         {
2487           if (!quote)
2488             quote = *s;
2489           else if (*s == quote)
2490             quote = 0;
2491         }
2492       else if (*s == '\\')
2493         {
2494           if (s[1] == '"')      /* escaped quote char */
2495             s++;
2496         }
2497       else if (!quote)
2498         {
2499           /* Process a single redirection candidate.  */
2500           if (*s == '<' || *s == '>'
2501               || ((*s == '1' || *s == '2') && s[1] == '>')
2502               || (*s == '0' && s[1] == '<'))
2503             {
2504               int skip = redir_set_redirection (s, inp, out, err);
2505
2506               if (skip <= 0)
2507                 return false;
2508               retval = true;
2509               s += skip;
2510             }
2511         }
2512       if (*s)
2513         *d++ = *s++;
2514     }
2515   *d = '\0';
2516   return retval;
2517 }
2518 #endif  /* !__CYGWIN__ */
2519
2520 /* Start an inferior windows child process and sets inferior_ptid to its pid.
2521    EXEC_FILE is the file to run.
2522    ALLARGS is a string containing the arguments to the program.
2523    ENV is the environment vector to pass.  Errors reported with error().  */
2524
2525 void
2526 windows_nat_target::create_inferior (const char *exec_file,
2527                                      const std::string &origallargs,
2528                                      char **in_env, int from_tty)
2529 {
2530   STARTUPINFO si;
2531 #ifdef __CYGWIN__
2532   cygwin_buf_t real_path[__PMAX];
2533   cygwin_buf_t shell[__PMAX]; /* Path to shell */
2534   cygwin_buf_t infcwd[__PMAX];
2535   const char *sh;
2536   cygwin_buf_t *toexec;
2537   cygwin_buf_t *cygallargs;
2538   cygwin_buf_t *args;
2539   char **old_env = NULL;
2540   PWCHAR w32_env;
2541   size_t len;
2542   int tty;
2543   int ostdin, ostdout, ostderr;
2544 #else  /* !__CYGWIN__ */
2545   char shell[__PMAX]; /* Path to shell */
2546   const char *toexec;
2547   char *args, *allargs_copy;
2548   size_t args_len, allargs_len;
2549   int fd_inp = -1, fd_out = -1, fd_err = -1;
2550   HANDLE tty = INVALID_HANDLE_VALUE;
2551   bool redirected = false;
2552   char *w32env;
2553   char *temp;
2554   size_t envlen;
2555   int i;
2556   size_t envsize;
2557   char **env;
2558 #endif  /* !__CYGWIN__ */
2559   const char *allargs = origallargs.c_str ();
2560   PROCESS_INFORMATION pi;
2561   BOOL ret;
2562   DWORD flags = 0;
2563   const char *inferior_io_terminal = get_inferior_io_terminal ();
2564
2565   if (!exec_file)
2566     error (_("No executable specified, use `target exec'."));
2567
2568   const char *inferior_cwd = get_inferior_cwd ();
2569   std::string expanded_infcwd;
2570   if (inferior_cwd != NULL)
2571     {
2572       expanded_infcwd = gdb_tilde_expand (inferior_cwd);
2573       /* Mirror slashes on inferior's cwd.  */
2574       std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
2575                     '/', '\\');
2576       inferior_cwd = expanded_infcwd.c_str ();
2577     }
2578
2579   memset (&si, 0, sizeof (si));
2580   si.cb = sizeof (si);
2581
2582   if (new_group)
2583     flags |= CREATE_NEW_PROCESS_GROUP;
2584
2585   if (new_console)
2586     windows_set_console_info (&si, &flags);
2587
2588 #ifdef __CYGWIN__
2589   if (!useshell)
2590     {
2591       flags |= DEBUG_ONLY_THIS_PROCESS;
2592       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
2593                             __PMAX * sizeof (cygwin_buf_t)) < 0)
2594         error (_("Error starting executable: %d"), errno);
2595       toexec = real_path;
2596 #ifdef __USEWIDE
2597       len = mbstowcs (NULL, allargs, 0) + 1;
2598       if (len == (size_t) -1)
2599         error (_("Error starting executable: %d"), errno);
2600       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2601       mbstowcs (cygallargs, allargs, len);
2602 #else  /* !__USEWIDE */
2603       cygallargs = allargs;
2604 #endif
2605     }
2606   else
2607     {
2608       sh = get_shell ();
2609       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
2610         error (_("Error starting executable via shell: %d"), errno);
2611 #ifdef __USEWIDE
2612       len = sizeof (L" -c 'exec  '") + mbstowcs (NULL, exec_file, 0)
2613             + mbstowcs (NULL, allargs, 0) + 2;
2614       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2615       swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
2616 #else  /* !__USEWIDE */
2617       len = (sizeof (" -c 'exec  '") + strlen (exec_file)
2618              + strlen (allargs) + 2);
2619       cygallargs = (char *) alloca (len);
2620       xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
2621 #endif  /* __USEWIDE */
2622       toexec = shell;
2623       flags |= DEBUG_PROCESS;
2624     }
2625
2626   if (inferior_cwd != NULL
2627       && cygwin_conv_path (CCP_POSIX_TO_WIN_W, inferior_cwd,
2628                            infcwd, strlen (inferior_cwd)) < 0)
2629     error (_("Error converting inferior cwd: %d"), errno);
2630
2631 #ifdef __USEWIDE
2632   args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
2633                                   * sizeof (wchar_t));
2634   wcscpy (args, toexec);
2635   wcscat (args, L" ");
2636   wcscat (args, cygallargs);
2637 #else  /* !__USEWIDE */
2638   args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
2639   strcpy (args, toexec);
2640   strcat (args, " ");
2641   strcat (args, cygallargs);
2642 #endif  /* !__USEWIDE */
2643
2644 #ifdef CW_CVT_ENV_TO_WINENV
2645   /* First try to create a direct Win32 copy of the POSIX environment. */
2646   w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
2647   if (w32_env != (PWCHAR) -1)
2648     flags |= CREATE_UNICODE_ENVIRONMENT;
2649   else
2650     /* If that fails, fall back to old method tweaking GDB's environment. */
2651 #endif  /* CW_CVT_ENV_TO_WINENV */
2652     {
2653       /* Reset all Win32 environment variables to avoid leftover on next run. */
2654       clear_win32_environment (environ);
2655       /* Prepare the environment vars for CreateProcess.  */
2656       old_env = environ;
2657       environ = in_env;
2658       cygwin_internal (CW_SYNC_WINENV);
2659       w32_env = NULL;
2660     }
2661
2662   if (!inferior_io_terminal)
2663     tty = ostdin = ostdout = ostderr = -1;
2664   else
2665     {
2666       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
2667       if (tty < 0)
2668         {
2669           print_sys_errmsg (inferior_io_terminal, errno);
2670           ostdin = ostdout = ostderr = -1;
2671         }
2672       else
2673         {
2674           ostdin = dup (0);
2675           ostdout = dup (1);
2676           ostderr = dup (2);
2677           dup2 (tty, 0);
2678           dup2 (tty, 1);
2679           dup2 (tty, 2);
2680         }
2681     }
2682
2683   windows_init_thread_list ();
2684   ret = CreateProcess (0,
2685                        args,    /* command line */
2686                        NULL,    /* Security */
2687                        NULL,    /* thread */
2688                        TRUE,    /* inherit handles */
2689                        flags,   /* start flags */
2690                        w32_env, /* environment */
2691                        inferior_cwd != NULL ? infcwd : NULL, /* current
2692                                                                 directory */
2693                        &si,
2694                        &pi);
2695   if (w32_env)
2696     /* Just free the Win32 environment, if it could be created. */
2697     free (w32_env);
2698   else
2699     {
2700       /* Reset all environment variables to avoid leftover on next run. */
2701       clear_win32_environment (in_env);
2702       /* Restore normal GDB environment variables.  */
2703       environ = old_env;
2704       cygwin_internal (CW_SYNC_WINENV);
2705     }
2706
2707   if (tty >= 0)
2708     {
2709       ::close (tty);
2710       dup2 (ostdin, 0);
2711       dup2 (ostdout, 1);
2712       dup2 (ostderr, 2);
2713       ::close (ostdin);
2714       ::close (ostdout);
2715       ::close (ostderr);
2716     }
2717 #else  /* !__CYGWIN__ */
2718   allargs_len = strlen (allargs);
2719   allargs_copy = strcpy ((char *) alloca (allargs_len + 1), allargs);
2720   if (strpbrk (allargs_copy, "<>") != NULL)
2721     {
2722       int e = errno;
2723       errno = 0;
2724       redirected =
2725         redirect_inferior_handles (allargs, allargs_copy,
2726                                    &fd_inp, &fd_out, &fd_err);
2727       if (errno)
2728         warning (_("Error in redirection: %s."), strerror (errno));
2729       else
2730         errno = e;
2731       allargs_len = strlen (allargs_copy);
2732     }
2733   /* If not all the standard streams are redirected by the command
2734      line, use inferior_io_terminal for those which aren't.  */
2735   if (inferior_io_terminal
2736       && !(fd_inp >= 0 && fd_out >= 0 && fd_err >= 0))
2737     {
2738       SECURITY_ATTRIBUTES sa;
2739       sa.nLength = sizeof(sa);
2740       sa.lpSecurityDescriptor = 0;
2741       sa.bInheritHandle = TRUE;
2742       tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
2743                          0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
2744       if (tty == INVALID_HANDLE_VALUE)
2745         warning (_("Warning: Failed to open TTY %s, error %#x."),
2746                  inferior_io_terminal, (unsigned) GetLastError ());
2747     }
2748   if (redirected || tty != INVALID_HANDLE_VALUE)
2749     {
2750       if (fd_inp >= 0)
2751         si.hStdInput = (HANDLE) _get_osfhandle (fd_inp);
2752       else if (tty != INVALID_HANDLE_VALUE)
2753         si.hStdInput = tty;
2754       else
2755         si.hStdInput = GetStdHandle (STD_INPUT_HANDLE);
2756       if (fd_out >= 0)
2757         si.hStdOutput = (HANDLE) _get_osfhandle (fd_out);
2758       else if (tty != INVALID_HANDLE_VALUE)
2759         si.hStdOutput = tty;
2760       else
2761         si.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
2762       if (fd_err >= 0)
2763         si.hStdError = (HANDLE) _get_osfhandle (fd_err);
2764       else if (tty != INVALID_HANDLE_VALUE)
2765         si.hStdError = tty;
2766       else
2767         si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
2768       si.dwFlags |= STARTF_USESTDHANDLES;
2769     }
2770
2771   toexec = exec_file;
2772   /* Build the command line, a space-separated list of tokens where
2773      the first token is the name of the module to be executed.
2774      To avoid ambiguities introduced by spaces in the module name,
2775      we quote it.  */
2776   args_len = strlen (toexec) + 2 /* quotes */ + allargs_len + 2;
2777   args = (char *) alloca (args_len);
2778   xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs_copy);
2779
2780   flags |= DEBUG_ONLY_THIS_PROCESS;
2781
2782   /* CreateProcess takes the environment list as a null terminated set of
2783      strings (i.e. two nulls terminate the list).  */
2784
2785   /* Get total size for env strings.  */
2786   for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
2787     envlen += strlen (in_env[i]) + 1;
2788
2789   envsize = sizeof (in_env[0]) * (i + 1);
2790   env = (char **) alloca (envsize);
2791   memcpy (env, in_env, envsize);
2792   /* Windows programs expect the environment block to be sorted.  */
2793   qsort (env, i, sizeof (char *), envvar_cmp);
2794
2795   w32env = (char *) alloca (envlen + 1);
2796
2797   /* Copy env strings into new buffer.  */
2798   for (temp = w32env, i = 0; env[i] && *env[i]; i++)
2799     {
2800       strcpy (temp, env[i]);
2801       temp += strlen (temp) + 1;
2802     }
2803
2804   /* Final nil string to terminate new env.  */
2805   *temp = 0;
2806
2807   windows_init_thread_list ();
2808   ret = CreateProcessA (0,
2809                         args,   /* command line */
2810                         NULL,   /* Security */
2811                         NULL,   /* thread */
2812                         TRUE,   /* inherit handles */
2813                         flags,  /* start flags */
2814                         w32env, /* environment */
2815                         inferior_cwd, /* current directory */
2816                         &si,
2817                         &pi);
2818   if (tty != INVALID_HANDLE_VALUE)
2819     CloseHandle (tty);
2820   if (fd_inp >= 0)
2821     _close (fd_inp);
2822   if (fd_out >= 0)
2823     _close (fd_out);
2824   if (fd_err >= 0)
2825     _close (fd_err);
2826 #endif  /* !__CYGWIN__ */
2827
2828   if (!ret)
2829     error (_("Error creating process %s, (error %u)."),
2830            exec_file, (unsigned) GetLastError ());
2831
2832   CloseHandle (pi.hThread);
2833   CloseHandle (pi.hProcess);
2834
2835   if (useshell && shell[0] != '\0')
2836     saw_create = -1;
2837   else
2838     saw_create = 0;
2839
2840   do_initial_windows_stuff (this, pi.dwProcessId, 0);
2841
2842   /* windows_continue (DBG_CONTINUE, -1, 0); */
2843 }
2844
2845 void
2846 windows_nat_target::mourn_inferior ()
2847 {
2848   (void) windows_continue (DBG_CONTINUE, -1, 0);
2849   x86_cleanup_dregs();
2850   if (open_process_used)
2851     {
2852       CHECK (CloseHandle (current_process_handle));
2853       open_process_used = 0;
2854     }
2855   inf_child_target::mourn_inferior ();
2856 }
2857
2858 /* Send a SIGINT to the process group.  This acts just like the user typed a
2859    ^C on the controlling terminal.  */
2860
2861 void
2862 windows_nat_target::interrupt ()
2863 {
2864   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
2865   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
2866   registers_changed ();         /* refresh register state */
2867 }
2868
2869 /* Helper for windows_xfer_partial that handles memory transfers.
2870    Arguments are like target_xfer_partial.  */
2871
2872 static enum target_xfer_status
2873 windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
2874                      ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
2875 {
2876   SIZE_T done = 0;
2877   BOOL success;
2878   DWORD lasterror = 0;
2879
2880   if (writebuf != NULL)
2881     {
2882       DEBUG_MEM (("gdb: write target memory, %s bytes at %s\n",
2883                   pulongest (len), core_addr_to_string (memaddr)));
2884       success = WriteProcessMemory (current_process_handle,
2885                                     (LPVOID) (uintptr_t) memaddr, writebuf,
2886                                     len, &done);
2887       if (!success)
2888         lasterror = GetLastError ();
2889       FlushInstructionCache (current_process_handle,
2890                              (LPCVOID) (uintptr_t) memaddr, len);
2891     }
2892   else
2893     {
2894       DEBUG_MEM (("gdb: read target memory, %s bytes at %s\n",
2895                   pulongest (len), core_addr_to_string (memaddr)));
2896       success = ReadProcessMemory (current_process_handle,
2897                                    (LPCVOID) (uintptr_t) memaddr, readbuf,
2898                                    len, &done);
2899       if (!success)
2900         lasterror = GetLastError ();
2901     }
2902   *xfered_len = (ULONGEST) done;
2903   if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
2904     return TARGET_XFER_OK;
2905   else
2906     return success ? TARGET_XFER_OK : TARGET_XFER_E_IO;
2907 }
2908
2909 void
2910 windows_nat_target::kill ()
2911 {
2912   CHECK (TerminateProcess (current_process_handle, 0));
2913
2914   for (;;)
2915     {
2916       if (!windows_continue (DBG_CONTINUE, -1, 1))
2917         break;
2918       if (!WaitForDebugEvent (&current_event, INFINITE))
2919         break;
2920       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2921         break;
2922     }
2923
2924   target_mourn_inferior (inferior_ptid);        /* Or just windows_mourn_inferior?  */
2925 }
2926
2927 void
2928 windows_nat_target::close ()
2929 {
2930   DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2931                 inferior_ptid.pid ()));
2932 }
2933
2934 /* Convert pid to printable format.  */
2935 std::string
2936 windows_nat_target::pid_to_str (ptid_t ptid)
2937 {
2938   if (ptid.tid () != 0)
2939     return string_printf ("Thread %d.0x%lx", ptid.pid (), ptid.tid ());
2940
2941   return normal_pid_to_str (ptid);
2942 }
2943
2944 static enum target_xfer_status
2945 windows_xfer_shared_libraries (struct target_ops *ops,
2946                                enum target_object object, const char *annex,
2947                                gdb_byte *readbuf, const gdb_byte *writebuf,
2948                                ULONGEST offset, ULONGEST len,
2949                                ULONGEST *xfered_len)
2950 {
2951   struct obstack obstack;
2952   const char *buf;
2953   LONGEST len_avail;
2954   struct so_list *so;
2955
2956   if (writebuf)
2957     return TARGET_XFER_E_IO;
2958
2959   obstack_init (&obstack);
2960   obstack_grow_str (&obstack, "<library-list>\n");
2961   for (so = solib_start.next; so; so = so->next)
2962     {
2963       lm_info_windows *li = (lm_info_windows *) so->lm_info;
2964
2965       windows_xfer_shared_library (so->so_name, (CORE_ADDR)
2966                                    (uintptr_t) li->load_addr,
2967                                    target_gdbarch (), &obstack);
2968     }
2969   obstack_grow_str0 (&obstack, "</library-list>\n");
2970
2971   buf = (const char *) obstack_finish (&obstack);
2972   len_avail = strlen (buf);
2973   if (offset >= len_avail)
2974     len= 0;
2975   else
2976     {
2977       if (len > len_avail - offset)
2978         len = len_avail - offset;
2979       memcpy (readbuf, buf + offset, len);
2980     }
2981
2982   obstack_free (&obstack, NULL);
2983   *xfered_len = (ULONGEST) len;
2984   return len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF;
2985 }
2986
2987 enum target_xfer_status
2988 windows_nat_target::xfer_partial (enum target_object object,
2989                                   const char *annex, gdb_byte *readbuf,
2990                                   const gdb_byte *writebuf, ULONGEST offset,
2991                                   ULONGEST len, ULONGEST *xfered_len)
2992 {
2993   switch (object)
2994     {
2995     case TARGET_OBJECT_MEMORY:
2996       return windows_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
2997
2998     case TARGET_OBJECT_LIBRARIES:
2999       return windows_xfer_shared_libraries (this, object, annex, readbuf,
3000                                             writebuf, offset, len, xfered_len);
3001
3002     default:
3003       if (beneath () == NULL)
3004         {
3005           /* This can happen when requesting the transfer of unsupported
3006              objects before a program has been started (and therefore
3007              with the current_target having no target beneath).  */
3008           return TARGET_XFER_E_IO;
3009         }
3010       return beneath ()->xfer_partial (object, annex,
3011                                        readbuf, writebuf, offset, len,
3012                                        xfered_len);
3013     }
3014 }
3015
3016 /* Provide thread local base, i.e. Thread Information Block address.
3017    Returns 1 if ptid is found and sets *ADDR to thread_local_base.  */
3018
3019 bool
3020 windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
3021 {
3022   windows_thread_info *th;
3023
3024   th = thread_rec (ptid.tid (), 0);
3025   if (th == NULL)
3026     return false;
3027
3028   if (addr != NULL)
3029     *addr = th->thread_local_base;
3030
3031   return true;
3032 }
3033
3034 ptid_t
3035 windows_nat_target::get_ada_task_ptid (long lwp, long thread)
3036 {
3037   return ptid_t (inferior_ptid.pid (), 0, lwp);
3038 }
3039
3040 /* Implementation of the to_thread_name method.  */
3041
3042 const char *
3043 windows_nat_target::thread_name (struct thread_info *thr)
3044 {
3045   return thread_rec (thr->ptid.tid (), 0)->name;
3046 }
3047
3048
3049 void
3050 _initialize_windows_nat (void)
3051 {
3052   x86_dr_low.set_control = cygwin_set_dr7;
3053   x86_dr_low.set_addr = cygwin_set_dr;
3054   x86_dr_low.get_addr = cygwin_get_dr;
3055   x86_dr_low.get_status = cygwin_get_dr6;
3056   x86_dr_low.get_control = cygwin_get_dr7;
3057
3058   /* x86_dr_low.debug_register_length field is set by
3059      calling x86_set_debug_register_length function
3060      in processor windows specific native file.  */
3061
3062   add_inf_child_target (&the_windows_nat_target);
3063
3064 #ifdef __CYGWIN__
3065   cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
3066 #endif
3067
3068   add_com ("signal-event", class_run, signal_event_command, _("\
3069 Signal a crashed process with event ID, to allow its debugging.\n\
3070 This command is needed in support of setting up GDB as JIT debugger on \
3071 MS-Windows.  The command should be invoked from the GDB command line using \
3072 the '-ex' command-line option.  The ID of the event that blocks the \
3073 crashed process will be supplied by the Windows JIT debugging mechanism."));
3074
3075 #ifdef __CYGWIN__
3076   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
3077 Set use of shell to start subprocess."), _("\
3078 Show use of shell to start subprocess."), NULL,
3079                            NULL,
3080                            NULL, /* FIXME: i18n: */
3081                            &setlist, &showlist);
3082
3083   add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
3084                            &cygwin_exceptions, _("\
3085 Break when an exception is detected in the Cygwin DLL itself."), _("\
3086 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
3087                            NULL,
3088                            NULL, /* FIXME: i18n: */
3089                            &setlist, &showlist);
3090 #endif
3091
3092   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
3093 Set creation of new console when creating child process."), _("\
3094 Show creation of new console when creating child process."), NULL,
3095                            NULL,
3096                            NULL, /* FIXME: i18n: */
3097                            &setlist, &showlist);
3098
3099   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
3100 Set creation of new group when creating child process."), _("\
3101 Show creation of new group when creating child process."), NULL,
3102                            NULL,
3103                            NULL, /* FIXME: i18n: */
3104                            &setlist, &showlist);
3105
3106   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
3107 Set whether to display execution in child process."), _("\
3108 Show whether to display execution in child process."), NULL,
3109                            NULL,
3110                            NULL, /* FIXME: i18n: */
3111                            &setlist, &showlist);
3112
3113   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
3114 Set whether to display kernel events in child process."), _("\
3115 Show whether to display kernel events in child process."), NULL,
3116                            NULL,
3117                            NULL, /* FIXME: i18n: */
3118                            &setlist, &showlist);
3119
3120   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
3121 Set whether to display memory accesses in child process."), _("\
3122 Show whether to display memory accesses in child process."), NULL,
3123                            NULL,
3124                            NULL, /* FIXME: i18n: */
3125                            &setlist, &showlist);
3126
3127   add_setshow_boolean_cmd ("debugexceptions", class_support,
3128                            &debug_exceptions, _("\
3129 Set whether to display kernel exceptions in child process."), _("\
3130 Show whether to display kernel exceptions in child process."), NULL,
3131                            NULL,
3132                            NULL, /* FIXME: i18n: */
3133                            &setlist, &showlist);
3134
3135   init_w32_command_list ();
3136
3137   add_cmd ("selector", class_info, display_selectors,
3138            _("Display selectors infos."),
3139            &info_w32_cmdlist);
3140 }
3141
3142 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
3143
3144 /* Pass the address ADDR to the inferior in the I'th debug register.
3145    Here we just store the address in dr array, the registers will be
3146    actually set up when windows_continue is called.  */
3147 static void
3148 cygwin_set_dr (int i, CORE_ADDR addr)
3149 {
3150   if (i < 0 || i > 3)
3151     internal_error (__FILE__, __LINE__,
3152                     _("Invalid register %d in cygwin_set_dr.\n"), i);
3153   dr[i] = addr;
3154   debug_registers_changed = 1;
3155   debug_registers_used = 1;
3156 }
3157
3158 /* Pass the value VAL to the inferior in the DR7 debug control
3159    register.  Here we just store the address in D_REGS, the watchpoint
3160    will be actually set up in windows_wait.  */
3161 static void
3162 cygwin_set_dr7 (unsigned long val)
3163 {
3164   dr[7] = (CORE_ADDR) val;
3165   debug_registers_changed = 1;
3166   debug_registers_used = 1;
3167 }
3168
3169 /* Get the value of debug register I from the inferior.  */
3170
3171 static CORE_ADDR
3172 cygwin_get_dr (int i)
3173 {
3174   return dr[i];
3175 }
3176
3177 /* Get the value of the DR6 debug status register from the inferior.
3178    Here we just return the value stored in dr[6]
3179    by the last call to thread_rec for current_event.dwThreadId id.  */
3180 static unsigned long
3181 cygwin_get_dr6 (void)
3182 {
3183   return (unsigned long) dr[6];
3184 }
3185
3186 /* Get the value of the DR7 debug status register from the inferior.
3187    Here we just return the value stored in dr[7] by the last call to
3188    thread_rec for current_event.dwThreadId id.  */
3189
3190 static unsigned long
3191 cygwin_get_dr7 (void)
3192 {
3193   return (unsigned long) dr[7];
3194 }
3195
3196 /* Determine if the thread referenced by "ptid" is alive
3197    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
3198    it means that the thread has died.  Otherwise it is assumed to be alive.  */
3199
3200 bool
3201 windows_nat_target::thread_alive (ptid_t ptid)
3202 {
3203   int tid;
3204
3205   gdb_assert (ptid.tid () != 0);
3206   tid = ptid.tid ();
3207
3208   return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) != WAIT_OBJECT_0;
3209 }
3210
3211 void
3212 _initialize_check_for_gdb_ini (void)
3213 {
3214   char *homedir;
3215   if (inhibit_gdbinit)
3216     return;
3217
3218   homedir = getenv ("HOME");
3219   if (homedir)
3220     {
3221       char *p;
3222       char *oldini = (char *) alloca (strlen (homedir) +
3223                                       sizeof ("gdb.ini") + 1);
3224       strcpy (oldini, homedir);
3225       p = strchr (oldini, '\0');
3226       if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
3227         *p++ = '/';
3228       strcpy (p, "gdb.ini");
3229       if (access (oldini, 0) == 0)
3230         {
3231           int len = strlen (oldini);
3232           char *newini = (char *) alloca (len + 2);
3233
3234           xsnprintf (newini, len + 2, "%.*s.gdbinit",
3235                      (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
3236           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
3237         }
3238     }
3239 }
3240
3241 /* Define dummy functions which always return error for the rare cases where
3242    these functions could not be found.  */
3243 static BOOL WINAPI
3244 bad_DebugActiveProcessStop (DWORD w)
3245 {
3246   return FALSE;
3247 }
3248 static BOOL WINAPI
3249 bad_DebugBreakProcess (HANDLE w)
3250 {
3251   return FALSE;
3252 }
3253 static BOOL WINAPI
3254 bad_DebugSetProcessKillOnExit (BOOL w)
3255 {
3256   return FALSE;
3257 }
3258 static BOOL WINAPI
3259 bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
3260 {
3261   return FALSE;
3262 }
3263
3264 #ifdef __USEWIDE
3265 static DWORD WINAPI
3266 bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
3267 {
3268   return 0;
3269 }
3270 #else
3271 static DWORD WINAPI
3272 bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
3273 {
3274   return 0;
3275 }
3276 #endif
3277
3278 static BOOL WINAPI
3279 bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
3280 {
3281   return FALSE;
3282 }
3283
3284 static BOOL WINAPI
3285 bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
3286 {
3287   return FALSE;
3288 }
3289
3290 static BOOL WINAPI
3291 bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
3292 {
3293   f->nFont = 0;
3294   return 1;
3295 }
3296 static COORD WINAPI
3297 bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
3298 {
3299   COORD size;
3300   size.X = 8;
3301   size.Y = 12;
3302   return size;
3303 }
3304  
3305 /* Load any functions which may not be available in ancient versions
3306    of Windows.  */
3307
3308 void
3309 _initialize_loadable (void)
3310 {
3311   HMODULE hm = NULL;
3312
3313 #define GPA(m, func)                                    \
3314   func = (func ## _ftype *) GetProcAddress (m, #func)
3315
3316   hm = LoadLibrary ("kernel32.dll");
3317   if (hm)
3318     {
3319       GPA (hm, DebugActiveProcessStop);
3320       GPA (hm, DebugBreakProcess);
3321       GPA (hm, DebugSetProcessKillOnExit);
3322       GPA (hm, GetConsoleFontSize);
3323       GPA (hm, DebugActiveProcessStop);
3324       GPA (hm, GetCurrentConsoleFont);
3325     }
3326
3327   /* Set variables to dummy versions of these processes if the function
3328      wasn't found in kernel32.dll.  */
3329   if (!DebugBreakProcess)
3330     DebugBreakProcess = bad_DebugBreakProcess;
3331   if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
3332     {
3333       DebugActiveProcessStop = bad_DebugActiveProcessStop;
3334       DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
3335     }
3336   if (!GetConsoleFontSize)
3337     GetConsoleFontSize = bad_GetConsoleFontSize;
3338   if (!GetCurrentConsoleFont)
3339     GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
3340
3341   /* Load optional functions used for retrieving filename information
3342      associated with the currently debugged process or its dlls.  */
3343   hm = LoadLibrary ("psapi.dll");
3344   if (hm)
3345     {
3346       GPA (hm, EnumProcessModules);
3347       GPA (hm, GetModuleInformation);
3348       GetModuleFileNameEx = (GetModuleFileNameEx_ftype *)
3349         GetProcAddress (hm, GetModuleFileNameEx_name);
3350     }
3351
3352   if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
3353     {
3354       /* Set variables to dummy versions of these processes if the function
3355          wasn't found in psapi.dll.  */
3356       EnumProcessModules = bad_EnumProcessModules;
3357       GetModuleInformation = bad_GetModuleInformation;
3358       GetModuleFileNameEx = bad_GetModuleFileNameEx;
3359       /* This will probably fail on Windows 9x/Me.  Let the user know
3360          that we're missing some functionality.  */
3361       warning(_("\
3362 cannot automatically find executable file or library to read symbols.\n\
3363 Use \"file\" or \"dll\" command to load executable/libraries directly."));
3364     }
3365
3366   hm = LoadLibrary ("advapi32.dll");
3367   if (hm)
3368     {
3369       GPA (hm, OpenProcessToken);
3370       GPA (hm, LookupPrivilegeValueA);
3371       GPA (hm, AdjustTokenPrivileges);
3372       /* Only need to set one of these since if OpenProcessToken fails nothing
3373          else is needed.  */
3374       if (!OpenProcessToken || !LookupPrivilegeValueA
3375           || !AdjustTokenPrivileges)
3376         OpenProcessToken = bad_OpenProcessToken;
3377     }
3378
3379 #undef GPA
3380 }