Fix relocation of directories in the MinGW build.
[external/binutils.git] / gdb / windows-nat.c
1 /* Target-vector operations for controlling windows child processes, for GDB.
2
3    Copyright (C) 1995-2013 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 "target.h"
28 #include "exceptions.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 <stdlib.h>
38 #include <windows.h>
39 #include <imagehlp.h>
40 #include <psapi.h>
41 #ifdef __CYGWIN__
42 #include <wchar.h>
43 #include <sys/cygwin.h>
44 #include <cygwin/version.h>
45 #endif
46 #include <signal.h>
47
48 #include "buildsym.h"
49 #include "filenames.h"
50 #include "symfile.h"
51 #include "objfiles.h"
52 #include "gdb_bfd.h"
53 #include "gdb_obstack.h"
54 #include "gdb_string.h"
55 #include "gdbthread.h"
56 #include "gdbcmd.h"
57 #include <sys/param.h>
58 #include <unistd.h>
59 #include "exec.h"
60 #include "solist.h"
61 #include "solib.h"
62 #include "xml-support.h"
63
64 #include "i386-tdep.h"
65 #include "i387-tdep.h"
66
67 #include "windows-tdep.h"
68 #include "windows-nat.h"
69 #include "i386-nat.h"
70 #include "complaints.h"
71
72 #define AdjustTokenPrivileges           dyn_AdjustTokenPrivileges
73 #define DebugActiveProcessStop          dyn_DebugActiveProcessStop
74 #define DebugBreakProcess               dyn_DebugBreakProcess
75 #define DebugSetProcessKillOnExit       dyn_DebugSetProcessKillOnExit
76 #define EnumProcessModules              dyn_EnumProcessModules
77 #define GetModuleInformation            dyn_GetModuleInformation
78 #define LookupPrivilegeValueA           dyn_LookupPrivilegeValueA
79 #define OpenProcessToken                dyn_OpenProcessToken
80 #define GetConsoleFontSize              dyn_GetConsoleFontSize
81 #define GetCurrentConsoleFont           dyn_GetCurrentConsoleFont
82
83 static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
84                                             DWORD, PTOKEN_PRIVILEGES, PDWORD);
85 static BOOL WINAPI (*DebugActiveProcessStop) (DWORD);
86 static BOOL WINAPI (*DebugBreakProcess) (HANDLE);
87 static BOOL WINAPI (*DebugSetProcessKillOnExit) (BOOL);
88 static BOOL WINAPI (*EnumProcessModules) (HANDLE, HMODULE *, DWORD,
89                                           LPDWORD);
90 static BOOL WINAPI (*GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO,
91                                             DWORD);
92 static BOOL WINAPI (*LookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID);
93 static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
94 static BOOL WINAPI (*GetCurrentConsoleFont) (HANDLE, BOOL,
95                                              CONSOLE_FONT_INFO *);
96 static COORD WINAPI (*GetConsoleFontSize) (HANDLE, DWORD);
97
98 static struct target_ops windows_ops;
99
100 #undef STARTUPINFO
101 #undef CreateProcess
102 #undef GetModuleFileNameEx
103
104 #ifndef __CYGWIN__
105 # define __PMAX (MAX_PATH + 1)
106   static DWORD WINAPI (*GetModuleFileNameEx) (HANDLE, HMODULE, LPSTR, DWORD);
107 # define STARTUPINFO STARTUPINFOA
108 # define CreateProcess CreateProcessA
109 # define GetModuleFileNameEx_name "GetModuleFileNameExA"
110 # define bad_GetModuleFileNameEx bad_GetModuleFileNameExA
111 #else
112 # define __PMAX PATH_MAX
113 /* The starting and ending address of the cygwin1.dll text segment.  */
114   static CORE_ADDR cygwin_load_start;
115   static CORE_ADDR cygwin_load_end;
116 #   define __USEWIDE
117     typedef wchar_t cygwin_buf_t;
118     static DWORD WINAPI (*GetModuleFileNameEx) (HANDLE, HMODULE,
119                                                 LPWSTR, DWORD);
120 #   define STARTUPINFO STARTUPINFOW
121 #   define CreateProcess CreateProcessW
122 #   define GetModuleFileNameEx_name "GetModuleFileNameExW"
123 #   define bad_GetModuleFileNameEx bad_GetModuleFileNameExW
124 #endif
125
126 static int have_saved_context;  /* True if we've saved context from a
127                                    cygwin signal.  */
128 static CONTEXT saved_context;   /* Containes the saved context from a
129                                    cygwin signal.  */
130
131 /* If we're not using the old Cygwin header file set, define the
132    following which never should have been in the generic Win32 API
133    headers in the first place since they were our own invention...  */
134 #ifndef _GNU_H_WINDOWS_H
135 enum
136   {
137     FLAG_TRACE_BIT = 0x100,
138     CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
139   };
140 #endif
141
142 #ifndef CONTEXT_EXTENDED_REGISTERS
143 /* This macro is only defined on ia32.  It only makes sense on this target,
144    so define it as zero if not already defined.  */
145 #define CONTEXT_EXTENDED_REGISTERS 0
146 #endif
147
148 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
149         | CONTEXT_EXTENDED_REGISTERS
150
151 static uintptr_t dr[8];
152 static int debug_registers_changed;
153 static int debug_registers_used;
154
155 static int windows_initialization_done;
156 #define DR6_CLEAR_VALUE 0xffff0ff0
157
158 /* The string sent by cygwin when it processes a signal.
159    FIXME: This should be in a cygwin include file.  */
160 #ifndef _CYGWIN_SIGNAL_STRING
161 #define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
162 #endif
163
164 #define CHECK(x)        check (x, __FILE__,__LINE__)
165 #define DEBUG_EXEC(x)   if (debug_exec)         printf_unfiltered x
166 #define DEBUG_EVENTS(x) if (debug_events)       printf_unfiltered x
167 #define DEBUG_MEM(x)    if (debug_memory)       printf_unfiltered x
168 #define DEBUG_EXCEPT(x) if (debug_exceptions)   printf_unfiltered x
169
170 static void windows_stop (ptid_t);
171 static int windows_thread_alive (struct target_ops *, ptid_t);
172 static void windows_kill_inferior (struct target_ops *);
173
174 static void cygwin_set_dr (int i, CORE_ADDR addr);
175 static void cygwin_set_dr7 (unsigned long val);
176 static CORE_ADDR cygwin_get_dr (int i);
177 static unsigned long cygwin_get_dr6 (void);
178 static unsigned long cygwin_get_dr7 (void);
179
180 static enum gdb_signal last_sig = GDB_SIGNAL_0;
181 /* Set if a signal was received from the debugged process.  */
182
183 /* Thread information structure used to track information that is
184    not available in gdb's thread structure.  */
185 typedef struct thread_info_struct
186   {
187     struct thread_info_struct *next;
188     DWORD id;
189     HANDLE h;
190     CORE_ADDR thread_local_base;
191     char *name;
192     int suspended;
193     int reload_context;
194     CONTEXT context;
195     STACKFRAME sf;
196   }
197 thread_info;
198
199 static thread_info thread_head;
200
201 /* The process and thread handles for the above context.  */
202
203 static DEBUG_EVENT current_event;       /* The current debug event from
204                                            WaitForDebugEvent */
205 static HANDLE current_process_handle;   /* Currently executing process */
206 static thread_info *current_thread;     /* Info on currently selected thread */
207 static DWORD main_thread_id;            /* Thread ID of the main thread */
208
209 /* Counts of things.  */
210 static int exception_count = 0;
211 static int event_count = 0;
212 static int saw_create;
213 static int open_process_used = 0;
214
215 /* User options.  */
216 static int new_console = 0;
217 #ifdef __CYGWIN__
218 static int cygwin_exceptions = 0;
219 #endif
220 static int new_group = 1;
221 static int debug_exec = 0;              /* show execution */
222 static int debug_events = 0;            /* show events from kernel */
223 static int debug_memory = 0;            /* show target memory accesses */
224 static int debug_exceptions = 0;        /* show target exceptions */
225 static int useshell = 0;                /* use shell for subprocesses */
226
227 /* This vector maps GDB's idea of a register's number into an offset
228    in the windows exception context vector.
229
230    It also contains the bit mask needed to load the register in question.
231
232    The contents of this table can only be computed by the units
233    that provide CPU-specific support for Windows native debugging.
234    These units should set the table by calling
235    windows_set_context_register_offsets.
236
237    One day we could read a reg, we could inspect the context we
238    already have loaded, if it doesn't have the bit set that we need,
239    we read that set of registers in using GetThreadContext.  If the
240    context already contains what we need, we just unpack it.  Then to
241    write a register, first we have to ensure that the context contains
242    the other regs of the group, and then we copy the info in and set
243    out bit.  */
244
245 static const int *mappings;
246
247 /* The function to use in order to determine whether a register is
248    a segment register or not.  */
249 static segment_register_p_ftype *segment_register_p;
250
251 /* This vector maps the target's idea of an exception (extracted
252    from the DEBUG_EVENT structure) to GDB's idea.  */
253
254 struct xlate_exception
255   {
256     int them;
257     enum gdb_signal us;
258   };
259
260 static const struct xlate_exception
261   xlate[] =
262 {
263   {EXCEPTION_ACCESS_VIOLATION, GDB_SIGNAL_SEGV},
264   {STATUS_STACK_OVERFLOW, GDB_SIGNAL_SEGV},
265   {EXCEPTION_BREAKPOINT, GDB_SIGNAL_TRAP},
266   {DBG_CONTROL_C, GDB_SIGNAL_INT},
267   {EXCEPTION_SINGLE_STEP, GDB_SIGNAL_TRAP},
268   {STATUS_FLOAT_DIVIDE_BY_ZERO, GDB_SIGNAL_FPE},
269   {-1, -1}};
270
271 /* Set the MAPPINGS static global to OFFSETS.
272    See the description of MAPPINGS for more details.  */
273
274 void
275 windows_set_context_register_offsets (const int *offsets)
276 {
277   mappings = offsets;
278 }
279
280 /* See windows-nat.h.  */
281
282 void
283 windows_set_segment_register_p (segment_register_p_ftype *fun)
284 {
285   segment_register_p = fun;
286 }
287
288 static void
289 check (BOOL ok, const char *file, int line)
290 {
291   if (!ok)
292     printf_filtered ("error return %s:%d was %u\n", file, line,
293                      (unsigned) GetLastError ());
294 }
295
296 /* Find a thread record given a thread id.  If GET_CONTEXT is not 0,
297    then also retrieve the context for this thread.  If GET_CONTEXT is
298    negative, then don't suspend the thread.  */
299 static thread_info *
300 thread_rec (DWORD id, int get_context)
301 {
302   thread_info *th;
303
304   for (th = &thread_head; (th = th->next) != NULL;)
305     if (th->id == id)
306       {
307         if (!th->suspended && get_context)
308           {
309             if (get_context > 0 && id != current_event.dwThreadId)
310               {
311                 if (SuspendThread (th->h) == (DWORD) -1)
312                   {
313                     DWORD err = GetLastError ();
314                     warning (_("SuspendThread failed. (winerr %u)"),
315                              (unsigned) err);
316                     return NULL;
317                   }
318                 th->suspended = 1;
319               }
320             else if (get_context < 0)
321               th->suspended = -1;
322             th->reload_context = 1;
323           }
324         return th;
325       }
326
327   return NULL;
328 }
329
330 /* Add a thread to the thread list.  */
331 static thread_info *
332 windows_add_thread (ptid_t ptid, HANDLE h, void *tlb)
333 {
334   thread_info *th;
335   DWORD id;
336
337   gdb_assert (ptid_get_tid (ptid) != 0);
338
339   id = ptid_get_tid (ptid);
340
341   if ((th = thread_rec (id, FALSE)))
342     return th;
343
344   th = XZALLOC (thread_info);
345   th->id = id;
346   th->h = h;
347   th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb;
348   th->next = thread_head.next;
349   thread_head.next = th;
350   add_thread (ptid);
351   /* Set the debug registers for the new thread if they are used.  */
352   if (debug_registers_used)
353     {
354       /* Only change the value of the debug registers.  */
355       th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
356       CHECK (GetThreadContext (th->h, &th->context));
357       th->context.Dr0 = dr[0];
358       th->context.Dr1 = dr[1];
359       th->context.Dr2 = dr[2];
360       th->context.Dr3 = dr[3];
361       th->context.Dr6 = DR6_CLEAR_VALUE;
362       th->context.Dr7 = dr[7];
363       CHECK (SetThreadContext (th->h, &th->context));
364       th->context.ContextFlags = 0;
365     }
366   return th;
367 }
368
369 /* Clear out any old thread list and reintialize it to a
370    pristine state.  */
371 static void
372 windows_init_thread_list (void)
373 {
374   thread_info *th = &thread_head;
375
376   DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
377   init_thread_list ();
378   while (th->next != NULL)
379     {
380       thread_info *here = th->next;
381       th->next = here->next;
382       xfree (here);
383     }
384   thread_head.next = NULL;
385 }
386
387 /* Delete a thread from the list of threads.  */
388 static void
389 windows_delete_thread (ptid_t ptid)
390 {
391   thread_info *th;
392   DWORD id;
393
394   gdb_assert (ptid_get_tid (ptid) != 0);
395
396   id = ptid_get_tid (ptid);
397
398   if (info_verbose)
399     printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid));
400   delete_thread (ptid);
401
402   for (th = &thread_head;
403        th->next != NULL && th->next->id != id;
404        th = th->next)
405     continue;
406
407   if (th->next != NULL)
408     {
409       thread_info *here = th->next;
410       th->next = here->next;
411       xfree (here);
412     }
413 }
414
415 static void
416 do_windows_fetch_inferior_registers (struct regcache *regcache, int r)
417 {
418   char *context_offset = ((char *) &current_thread->context) + mappings[r];
419   struct gdbarch *gdbarch = get_regcache_arch (regcache);
420   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
421   long l;
422
423   if (!current_thread)
424     return;     /* Windows sometimes uses a non-existent thread id in its
425                    events.  */
426
427   if (current_thread->reload_context)
428     {
429 #ifdef __COPY_CONTEXT_SIZE
430       if (have_saved_context)
431         {
432           /* Lie about where the program actually is stopped since
433              cygwin has informed us that we should consider the signal
434              to have occurred at another location which is stored in
435              "saved_context.  */
436           memcpy (&current_thread->context, &saved_context,
437                   __COPY_CONTEXT_SIZE);
438           have_saved_context = 0;
439         }
440       else
441 #endif
442         {
443           thread_info *th = current_thread;
444           th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
445           GetThreadContext (th->h, &th->context);
446           /* Copy dr values from that thread.
447              But only if there were not modified since last stop.
448              PR gdb/2388 */
449           if (!debug_registers_changed)
450             {
451               dr[0] = th->context.Dr0;
452               dr[1] = th->context.Dr1;
453               dr[2] = th->context.Dr2;
454               dr[3] = th->context.Dr3;
455               dr[6] = th->context.Dr6;
456               dr[7] = th->context.Dr7;
457             }
458         }
459       current_thread->reload_context = 0;
460     }
461
462   if (r == I387_FISEG_REGNUM (tdep))
463     {
464       l = *((long *) context_offset) & 0xffff;
465       regcache_raw_supply (regcache, r, (char *) &l);
466     }
467   else if (r == I387_FOP_REGNUM (tdep))
468     {
469       l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
470       regcache_raw_supply (regcache, r, (char *) &l);
471     }
472   else if (segment_register_p (r))
473     {
474       /* GDB treats segment registers as 32bit registers, but they are
475          in fact only 16 bits long.  Make sure we do not read extra
476          bits from our source buffer.  */
477       l = *((long *) context_offset) & 0xffff;
478       regcache_raw_supply (regcache, r, (char *) &l);
479     }
480   else if (r >= 0)
481     regcache_raw_supply (regcache, r, context_offset);
482   else
483     {
484       for (r = 0; r < gdbarch_num_regs (gdbarch); r++)
485         do_windows_fetch_inferior_registers (regcache, r);
486     }
487 }
488
489 static void
490 windows_fetch_inferior_registers (struct target_ops *ops,
491                                   struct regcache *regcache, int r)
492 {
493   current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
494   /* Check if current_thread exists.  Windows sometimes uses a non-existent
495      thread id in its events.  */
496   if (current_thread)
497     do_windows_fetch_inferior_registers (regcache, r);
498 }
499
500 static void
501 do_windows_store_inferior_registers (const struct regcache *regcache, int r)
502 {
503   if (!current_thread)
504     /* Windows sometimes uses a non-existent thread id in its events.  */;
505   else if (r >= 0)
506     regcache_raw_collect (regcache, r,
507                           ((char *) &current_thread->context) + mappings[r]);
508   else
509     {
510       for (r = 0; r < gdbarch_num_regs (get_regcache_arch (regcache)); r++)
511         do_windows_store_inferior_registers (regcache, r);
512     }
513 }
514
515 /* Store a new register value into the current thread context.  */
516 static void
517 windows_store_inferior_registers (struct target_ops *ops,
518                                   struct regcache *regcache, int r)
519 {
520   current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
521   /* Check if current_thread exists.  Windows sometimes uses a non-existent
522      thread id in its events.  */
523   if (current_thread)
524     do_windows_store_inferior_registers (regcache, r);
525 }
526
527 /* Get the name of a given module at given base address.  If base_address
528    is zero return the first loaded module (which is always the name of the
529    executable).  */
530 static int
531 get_module_name (LPVOID base_address, char *dll_name_ret)
532 {
533   DWORD len;
534   MODULEINFO mi;
535   int i;
536   HMODULE dh_buf[1];
537   HMODULE *DllHandle = dh_buf;  /* Set to temporary storage for
538                                    initial query.  */
539   DWORD cbNeeded;
540 #ifdef __CYGWIN__
541   cygwin_buf_t pathbuf[__PMAX]; /* Temporary storage prior to converting to
542                                    posix form.  __PMAX is always enough
543                                    as long as SO_NAME_MAX_PATH_SIZE is defined
544                                    as 512.  */
545 #endif
546
547   cbNeeded = 0;
548   /* Find size of buffer needed to handle list of modules loaded in
549      inferior.  */
550   if (!EnumProcessModules (current_process_handle, DllHandle,
551                            sizeof (HMODULE), &cbNeeded) || !cbNeeded)
552     goto failed;
553
554   /* Allocate correct amount of space for module list.  */
555   DllHandle = (HMODULE *) alloca (cbNeeded);
556   if (!DllHandle)
557     goto failed;
558
559   /* Get the list of modules.  */
560   if (!EnumProcessModules (current_process_handle, DllHandle, cbNeeded,
561                                  &cbNeeded))
562     goto failed;
563
564   for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
565     {
566       /* Get information on this module.  */
567       if (!GetModuleInformation (current_process_handle, DllHandle[i],
568                                  &mi, sizeof (mi)))
569         error (_("Can't get module info"));
570
571       if (!base_address || mi.lpBaseOfDll == base_address)
572         {
573           /* Try to find the name of the given module.  */
574 #ifdef __CYGWIN__
575           /* Cygwin prefers that the path be in /x/y/z format.  */
576           len = GetModuleFileNameEx (current_process_handle,
577                                       DllHandle[i], pathbuf, __PMAX);
578           if (len == 0)
579             error (_("Error getting dll name: %u."),
580                    (unsigned) GetLastError ());
581           if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, dll_name_ret,
582                                 __PMAX) < 0)
583             error (_("Error converting dll name to POSIX: %d."), errno);
584 #else
585           len = GetModuleFileNameEx (current_process_handle,
586                                       DllHandle[i], dll_name_ret, __PMAX);
587           if (len == 0)
588             error (_("Error getting dll name: %u."),
589                    (unsigned) GetLastError ());
590 #endif
591           return 1;     /* success */
592         }
593     }
594
595 failed:
596   dll_name_ret[0] = '\0';
597   return 0;             /* failure */
598 }
599
600 /* Return an absolute file name of the running GDB, if possible, or
601    ARGV0 if not.  The return value is in malloc'ed storage.  */
602 char *
603 windows_get_absolute_argv0 (const char *argv0)
604 {
605   char full_name[PATH_MAX];
606
607   if (GetModuleFileName (NULL, full_name, PATH_MAX))
608     return xstrdup (full_name);
609   return xstrdup (argv0);
610 }
611
612 /* Encapsulate the information required in a call to
613    symbol_file_add_args.  */
614 struct safe_symbol_file_add_args
615 {
616   char *name;
617   int from_tty;
618   struct section_addr_info *addrs;
619   int mainline;
620   int flags;
621   struct ui_file *err, *out;
622   struct objfile *ret;
623 };
624
625 /* Maintain a linked list of "so" information.  */
626 struct lm_info
627 {
628   LPVOID load_addr;
629 };
630
631 static struct so_list solib_start, *solib_end;
632
633 /* Call symbol_file_add with stderr redirected.  We don't care if there
634    are errors.  */
635 static int
636 safe_symbol_file_add_stub (void *argv)
637 {
638 #define p ((struct safe_symbol_file_add_args *) argv)
639   const int add_flags = ((p->from_tty ? SYMFILE_VERBOSE : 0)
640                          | (p->mainline ? SYMFILE_MAINLINE : 0));
641   p->ret = symbol_file_add (p->name, add_flags, p->addrs, p->flags);
642   return !!p->ret;
643 #undef p
644 }
645
646 /* Restore gdb's stderr after calling symbol_file_add.  */
647 static void
648 safe_symbol_file_add_cleanup (void *p)
649 {
650 #define sp ((struct safe_symbol_file_add_args *)p)
651   gdb_flush (gdb_stderr);
652   gdb_flush (gdb_stdout);
653   ui_file_delete (gdb_stderr);
654   ui_file_delete (gdb_stdout);
655   gdb_stderr = sp->err;
656   gdb_stdout = sp->out;
657 #undef sp
658 }
659
660 /* symbol_file_add wrapper that prevents errors from being displayed.  */
661 static struct objfile *
662 safe_symbol_file_add (char *name, int from_tty,
663                       struct section_addr_info *addrs,
664                       int mainline, int flags)
665 {
666   struct safe_symbol_file_add_args p;
667   struct cleanup *cleanup;
668
669   cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
670
671   p.err = gdb_stderr;
672   p.out = gdb_stdout;
673   gdb_flush (gdb_stderr);
674   gdb_flush (gdb_stdout);
675   gdb_stderr = ui_file_new ();
676   gdb_stdout = ui_file_new ();
677   p.name = name;
678   p.from_tty = from_tty;
679   p.addrs = addrs;
680   p.mainline = mainline;
681   p.flags = flags;
682   catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
683
684   do_cleanups (cleanup);
685   return p.ret;
686 }
687
688 static struct so_list *
689 windows_make_so (const char *name, LPVOID load_addr)
690 {
691   struct so_list *so;
692   char *p;
693 #ifndef __CYGWIN__
694   char buf[__PMAX];
695   char cwd[__PMAX];
696   WIN32_FIND_DATA w32_fd;
697   HANDLE h = FindFirstFile(name, &w32_fd);
698
699   if (h == INVALID_HANDLE_VALUE)
700     strcpy (buf, name);
701   else
702     {
703       FindClose (h);
704       strcpy (buf, name);
705       if (GetCurrentDirectory (MAX_PATH + 1, cwd))
706         {
707           p = strrchr (buf, '\\');
708           if (p)
709             p[1] = '\0';
710           SetCurrentDirectory (buf);
711           GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
712           SetCurrentDirectory (cwd);
713         }
714     }
715   if (strcasecmp (buf, "ntdll.dll") == 0)
716     {
717       GetSystemDirectory (buf, sizeof (buf));
718       strcat (buf, "\\ntdll.dll");
719     }
720 #else
721   cygwin_buf_t buf[__PMAX];
722
723   buf[0] = 0;
724   if (access (name, F_OK) != 0)
725     {
726       if (strcasecmp (name, "ntdll.dll") == 0)
727 #ifdef __USEWIDE
728         {
729           GetSystemDirectoryW (buf, sizeof (buf) / sizeof (wchar_t));
730           wcscat (buf, L"\\ntdll.dll");
731         }
732 #else
733         {
734           GetSystemDirectoryA (buf, sizeof (buf) / sizeof (wchar_t));
735           strcat (buf, "\\ntdll.dll");
736         }
737 #endif
738     }
739 #endif
740   so = XZALLOC (struct so_list);
741   so->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info));
742   so->lm_info->load_addr = load_addr;
743   strcpy (so->so_original_name, name);
744 #ifndef __CYGWIN__
745   strcpy (so->so_name, buf);
746 #else
747   if (buf[0])
748     cygwin_conv_path (CCP_WIN_W_TO_POSIX, buf, so->so_name,
749                       SO_NAME_MAX_PATH_SIZE);
750   else
751     {
752       char *rname = realpath (name, NULL);
753       if (rname && strlen (rname) < SO_NAME_MAX_PATH_SIZE)
754         {
755           strcpy (so->so_name, rname);
756           free (rname);
757         }
758       else
759         error (_("dll path too long"));
760     }
761   /* Record cygwin1.dll .text start/end.  */
762   p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
763   if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
764     {
765       bfd *abfd;
766       asection *text = NULL;
767       CORE_ADDR text_vma;
768
769       abfd = gdb_bfd_open (so->so_name, "pei-i386", -1);
770
771       if (!abfd)
772         return so;
773
774       if (bfd_check_format (abfd, bfd_object))
775         text = bfd_get_section_by_name (abfd, ".text");
776
777       if (!text)
778         {
779           gdb_bfd_unref (abfd);
780           return so;
781         }
782
783       /* The symbols in a dll are offset by 0x1000, which is the
784          offset from 0 of the first byte in an image - because of the
785          file header and the section alignment.  */
786       cygwin_load_start = (CORE_ADDR) (uintptr_t) ((char *)
787                                                    load_addr + 0x1000);
788       cygwin_load_end = cygwin_load_start + bfd_section_size (abfd, text);
789
790       gdb_bfd_unref (abfd);
791     }
792 #endif
793
794   return so;
795 }
796
797 static char *
798 get_image_name (HANDLE h, void *address, int unicode)
799 {
800 #ifdef __CYGWIN__
801   static char buf[__PMAX];
802 #else
803   static char buf[(2 * __PMAX) + 1];
804 #endif
805   DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
806   char *address_ptr;
807   int len = 0;
808   char b[2];
809   SIZE_T done;
810
811   /* Attempt to read the name of the dll that was detected.
812      This is documented to work only when actively debugging
813      a program.  It will not work for attached processes.  */
814   if (address == NULL)
815     return NULL;
816
817   /* See if we could read the address of a string, and that the
818      address isn't null.  */
819   if (!ReadProcessMemory (h, address,  &address_ptr,
820                           sizeof (address_ptr), &done)
821       || done != sizeof (address_ptr) || !address_ptr)
822     return NULL;
823
824   /* Find the length of the string.  */
825   while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
826          && (b[0] != 0 || b[size - 1] != 0) && done == size)
827     continue;
828
829   if (!unicode)
830     ReadProcessMemory (h, address_ptr, buf, len, &done);
831   else
832     {
833       WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
834       ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
835                          &done);
836 #ifdef __CYGWIN__
837       wcstombs (buf, unicode_address, __PMAX);
838 #else
839       WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
840                            0, 0);
841 #endif
842     }
843
844   return buf;
845 }
846
847 /* Wait for child to do something.  Return pid of child, or -1 in case
848    of error; store status through argument pointer OURSTATUS.  */
849 static int
850 handle_load_dll (void *dummy)
851 {
852   LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
853   char dll_buf[__PMAX];
854   char *dll_name = NULL;
855
856   dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
857
858   if (!get_module_name (event->lpBaseOfDll, dll_buf))
859     dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
860
861   dll_name = dll_buf;
862
863   if (*dll_name == '\0')
864     dll_name = get_image_name (current_process_handle,
865                                event->lpImageName, event->fUnicode);
866   if (!dll_name)
867     return 1;
868
869   solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll);
870   solib_end = solib_end->next;
871
872   DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end->so_name,
873                  host_address_to_string (solib_end->lm_info->load_addr)));
874
875   return 1;
876 }
877
878 static void
879 windows_free_so (struct so_list *so)
880 {
881   if (so->lm_info)
882     xfree (so->lm_info);
883   xfree (so);
884 }
885
886 static int
887 handle_unload_dll (void *dummy)
888 {
889   LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll;
890   struct so_list *so;
891
892   for (so = &solib_start; so->next != NULL; so = so->next)
893     if (so->next->lm_info->load_addr == lpBaseOfDll)
894       {
895         struct so_list *sodel = so->next;
896         so->next = sodel->next;
897         if (!so->next)
898           solib_end = so;
899         DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name));
900
901         windows_free_so (sodel);
902         solib_add (NULL, 0, NULL, auto_solib_add);
903         return 1;
904       }
905
906   /* We did not find any DLL that was previously loaded at this address,
907      so register a complaint.  We do not report an error, because we have
908      observed that this may be happening under some circumstances.  For
909      instance, running 32bit applications on x64 Windows causes us to receive
910      4 mysterious UNLOAD_DLL_DEBUG_EVENTs during the startup phase (these
911      events are apparently caused by the WOW layer, the interface between
912      32bit and 64bit worlds).  */
913   complaint (&symfile_complaints, _("dll starting at %s not found."),
914              host_address_to_string (lpBaseOfDll));
915
916   return 0;
917 }
918
919 /* Clear list of loaded DLLs.  */
920 static void
921 windows_clear_solib (void)
922 {
923   solib_start.next = NULL;
924   solib_end = &solib_start;
925 }
926
927 /* Load DLL symbol info.  */
928 static void
929 dll_symbol_command (char *args, int from_tty)
930 {
931   int n;
932   dont_repeat ();
933
934   if (args == NULL)
935     error (_("dll-symbols requires a file name"));
936
937   n = strlen (args);
938   if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
939     {
940       char *newargs = (char *) alloca (n + 4 + 1);
941       strcpy (newargs, args);
942       strcat (newargs, ".dll");
943       args = newargs;
944     }
945
946   safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
947 }
948
949 /* Handle DEBUG_STRING output from child process.
950    Cygwin prepends its messages with a "cygwin:".  Interpret this as
951    a Cygwin signal.  Otherwise just print the string as a warning.  */
952 static int
953 handle_output_debug_string (struct target_waitstatus *ourstatus)
954 {
955   char *s = NULL;
956   int retval = 0;
957
958   if (!target_read_string
959         ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
960         &s, 1024, 0)
961       || !s || !*s)
962     /* nothing to do */;
963   else if (strncmp (s, _CYGWIN_SIGNAL_STRING,
964                     sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0)
965     {
966 #ifdef __CYGWIN__
967       if (strncmp (s, "cYg", 3) != 0)
968 #endif
969         warning (("%s"), s);
970     }
971 #ifdef __COPY_CONTEXT_SIZE
972   else
973     {
974       /* Got a cygwin signal marker.  A cygwin signal is followed by
975          the signal number itself and then optionally followed by the
976          thread id and address to saved context within the DLL.  If
977          these are supplied, then the given thread is assumed to have
978          issued the signal and the context from the thread is assumed
979          to be stored at the given address in the inferior.  Tell gdb
980          to treat this like a real signal.  */
981       char *p;
982       int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
983       int gotasig = gdb_signal_from_host (sig);
984       ourstatus->value.sig = gotasig;
985       if (gotasig)
986         {
987           LPCVOID x;
988           SIZE_T n;
989           ourstatus->kind = TARGET_WAITKIND_STOPPED;
990           retval = strtoul (p, &p, 0);
991           if (!retval)
992             retval = main_thread_id;
993           else if ((x = (LPCVOID) strtoull (p, NULL, 0))
994                    && ReadProcessMemory (current_process_handle, x,
995                                          &saved_context,
996                                          __COPY_CONTEXT_SIZE, &n)
997                    && n == __COPY_CONTEXT_SIZE)
998             have_saved_context = 1;
999           current_event.dwThreadId = retval;
1000         }
1001     }
1002 #endif
1003
1004   if (s)
1005     xfree (s);
1006   return retval;
1007 }
1008
1009 static int
1010 display_selector (HANDLE thread, DWORD sel)
1011 {
1012   LDT_ENTRY info;
1013   if (GetThreadSelectorEntry (thread, sel, &info))
1014     {
1015       int base, limit;
1016       printf_filtered ("0x%03x: ", (unsigned) sel);
1017       if (!info.HighWord.Bits.Pres)
1018         {
1019           puts_filtered ("Segment not present\n");
1020           return 0;
1021         }
1022       base = (info.HighWord.Bits.BaseHi << 24) +
1023              (info.HighWord.Bits.BaseMid << 16)
1024              + info.BaseLow;
1025       limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
1026       if (info.HighWord.Bits.Granularity)
1027         limit = (limit << 12) | 0xfff;
1028       printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
1029       if (info.HighWord.Bits.Default_Big)
1030         puts_filtered(" 32-bit ");
1031       else
1032         puts_filtered(" 16-bit ");
1033       switch ((info.HighWord.Bits.Type & 0xf) >> 1)
1034         {
1035         case 0:
1036           puts_filtered ("Data (Read-Only, Exp-up");
1037           break;
1038         case 1:
1039           puts_filtered ("Data (Read/Write, Exp-up");
1040           break;
1041         case 2:
1042           puts_filtered ("Unused segment (");
1043           break;
1044         case 3:
1045           puts_filtered ("Data (Read/Write, Exp-down");
1046           break;
1047         case 4:
1048           puts_filtered ("Code (Exec-Only, N.Conf");
1049           break;
1050         case 5:
1051           puts_filtered ("Code (Exec/Read, N.Conf");
1052           break;
1053         case 6:
1054           puts_filtered ("Code (Exec-Only, Conf");
1055           break;
1056         case 7:
1057           puts_filtered ("Code (Exec/Read, Conf");
1058           break;
1059         default:
1060           printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
1061         }
1062       if ((info.HighWord.Bits.Type & 0x1) == 0)
1063         puts_filtered(", N.Acc");
1064       puts_filtered (")\n");
1065       if ((info.HighWord.Bits.Type & 0x10) == 0)
1066         puts_filtered("System selector ");
1067       printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
1068       if (info.HighWord.Bits.Granularity)
1069         puts_filtered ("Page granular.\n");
1070       else
1071         puts_filtered ("Byte granular.\n");
1072       return 1;
1073     }
1074   else
1075     {
1076       DWORD err = GetLastError ();
1077       if (err == ERROR_NOT_SUPPORTED)
1078         printf_filtered ("Function not supported\n");
1079       else
1080         printf_filtered ("Invalid selector 0x%x.\n", (unsigned) sel);
1081       return 0;
1082     }
1083 }
1084
1085 static void
1086 display_selectors (char * args, int from_tty)
1087 {
1088   if (!current_thread)
1089     {
1090       puts_filtered ("Impossible to display selectors now.\n");
1091       return;
1092     }
1093   if (!args)
1094     {
1095
1096       puts_filtered ("Selector $cs\n");
1097       display_selector (current_thread->h,
1098         current_thread->context.SegCs);
1099       puts_filtered ("Selector $ds\n");
1100       display_selector (current_thread->h,
1101         current_thread->context.SegDs);
1102       puts_filtered ("Selector $es\n");
1103       display_selector (current_thread->h,
1104         current_thread->context.SegEs);
1105       puts_filtered ("Selector $ss\n");
1106       display_selector (current_thread->h,
1107         current_thread->context.SegSs);
1108       puts_filtered ("Selector $fs\n");
1109       display_selector (current_thread->h,
1110         current_thread->context.SegFs);
1111       puts_filtered ("Selector $gs\n");
1112       display_selector (current_thread->h,
1113         current_thread->context.SegGs);
1114     }
1115   else
1116     {
1117       int sel;
1118       sel = parse_and_eval_long (args);
1119       printf_filtered ("Selector \"%s\"\n",args);
1120       display_selector (current_thread->h, sel);
1121     }
1122 }
1123
1124 #define DEBUG_EXCEPTION_SIMPLE(x)       if (debug_exceptions) \
1125   printf_unfiltered ("gdb: Target exception %s at %s\n", x, \
1126     host_address_to_string (\
1127       current_event.u.Exception.ExceptionRecord.ExceptionAddress))
1128
1129 static int
1130 handle_exception (struct target_waitstatus *ourstatus)
1131 {
1132   thread_info *th;
1133   DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
1134
1135   ourstatus->kind = TARGET_WAITKIND_STOPPED;
1136
1137   /* Record the context of the current thread.  */
1138   th = thread_rec (current_event.dwThreadId, -1);
1139
1140   switch (code)
1141     {
1142     case EXCEPTION_ACCESS_VIOLATION:
1143       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1144       ourstatus->value.sig = GDB_SIGNAL_SEGV;
1145 #ifdef __CYGWIN__
1146       {
1147         /* See if the access violation happened within the cygwin DLL
1148            itself.  Cygwin uses a kind of exception handling to deal
1149            with passed-in invalid addresses.  gdb should not treat
1150            these as real SEGVs since they will be silently handled by
1151            cygwin.  A real SEGV will (theoretically) be caught by
1152            cygwin later in the process and will be sent as a
1153            cygwin-specific-signal.  So, ignore SEGVs if they show up
1154            within the text segment of the DLL itself.  */
1155         const char *fn;
1156         CORE_ADDR addr = (CORE_ADDR) (uintptr_t)
1157           current_event.u.Exception.ExceptionRecord.ExceptionAddress;
1158
1159         if ((!cygwin_exceptions && (addr >= cygwin_load_start
1160                                     && addr < cygwin_load_end))
1161             || (find_pc_partial_function (addr, &fn, NULL, NULL)
1162                 && strncmp (fn, "KERNEL32!IsBad",
1163                             strlen ("KERNEL32!IsBad")) == 0))
1164           return 0;
1165       }
1166 #endif
1167       break;
1168     case STATUS_STACK_OVERFLOW:
1169       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1170       ourstatus->value.sig = GDB_SIGNAL_SEGV;
1171       break;
1172     case STATUS_FLOAT_DENORMAL_OPERAND:
1173       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1174       ourstatus->value.sig = GDB_SIGNAL_FPE;
1175       break;
1176     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1177       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1178       ourstatus->value.sig = GDB_SIGNAL_FPE;
1179       break;
1180     case STATUS_FLOAT_INEXACT_RESULT:
1181       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1182       ourstatus->value.sig = GDB_SIGNAL_FPE;
1183       break;
1184     case STATUS_FLOAT_INVALID_OPERATION:
1185       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1186       ourstatus->value.sig = GDB_SIGNAL_FPE;
1187       break;
1188     case STATUS_FLOAT_OVERFLOW:
1189       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1190       ourstatus->value.sig = GDB_SIGNAL_FPE;
1191       break;
1192     case STATUS_FLOAT_STACK_CHECK:
1193       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1194       ourstatus->value.sig = GDB_SIGNAL_FPE;
1195       break;
1196     case STATUS_FLOAT_UNDERFLOW:
1197       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1198       ourstatus->value.sig = GDB_SIGNAL_FPE;
1199       break;
1200     case STATUS_FLOAT_DIVIDE_BY_ZERO:
1201       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1202       ourstatus->value.sig = GDB_SIGNAL_FPE;
1203       break;
1204     case STATUS_INTEGER_DIVIDE_BY_ZERO:
1205       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1206       ourstatus->value.sig = GDB_SIGNAL_FPE;
1207       break;
1208     case STATUS_INTEGER_OVERFLOW:
1209       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1210       ourstatus->value.sig = GDB_SIGNAL_FPE;
1211       break;
1212     case EXCEPTION_BREAKPOINT:
1213       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1214       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1215       break;
1216     case DBG_CONTROL_C:
1217       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1218       ourstatus->value.sig = GDB_SIGNAL_INT;
1219       break;
1220     case DBG_CONTROL_BREAK:
1221       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1222       ourstatus->value.sig = GDB_SIGNAL_INT;
1223       break;
1224     case EXCEPTION_SINGLE_STEP:
1225       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1226       ourstatus->value.sig = GDB_SIGNAL_TRAP;
1227       break;
1228     case EXCEPTION_ILLEGAL_INSTRUCTION:
1229       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1230       ourstatus->value.sig = GDB_SIGNAL_ILL;
1231       break;
1232     case EXCEPTION_PRIV_INSTRUCTION:
1233       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1234       ourstatus->value.sig = GDB_SIGNAL_ILL;
1235       break;
1236     case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1237       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1238       ourstatus->value.sig = GDB_SIGNAL_ILL;
1239       break;
1240     default:
1241       /* Treat unhandled first chance exceptions specially.  */
1242       if (current_event.u.Exception.dwFirstChance)
1243         return -1;
1244       printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
1245         (unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
1246         host_address_to_string (
1247           current_event.u.Exception.ExceptionRecord.ExceptionAddress));
1248       ourstatus->value.sig = GDB_SIGNAL_UNKNOWN;
1249       break;
1250     }
1251   exception_count++;
1252   last_sig = ourstatus->value.sig;
1253   return 1;
1254 }
1255
1256 /* Resume all artificially suspended threads if we are continuing
1257    execution.  */
1258 static BOOL
1259 windows_continue (DWORD continue_status, int id)
1260 {
1261   int i;
1262   thread_info *th;
1263   BOOL res;
1264
1265   DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=%x, %s);\n",
1266                   (unsigned) current_event.dwProcessId,
1267                   (unsigned) current_event.dwThreadId,
1268                   continue_status == DBG_CONTINUE ?
1269                   "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1270
1271   for (th = &thread_head; (th = th->next) != NULL;)
1272     if ((id == -1 || id == (int) th->id)
1273         && th->suspended)
1274       {
1275         if (debug_registers_changed)
1276           {
1277             th->context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1278             th->context.Dr0 = dr[0];
1279             th->context.Dr1 = dr[1];
1280             th->context.Dr2 = dr[2];
1281             th->context.Dr3 = dr[3];
1282             th->context.Dr6 = DR6_CLEAR_VALUE;
1283             th->context.Dr7 = dr[7];
1284           }
1285         if (th->context.ContextFlags)
1286           {
1287             CHECK (SetThreadContext (th->h, &th->context));
1288             th->context.ContextFlags = 0;
1289           }
1290         if (th->suspended > 0)
1291           (void) ResumeThread (th->h);
1292         th->suspended = 0;
1293       }
1294
1295   res = ContinueDebugEvent (current_event.dwProcessId,
1296                             current_event.dwThreadId,
1297                             continue_status);
1298
1299   debug_registers_changed = 0;
1300   return res;
1301 }
1302
1303 /* Called in pathological case where Windows fails to send a
1304    CREATE_PROCESS_DEBUG_EVENT after an attach.  */
1305 static DWORD
1306 fake_create_process (void)
1307 {
1308   current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1309                                         current_event.dwProcessId);
1310   if (current_process_handle != NULL)
1311     open_process_used = 1;
1312   else
1313     {
1314       error (_("OpenProcess call failed, GetLastError = %u"),
1315        (unsigned) GetLastError ());
1316       /*  We can not debug anything in that case.  */
1317     }
1318   main_thread_id = current_event.dwThreadId;
1319   current_thread = windows_add_thread (
1320                      ptid_build (current_event.dwProcessId, 0,
1321                                  current_event.dwThreadId),
1322                      current_event.u.CreateThread.hThread,
1323                      current_event.u.CreateThread.lpThreadLocalBase);
1324   return main_thread_id;
1325 }
1326
1327 static void
1328 windows_resume (struct target_ops *ops,
1329                 ptid_t ptid, int step, enum gdb_signal sig)
1330 {
1331   thread_info *th;
1332   DWORD continue_status = DBG_CONTINUE;
1333
1334   /* A specific PTID means `step only this thread id'.  */
1335   int resume_all = ptid_equal (ptid, minus_one_ptid);
1336
1337   /* If we're continuing all threads, it's the current inferior that
1338      should be handled specially.  */
1339   if (resume_all)
1340     ptid = inferior_ptid;
1341
1342   if (sig != GDB_SIGNAL_0)
1343     {
1344       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1345         {
1346           DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1347         }
1348       else if (sig == last_sig)
1349         continue_status = DBG_EXCEPTION_NOT_HANDLED;
1350       else
1351 #if 0
1352 /* This code does not seem to work, because
1353   the kernel does probably not consider changes in the ExceptionRecord
1354   structure when passing the exception to the inferior.
1355   Note that this seems possible in the exception handler itself.  */
1356         {
1357           int i;
1358           for (i = 0; xlate[i].them != -1; i++)
1359             if (xlate[i].us == sig)
1360               {
1361                 current_event.u.Exception.ExceptionRecord.ExceptionCode
1362                   = xlate[i].them;
1363                 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1364                 break;
1365               }
1366           if (continue_status == DBG_CONTINUE)
1367             {
1368               DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1369             }
1370         }
1371 #endif
1372         DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1373           last_sig));
1374     }
1375
1376   last_sig = GDB_SIGNAL_0;
1377
1378   DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
1379                ptid_get_pid (ptid), ptid_get_tid (ptid), step, sig));
1380
1381   /* Get context for currently selected thread.  */
1382   th = thread_rec (ptid_get_tid (inferior_ptid), FALSE);
1383   if (th)
1384     {
1385       if (step)
1386         {
1387           /* Single step by setting t bit.  */
1388           struct regcache *regcache = get_current_regcache ();
1389           struct gdbarch *gdbarch = get_regcache_arch (regcache);
1390           windows_fetch_inferior_registers (ops, regcache,
1391                                             gdbarch_ps_regnum (gdbarch));
1392           th->context.EFlags |= FLAG_TRACE_BIT;
1393         }
1394
1395       if (th->context.ContextFlags)
1396         {
1397           if (debug_registers_changed)
1398             {
1399               th->context.Dr0 = dr[0];
1400               th->context.Dr1 = dr[1];
1401               th->context.Dr2 = dr[2];
1402               th->context.Dr3 = dr[3];
1403               th->context.Dr6 = DR6_CLEAR_VALUE;
1404               th->context.Dr7 = dr[7];
1405             }
1406           CHECK (SetThreadContext (th->h, &th->context));
1407           th->context.ContextFlags = 0;
1408         }
1409     }
1410
1411   /* Allow continuing with the same signal that interrupted us.
1412      Otherwise complain.  */
1413
1414   if (resume_all)
1415     windows_continue (continue_status, -1);
1416   else
1417     windows_continue (continue_status, ptid_get_tid (ptid));
1418 }
1419
1420 /* Ctrl-C handler used when the inferior is not run in the same console.  The
1421    handler is in charge of interrupting the inferior using DebugBreakProcess.
1422    Note that this function is not available prior to Windows XP.  In this case
1423    we emit a warning.  */
1424 static BOOL WINAPI
1425 ctrl_c_handler (DWORD event_type)
1426 {
1427   const int attach_flag = current_inferior ()->attach_flag;
1428
1429   /* Only handle Ctrl-C and Ctrl-Break events.  Ignore others.  */
1430   if (event_type != CTRL_C_EVENT && event_type != CTRL_BREAK_EVENT)
1431     return FALSE;
1432
1433   /* If the inferior and the debugger share the same console, do nothing as
1434      the inferior has also received the Ctrl-C event.  */
1435   if (!new_console && !attach_flag)
1436     return TRUE;
1437
1438   if (!DebugBreakProcess (current_process_handle))
1439     warning (_("Could not interrupt program.  "
1440                "Press Ctrl-c in the program console."));
1441
1442   /* Return true to tell that Ctrl-C has been handled.  */
1443   return TRUE;
1444 }
1445
1446 /* Get the next event from the child.  Return 1 if the event requires
1447    handling by WFI (or whatever).  */
1448 static int
1449 get_windows_debug_event (struct target_ops *ops,
1450                          int pid, struct target_waitstatus *ourstatus)
1451 {
1452   BOOL debug_event;
1453   DWORD continue_status, event_code;
1454   thread_info *th;
1455   static thread_info dummy_thread_info;
1456   int retval = 0;
1457
1458   last_sig = GDB_SIGNAL_0;
1459
1460   if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1461     goto out;
1462
1463   event_count++;
1464   continue_status = DBG_CONTINUE;
1465
1466   event_code = current_event.dwDebugEventCode;
1467   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1468   th = NULL;
1469   have_saved_context = 0;
1470
1471   switch (event_code)
1472     {
1473     case CREATE_THREAD_DEBUG_EVENT:
1474       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1475                      (unsigned) current_event.dwProcessId,
1476                      (unsigned) current_event.dwThreadId,
1477                      "CREATE_THREAD_DEBUG_EVENT"));
1478       if (saw_create != 1)
1479         {
1480           struct inferior *inf;
1481           inf = find_inferior_pid (current_event.dwProcessId);
1482           if (!saw_create && inf->attach_flag)
1483             {
1484               /* Kludge around a Windows bug where first event is a create
1485                  thread event.  Caused when attached process does not have
1486                  a main thread.  */
1487               retval = fake_create_process ();
1488               if (retval)
1489                 saw_create++;
1490             }
1491           break;
1492         }
1493       /* Record the existence of this thread.  */
1494       retval = current_event.dwThreadId;
1495       th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
1496                                          current_event.dwThreadId),
1497                              current_event.u.CreateThread.hThread,
1498                              current_event.u.CreateThread.lpThreadLocalBase);
1499
1500       break;
1501
1502     case EXIT_THREAD_DEBUG_EVENT:
1503       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1504                      (unsigned) current_event.dwProcessId,
1505                      (unsigned) current_event.dwThreadId,
1506                      "EXIT_THREAD_DEBUG_EVENT"));
1507
1508       if (current_event.dwThreadId != main_thread_id)
1509         {
1510           windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
1511                                            current_event.dwThreadId));
1512           th = &dummy_thread_info;
1513         }
1514       break;
1515
1516     case CREATE_PROCESS_DEBUG_EVENT:
1517       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1518                      (unsigned) current_event.dwProcessId,
1519                      (unsigned) current_event.dwThreadId,
1520                      "CREATE_PROCESS_DEBUG_EVENT"));
1521       CloseHandle (current_event.u.CreateProcessInfo.hFile);
1522       if (++saw_create != 1)
1523         break;
1524
1525       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1526       if (main_thread_id)
1527         windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
1528                                            main_thread_id));
1529       main_thread_id = current_event.dwThreadId;
1530       /* Add the main thread.  */
1531       th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
1532                                            current_event.dwThreadId),
1533              current_event.u.CreateProcessInfo.hThread,
1534              current_event.u.CreateProcessInfo.lpThreadLocalBase);
1535       retval = current_event.dwThreadId;
1536       break;
1537
1538     case EXIT_PROCESS_DEBUG_EVENT:
1539       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1540                      (unsigned) current_event.dwProcessId,
1541                      (unsigned) current_event.dwThreadId,
1542                      "EXIT_PROCESS_DEBUG_EVENT"));
1543       if (!windows_initialization_done)
1544         {
1545           target_terminal_ours ();
1546           target_mourn_inferior ();
1547           error (_("During startup program exited with code 0x%x."),
1548                  (unsigned int) current_event.u.ExitProcess.dwExitCode);
1549         }
1550       else if (saw_create == 1)
1551         {
1552           ourstatus->kind = TARGET_WAITKIND_EXITED;
1553           ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1554           retval = main_thread_id;
1555         }
1556       break;
1557
1558     case LOAD_DLL_DEBUG_EVENT:
1559       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1560                      (unsigned) current_event.dwProcessId,
1561                      (unsigned) current_event.dwThreadId,
1562                      "LOAD_DLL_DEBUG_EVENT"));
1563       CloseHandle (current_event.u.LoadDll.hFile);
1564       if (saw_create != 1)
1565         break;
1566       catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1567       ourstatus->kind = TARGET_WAITKIND_LOADED;
1568       ourstatus->value.integer = 0;
1569       retval = main_thread_id;
1570       break;
1571
1572     case UNLOAD_DLL_DEBUG_EVENT:
1573       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1574                      (unsigned) current_event.dwProcessId,
1575                      (unsigned) current_event.dwThreadId,
1576                      "UNLOAD_DLL_DEBUG_EVENT"));
1577       if (saw_create != 1)
1578         break;
1579       catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1580       ourstatus->kind = TARGET_WAITKIND_LOADED;
1581       ourstatus->value.integer = 0;
1582       retval = main_thread_id;
1583       break;
1584
1585     case EXCEPTION_DEBUG_EVENT:
1586       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1587                      (unsigned) current_event.dwProcessId,
1588                      (unsigned) current_event.dwThreadId,
1589                      "EXCEPTION_DEBUG_EVENT"));
1590       if (saw_create != 1)
1591         break;
1592       switch (handle_exception (ourstatus))
1593         {
1594         case 0:
1595           continue_status = DBG_EXCEPTION_NOT_HANDLED;
1596           break;
1597         case 1:
1598           retval = current_event.dwThreadId;
1599           break;
1600         case -1:
1601           last_sig = 1;
1602           continue_status = -1;
1603           break;
1604         }
1605       break;
1606
1607     case OUTPUT_DEBUG_STRING_EVENT:     /* Message from the kernel.  */
1608       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=%x code=%s)\n",
1609                      (unsigned) current_event.dwProcessId,
1610                      (unsigned) current_event.dwThreadId,
1611                      "OUTPUT_DEBUG_STRING_EVENT"));
1612       if (saw_create != 1)
1613         break;
1614       retval = handle_output_debug_string (ourstatus);
1615       break;
1616
1617     default:
1618       if (saw_create != 1)
1619         break;
1620       printf_unfiltered ("gdb: kernel event for pid=%u tid=%x\n",
1621                          (unsigned) current_event.dwProcessId,
1622                          (unsigned) current_event.dwThreadId);
1623       printf_unfiltered ("                 unknown event code %u\n",
1624                          (unsigned) current_event.dwDebugEventCode);
1625       break;
1626     }
1627
1628   if (!retval || saw_create != 1)
1629     {
1630       if (continue_status == -1)
1631         windows_resume (ops, minus_one_ptid, 0, 1);
1632       else
1633         CHECK (windows_continue (continue_status, -1));
1634     }
1635   else
1636     {
1637       inferior_ptid = ptid_build (current_event.dwProcessId, 0,
1638                                   retval);
1639       current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
1640     }
1641
1642 out:
1643   return retval;
1644 }
1645
1646 /* Wait for interesting events to occur in the target process.  */
1647 static ptid_t
1648 windows_wait (struct target_ops *ops,
1649               ptid_t ptid, struct target_waitstatus *ourstatus, int options)
1650 {
1651   int pid = -1;
1652
1653   target_terminal_ours ();
1654
1655   /* We loop when we get a non-standard exception rather than return
1656      with a SPURIOUS because resume can try and step or modify things,
1657      which needs a current_thread->h.  But some of these exceptions mark
1658      the birth or death of threads, which mean that the current thread
1659      isn't necessarily what you think it is.  */
1660
1661   while (1)
1662     {
1663       int retval;
1664
1665       /* If the user presses Ctrl-c while the debugger is waiting
1666          for an event, he expects the debugger to interrupt his program
1667          and to get the prompt back.  There are two possible situations:
1668
1669            - The debugger and the program do not share the console, in
1670              which case the Ctrl-c event only reached the debugger.
1671              In that case, the ctrl_c handler will take care of interrupting
1672              the inferior.  Note that this case is working starting with
1673              Windows XP.  For Windows 2000, Ctrl-C should be pressed in the
1674              inferior console.
1675
1676            - The debugger and the program share the same console, in which
1677              case both debugger and inferior will receive the Ctrl-c event.
1678              In that case the ctrl_c handler will ignore the event, as the
1679              Ctrl-c event generated inside the inferior will trigger the
1680              expected debug event.
1681
1682              FIXME: brobecker/2008-05-20: If the inferior receives the
1683              signal first and the delay until GDB receives that signal
1684              is sufficiently long, GDB can sometimes receive the SIGINT
1685              after we have unblocked the CTRL+C handler.  This would
1686              lead to the debugger stopping prematurely while handling
1687              the new-thread event that comes with the handling of the SIGINT
1688              inside the inferior, and then stop again immediately when
1689              the user tries to resume the execution in the inferior.
1690              This is a classic race that we should try to fix one day.  */
1691       SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
1692       retval = get_windows_debug_event (ops, pid, ourstatus);
1693       SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
1694
1695       if (retval)
1696         return ptid_build (current_event.dwProcessId, 0, retval);
1697       else
1698         {
1699           int detach = 0;
1700
1701           if (deprecated_ui_loop_hook != NULL)
1702             detach = deprecated_ui_loop_hook (0);
1703
1704           if (detach)
1705             windows_kill_inferior (ops);
1706         }
1707     }
1708 }
1709
1710 static void
1711 do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
1712 {
1713   extern int stop_after_trap;
1714   int i;
1715   struct inferior *inf;
1716   struct thread_info *tp;
1717
1718   last_sig = GDB_SIGNAL_0;
1719   event_count = 0;
1720   exception_count = 0;
1721   open_process_used = 0;
1722   debug_registers_changed = 0;
1723   debug_registers_used = 0;
1724   for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1725     dr[i] = 0;
1726 #ifdef __CYGWIN__
1727   cygwin_load_start = cygwin_load_end = 0;
1728 #endif
1729   current_event.dwProcessId = pid;
1730   memset (&current_event, 0, sizeof (current_event));
1731   push_target (ops);
1732   disable_breakpoints_in_shlibs ();
1733   windows_clear_solib ();
1734   clear_proceed_status ();
1735   init_wait_for_inferior ();
1736
1737   inf = current_inferior ();
1738   inferior_appeared (inf, pid);
1739   inf->attach_flag = attaching;
1740
1741   /* Make the new process the current inferior, so terminal handling
1742      can rely on it.  When attaching, we don't know about any thread
1743      id here, but that's OK --- nothing should be referencing the
1744      current thread until we report an event out of windows_wait.  */
1745   inferior_ptid = pid_to_ptid (pid);
1746
1747   terminal_init_inferior_with_pgrp (pid);
1748   target_terminal_inferior ();
1749
1750   windows_initialization_done = 0;
1751   inf->control.stop_soon = STOP_QUIETLY;
1752   while (1)
1753     {
1754       stop_after_trap = 1;
1755       wait_for_inferior ();
1756       tp = inferior_thread ();
1757       if (tp->suspend.stop_signal != GDB_SIGNAL_TRAP)
1758         resume (0, tp->suspend.stop_signal);
1759       else
1760         break;
1761     }
1762
1763   windows_initialization_done = 1;
1764   inf->control.stop_soon = NO_STOP_QUIETLY;
1765   stop_after_trap = 0;
1766   return;
1767 }
1768
1769 /* Try to set or remove a user privilege to the current process.  Return -1
1770    if that fails, the previous setting of that privilege otherwise.
1771
1772    This code is copied from the Cygwin source code and rearranged to allow
1773    dynamically loading of the needed symbols from advapi32 which is only
1774    available on NT/2K/XP.  */
1775 static int
1776 set_process_privilege (const char *privilege, BOOL enable)
1777 {
1778   HANDLE token_hdl = NULL;
1779   LUID restore_priv;
1780   TOKEN_PRIVILEGES new_priv, orig_priv;
1781   int ret = -1;
1782   DWORD size;
1783
1784   if (!OpenProcessToken (GetCurrentProcess (),
1785                          TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1786                          &token_hdl))
1787     goto out;
1788
1789   if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
1790     goto out;
1791
1792   new_priv.PrivilegeCount = 1;
1793   new_priv.Privileges[0].Luid = restore_priv;
1794   new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1795
1796   if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1797                               sizeof orig_priv, &orig_priv, &size))
1798     goto out;
1799 #if 0
1800   /* Disabled, otherwise every `attach' in an unprivileged user session
1801      would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1802      windows_attach().  */
1803   /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1804      be enabled.  GetLastError () returns an correct error code, though.  */
1805   if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1806     goto out;
1807 #endif
1808
1809   ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1810
1811 out:
1812   if (token_hdl)
1813     CloseHandle (token_hdl);
1814
1815   return ret;
1816 }
1817
1818 /* Attach to process PID, then initialize for debugging it.  */
1819 static void
1820 windows_attach (struct target_ops *ops, char *args, int from_tty)
1821 {
1822   BOOL ok;
1823   DWORD pid;
1824
1825   pid = parse_pid_to_attach (args);
1826
1827   if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1828     {
1829       printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1830       printf_unfiltered ("This can cause attach to "
1831                          "fail on Windows NT/2K/XP\n");
1832     }
1833
1834   windows_init_thread_list ();
1835   ok = DebugActiveProcess (pid);
1836   saw_create = 0;
1837
1838 #ifdef __CYGWIN__
1839   if (!ok)
1840     {
1841       /* Try fall back to Cygwin pid.  */
1842       pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1843
1844       if (pid > 0)
1845         ok = DebugActiveProcess (pid);
1846   }
1847 #endif
1848
1849   if (!ok)
1850     error (_("Can't attach to process."));
1851
1852   DebugSetProcessKillOnExit (FALSE);
1853
1854   if (from_tty)
1855     {
1856       char *exec_file = (char *) get_exec_file (0);
1857
1858       if (exec_file)
1859         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1860                            target_pid_to_str (pid_to_ptid (pid)));
1861       else
1862         printf_unfiltered ("Attaching to %s\n",
1863                            target_pid_to_str (pid_to_ptid (pid)));
1864
1865       gdb_flush (gdb_stdout);
1866     }
1867
1868   do_initial_windows_stuff (ops, pid, 1);
1869   target_terminal_ours ();
1870 }
1871
1872 static void
1873 windows_detach (struct target_ops *ops, char *args, int from_tty)
1874 {
1875   int detached = 1;
1876
1877   ptid_t ptid = {-1};
1878   windows_resume (ops, ptid, 0, GDB_SIGNAL_0);
1879
1880   if (!DebugActiveProcessStop (current_event.dwProcessId))
1881     {
1882       error (_("Can't detach process %u (error %u)"),
1883              (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
1884       detached = 0;
1885     }
1886   DebugSetProcessKillOnExit (FALSE);
1887
1888   if (detached && from_tty)
1889     {
1890       char *exec_file = get_exec_file (0);
1891       if (exec_file == 0)
1892         exec_file = "";
1893       printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
1894                          (unsigned) current_event.dwProcessId);
1895       gdb_flush (gdb_stdout);
1896     }
1897
1898   i386_cleanup_dregs ();
1899   inferior_ptid = null_ptid;
1900   detach_inferior (current_event.dwProcessId);
1901
1902   unpush_target (ops);
1903 }
1904
1905 static char *
1906 windows_pid_to_exec_file (int pid)
1907 {
1908   static char path[__PMAX];
1909 #ifdef __CYGWIN__
1910   /* Try to find exe name as symlink target of /proc/<pid>/exe.  */
1911   int nchars;
1912   char procexe[sizeof ("/proc/4294967295/exe")];
1913
1914   xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
1915   nchars = readlink (procexe, path, sizeof(path));
1916   if (nchars > 0 && nchars < sizeof (path))
1917     {
1918       path[nchars] = '\0';      /* Got it */
1919       return path;
1920     }
1921 #endif
1922
1923   /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
1924      of gdb, or we're trying to debug a non-Cygwin windows executable.  */
1925   if (!get_module_name (0, path))
1926     path[0] = '\0';
1927
1928   return path;
1929 }
1930
1931 /* Print status information about what we're accessing.  */
1932
1933 static void
1934 windows_files_info (struct target_ops *ignore)
1935 {
1936   struct inferior *inf = current_inferior ();
1937
1938   printf_unfiltered ("\tUsing the running image of %s %s.\n",
1939                      inf->attach_flag ? "attached" : "child",
1940                      target_pid_to_str (inferior_ptid));
1941 }
1942
1943 static void
1944 windows_open (char *arg, int from_tty)
1945 {
1946   error (_("Use the \"run\" command to start a Unix child process."));
1947 }
1948
1949 /* Modify CreateProcess parameters for use of a new separate console.
1950    Parameters are:
1951    *FLAGS: DWORD parameter for general process creation flags.
1952    *SI: STARTUPINFO structure, for which the console window size and
1953    console buffer size is filled in if GDB is running in a console.
1954    to create the new console.
1955    The size of the used font is not available on all versions of
1956    Windows OS.  Furthermore, the current font might not be the default
1957    font, but this is still better than before.
1958    If the windows and buffer sizes are computed,
1959    SI->DWFLAGS is changed so that this information is used
1960    by CreateProcess function.  */
1961
1962 static void
1963 windows_set_console_info (STARTUPINFO *si, DWORD *flags)
1964 {
1965   HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
1966                                 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
1967
1968   if (hconsole != INVALID_HANDLE_VALUE)
1969     {
1970       CONSOLE_SCREEN_BUFFER_INFO sbinfo;
1971       COORD font_size;
1972       CONSOLE_FONT_INFO cfi;
1973
1974       GetCurrentConsoleFont (hconsole, FALSE, &cfi);
1975       font_size = GetConsoleFontSize (hconsole, cfi.nFont);
1976       GetConsoleScreenBufferInfo(hconsole, &sbinfo);
1977       si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
1978       si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
1979       if (font_size.X)
1980         si->dwXSize *= font_size.X;
1981       else
1982         si->dwXSize *= 8;
1983       if (font_size.Y)
1984         si->dwYSize *= font_size.Y;
1985       else
1986         si->dwYSize *= 12;
1987       si->dwXCountChars = sbinfo.dwSize.X;
1988       si->dwYCountChars = sbinfo.dwSize.Y;
1989       si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
1990     }
1991   *flags |= CREATE_NEW_CONSOLE;
1992 }
1993
1994 #ifndef __CYGWIN__
1995 /* Function called by qsort to sort environment strings.  */
1996
1997 static int
1998 envvar_cmp (const void *a, const void *b)
1999 {
2000   const char **p = (const char **) a;
2001   const char **q = (const char **) b;
2002   return strcasecmp (*p, *q);
2003 }
2004 #endif
2005
2006 #ifdef __CYGWIN__
2007 static void
2008 clear_win32_environment (char **env)
2009 {
2010   int i;
2011   size_t len;
2012   wchar_t *copy = NULL, *equalpos;
2013
2014   for (i = 0; env[i] && *env[i]; i++)
2015     {
2016       len = mbstowcs (NULL, env[i], 0) + 1;
2017       copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2018       mbstowcs (copy, env[i], len);
2019       equalpos = wcschr (copy, L'=');
2020       if (equalpos)
2021         *equalpos = L'\0';
2022       SetEnvironmentVariableW (copy, NULL);
2023     }
2024   xfree (copy);
2025 }
2026 #endif
2027
2028 /* Start an inferior windows child process and sets inferior_ptid to its pid.
2029    EXEC_FILE is the file to run.
2030    ALLARGS is a string containing the arguments to the program.
2031    ENV is the environment vector to pass.  Errors reported with error().  */
2032
2033 static void
2034 windows_create_inferior (struct target_ops *ops, char *exec_file,
2035                        char *allargs, char **in_env, int from_tty)
2036 {
2037   STARTUPINFO si;
2038 #ifdef __CYGWIN__
2039   cygwin_buf_t real_path[__PMAX];
2040   cygwin_buf_t shell[__PMAX]; /* Path to shell */
2041   const char *sh;
2042   cygwin_buf_t *toexec;
2043   cygwin_buf_t *cygallargs;
2044   cygwin_buf_t *args;
2045   char **old_env = NULL;
2046   PWCHAR w32_env;
2047   size_t len;
2048   int tty;
2049   int ostdin, ostdout, ostderr;
2050 #else
2051   char real_path[__PMAX];
2052   char shell[__PMAX]; /* Path to shell */
2053   char *toexec;
2054   char *args;
2055   size_t args_len;
2056   HANDLE tty;
2057   char *w32env;
2058   char *temp;
2059   size_t envlen;
2060   int i;
2061   size_t envsize;
2062   char **env;
2063 #endif
2064   PROCESS_INFORMATION pi;
2065   BOOL ret;
2066   DWORD flags = 0;
2067   const char *inferior_io_terminal = get_inferior_io_terminal ();
2068
2069   if (!exec_file)
2070     error (_("No executable specified, use `target exec'."));
2071
2072   memset (&si, 0, sizeof (si));
2073   si.cb = sizeof (si);
2074
2075   if (new_group)
2076     flags |= CREATE_NEW_PROCESS_GROUP;
2077
2078   if (new_console)
2079     windows_set_console_info (&si, &flags);
2080
2081 #ifdef __CYGWIN__
2082   if (!useshell)
2083     {
2084       flags |= DEBUG_ONLY_THIS_PROCESS;
2085       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
2086                             __PMAX * sizeof (cygwin_buf_t)) < 0)
2087         error (_("Error starting executable: %d"), errno);
2088       toexec = real_path;
2089 #ifdef __USEWIDE
2090       len = mbstowcs (NULL, allargs, 0) + 1;
2091       if (len == (size_t) -1)
2092         error (_("Error starting executable: %d"), errno);
2093       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2094       mbstowcs (cygallargs, allargs, len);
2095 #else
2096       cygallargs = allargs;
2097 #endif
2098     }
2099   else
2100     {
2101       sh = getenv ("SHELL");
2102       if (!sh)
2103         sh = "/bin/sh";
2104       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
2105         error (_("Error starting executable via shell: %d"), errno);
2106 #ifdef __USEWIDE
2107       len = sizeof (L" -c 'exec  '") + mbstowcs (NULL, exec_file, 0)
2108             + mbstowcs (NULL, allargs, 0) + 2;
2109       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2110       swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
2111 #else
2112       len = (sizeof (" -c 'exec  '") + strlen (exec_file)
2113              + strlen (allargs) + 2);
2114       cygallargs = (char *) alloca (len);
2115       xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
2116 #endif
2117       toexec = shell;
2118       flags |= DEBUG_PROCESS;
2119     }
2120
2121 #ifdef __USEWIDE
2122   args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
2123                                   * sizeof (wchar_t));
2124   wcscpy (args, toexec);
2125   wcscat (args, L" ");
2126   wcscat (args, cygallargs);
2127 #else
2128   args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
2129   strcpy (args, toexec);
2130   strcat (args, " ");
2131   strcat (args, cygallargs);
2132 #endif
2133
2134 #ifdef CW_CVT_ENV_TO_WINENV
2135   /* First try to create a direct Win32 copy of the POSIX environment. */
2136   w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
2137   if (w32_env != (PWCHAR) -1)
2138     flags |= CREATE_UNICODE_ENVIRONMENT;
2139   else
2140     /* If that fails, fall back to old method tweaking GDB's environment. */
2141 #endif
2142     {
2143       /* Reset all Win32 environment variables to avoid leftover on next run. */
2144       clear_win32_environment (environ);
2145       /* Prepare the environment vars for CreateProcess.  */
2146       old_env = environ;
2147       environ = in_env;
2148       cygwin_internal (CW_SYNC_WINENV);
2149       w32_env = NULL;
2150     }
2151
2152   if (!inferior_io_terminal)
2153     tty = ostdin = ostdout = ostderr = -1;
2154   else
2155     {
2156       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
2157       if (tty < 0)
2158         {
2159           print_sys_errmsg (inferior_io_terminal, errno);
2160           ostdin = ostdout = ostderr = -1;
2161         }
2162       else
2163         {
2164           ostdin = dup (0);
2165           ostdout = dup (1);
2166           ostderr = dup (2);
2167           dup2 (tty, 0);
2168           dup2 (tty, 1);
2169           dup2 (tty, 2);
2170         }
2171     }
2172
2173   windows_init_thread_list ();
2174   ret = CreateProcess (0,
2175                        args,    /* command line */
2176                        NULL,    /* Security */
2177                        NULL,    /* thread */
2178                        TRUE,    /* inherit handles */
2179                        flags,   /* start flags */
2180                        w32_env, /* environment */
2181                        NULL,    /* current directory */
2182                        &si,
2183                        &pi);
2184   if (w32_env)
2185     /* Just free the Win32 environment, if it could be created. */
2186     free (w32_env);
2187   else
2188     {
2189       /* Reset all environment variables to avoid leftover on next run. */
2190       clear_win32_environment (in_env);
2191       /* Restore normal GDB environment variables.  */
2192       environ = old_env;
2193       cygwin_internal (CW_SYNC_WINENV);
2194     }
2195
2196   if (tty >= 0)
2197     {
2198       close (tty);
2199       dup2 (ostdin, 0);
2200       dup2 (ostdout, 1);
2201       dup2 (ostderr, 2);
2202       close (ostdin);
2203       close (ostdout);
2204       close (ostderr);
2205     }
2206 #else
2207   toexec = exec_file;
2208   /* Build the command line, a space-separated list of tokens where
2209      the first token is the name of the module to be executed.
2210      To avoid ambiguities introduced by spaces in the module name,
2211      we quote it.  */
2212   args_len = strlen (toexec) + 2 /* quotes */ + strlen (allargs) + 2;
2213   args = alloca (args_len);
2214   xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs);
2215
2216   flags |= DEBUG_ONLY_THIS_PROCESS;
2217
2218   if (!inferior_io_terminal)
2219     tty = INVALID_HANDLE_VALUE;
2220   else
2221     {
2222       SECURITY_ATTRIBUTES sa;
2223       sa.nLength = sizeof(sa);
2224       sa.lpSecurityDescriptor = 0;
2225       sa.bInheritHandle = TRUE;
2226       tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
2227                          0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
2228       if (tty == INVALID_HANDLE_VALUE)
2229         warning (_("Warning: Failed to open TTY %s, error %#x."),
2230                  inferior_io_terminal, (unsigned) GetLastError ());
2231       else
2232         {
2233           si.hStdInput = tty;
2234           si.hStdOutput = tty;
2235           si.hStdError = tty;
2236           si.dwFlags |= STARTF_USESTDHANDLES;
2237         }
2238     }
2239
2240   /* CreateProcess takes the environment list as a null terminated set of
2241      strings (i.e. two nulls terminate the list).  */
2242
2243   /* Get total size for env strings.  */
2244   for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
2245     envlen += strlen (in_env[i]) + 1;
2246
2247   envsize = sizeof (in_env[0]) * (i + 1);
2248   env = (char **) alloca (envsize);
2249   memcpy (env, in_env, envsize);
2250   /* Windows programs expect the environment block to be sorted.  */
2251   qsort (env, i, sizeof (char *), envvar_cmp);
2252
2253   w32env = alloca (envlen + 1);
2254
2255   /* Copy env strings into new buffer.  */
2256   for (temp = w32env, i = 0; env[i] && *env[i]; i++)
2257     {
2258       strcpy (temp, env[i]);
2259       temp += strlen (temp) + 1;
2260     }
2261
2262   /* Final nil string to terminate new env.  */
2263   *temp = 0;
2264
2265   windows_init_thread_list ();
2266   ret = CreateProcessA (0,
2267                         args,   /* command line */
2268                         NULL,   /* Security */
2269                         NULL,   /* thread */
2270                         TRUE,   /* inherit handles */
2271                         flags,  /* start flags */
2272                         w32env, /* environment */
2273                         NULL,   /* current directory */
2274                         &si,
2275                         &pi);
2276   if (tty != INVALID_HANDLE_VALUE)
2277     CloseHandle (tty);
2278 #endif
2279
2280   if (!ret)
2281     error (_("Error creating process %s, (error %u)."),
2282            exec_file, (unsigned) GetLastError ());
2283
2284   CloseHandle (pi.hThread);
2285   CloseHandle (pi.hProcess);
2286
2287   if (useshell && shell[0] != '\0')
2288     saw_create = -1;
2289   else
2290     saw_create = 0;
2291
2292   do_initial_windows_stuff (ops, pi.dwProcessId, 0);
2293
2294   /* windows_continue (DBG_CONTINUE, -1); */
2295 }
2296
2297 static void
2298 windows_mourn_inferior (struct target_ops *ops)
2299 {
2300   (void) windows_continue (DBG_CONTINUE, -1);
2301   i386_cleanup_dregs();
2302   if (open_process_used)
2303     {
2304       CHECK (CloseHandle (current_process_handle));
2305       open_process_used = 0;
2306     }
2307   unpush_target (ops);
2308   generic_mourn_inferior ();
2309 }
2310
2311 /* Send a SIGINT to the process group.  This acts just like the user typed a
2312    ^C on the controlling terminal.  */
2313
2314 static void
2315 windows_stop (ptid_t ptid)
2316 {
2317   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
2318   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
2319   registers_changed ();         /* refresh register state */
2320 }
2321
2322 static int
2323 windows_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
2324                    int write, struct mem_attrib *mem,
2325                    struct target_ops *target)
2326 {
2327   SIZE_T done = 0;
2328   if (write)
2329     {
2330       DEBUG_MEM (("gdb: write target memory, %d bytes at %s\n",
2331                   len, core_addr_to_string (memaddr)));
2332       if (!WriteProcessMemory (current_process_handle,
2333                                (LPVOID) (uintptr_t) memaddr, our,
2334                                len, &done))
2335         done = 0;
2336       FlushInstructionCache (current_process_handle,
2337                              (LPCVOID) (uintptr_t) memaddr, len);
2338     }
2339   else
2340     {
2341       DEBUG_MEM (("gdb: read target memory, %d bytes at %s\n",
2342                   len, core_addr_to_string (memaddr)));
2343       if (!ReadProcessMemory (current_process_handle,
2344                               (LPCVOID) (uintptr_t) memaddr, our,
2345                               len, &done))
2346         done = 0;
2347     }
2348   return done;
2349 }
2350
2351 static void
2352 windows_kill_inferior (struct target_ops *ops)
2353 {
2354   CHECK (TerminateProcess (current_process_handle, 0));
2355
2356   for (;;)
2357     {
2358       if (!windows_continue (DBG_CONTINUE, -1))
2359         break;
2360       if (!WaitForDebugEvent (&current_event, INFINITE))
2361         break;
2362       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2363         break;
2364     }
2365
2366   target_mourn_inferior ();     /* Or just windows_mourn_inferior?  */
2367 }
2368
2369 static void
2370 windows_prepare_to_store (struct regcache *regcache)
2371 {
2372   /* Do nothing, since we can store individual regs.  */
2373 }
2374
2375 static int
2376 windows_can_run (void)
2377 {
2378   return 1;
2379 }
2380
2381 static void
2382 windows_close (void)
2383 {
2384   DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2385                 PIDGET (inferior_ptid)));
2386 }
2387
2388 /* Convert pid to printable format.  */
2389 static char *
2390 windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
2391 {
2392   static char buf[80];
2393
2394   if (ptid_get_tid (ptid) != 0)
2395     {
2396       snprintf (buf, sizeof (buf), "Thread %d.0x%lx",
2397                 ptid_get_pid (ptid), ptid_get_tid (ptid));
2398       return buf;
2399     }
2400
2401   return normal_pid_to_str (ptid);
2402 }
2403
2404 static LONGEST
2405 windows_xfer_shared_libraries (struct target_ops *ops,
2406                              enum target_object object, const char *annex,
2407                              gdb_byte *readbuf, const gdb_byte *writebuf,
2408                              ULONGEST offset, LONGEST len)
2409 {
2410   struct obstack obstack;
2411   const char *buf;
2412   LONGEST len_avail;
2413   struct so_list *so;
2414
2415   if (writebuf)
2416     return -1;
2417
2418   obstack_init (&obstack);
2419   obstack_grow_str (&obstack, "<library-list>\n");
2420   for (so = solib_start.next; so; so = so->next)
2421     windows_xfer_shared_library (so->so_name, (CORE_ADDR)
2422                                  (uintptr_t) so->lm_info->load_addr,
2423                                  target_gdbarch (), &obstack);
2424   obstack_grow_str0 (&obstack, "</library-list>\n");
2425
2426   buf = obstack_finish (&obstack);
2427   len_avail = strlen (buf);
2428   if (offset >= len_avail)
2429     len= 0;
2430   else
2431     {
2432       if (len > len_avail - offset)
2433         len = len_avail - offset;
2434       memcpy (readbuf, buf + offset, len);
2435     }
2436
2437   obstack_free (&obstack, NULL);
2438   return len;
2439 }
2440
2441 static LONGEST
2442 windows_xfer_partial (struct target_ops *ops, enum target_object object,
2443                     const char *annex, gdb_byte *readbuf,
2444                     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
2445 {
2446   switch (object)
2447     {
2448     case TARGET_OBJECT_MEMORY:
2449       if (readbuf)
2450         return (*ops->deprecated_xfer_memory) (offset, readbuf,
2451                                                len, 0/*read*/, NULL, ops);
2452       if (writebuf)
2453         return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
2454                                                len, 1/*write*/, NULL, ops);
2455       return -1;
2456
2457     case TARGET_OBJECT_LIBRARIES:
2458       return windows_xfer_shared_libraries (ops, object, annex, readbuf,
2459                                           writebuf, offset, len);
2460
2461     default:
2462       if (ops->beneath != NULL)
2463         return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
2464                                               readbuf, writebuf, offset, len);
2465       return -1;
2466     }
2467 }
2468
2469 /* Provide thread local base, i.e. Thread Information Block address.
2470    Returns 1 if ptid is found and sets *ADDR to thread_local_base.  */
2471
2472 static int
2473 windows_get_tib_address (ptid_t ptid, CORE_ADDR *addr)
2474 {
2475   thread_info *th;
2476
2477   th = thread_rec (ptid_get_tid (ptid), 0);
2478   if (th == NULL)
2479     return 0;
2480
2481   if (addr != NULL)
2482     *addr = th->thread_local_base;
2483
2484   return 1;
2485 }
2486
2487 static ptid_t
2488 windows_get_ada_task_ptid (long lwp, long thread)
2489 {
2490   return ptid_build (ptid_get_pid (inferior_ptid), 0, lwp);
2491 }
2492
2493 static void
2494 init_windows_ops (void)
2495 {
2496   windows_ops.to_shortname = "child";
2497   windows_ops.to_longname = "Win32 child process";
2498   windows_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2499   windows_ops.to_open = windows_open;
2500   windows_ops.to_close = windows_close;
2501   windows_ops.to_attach = windows_attach;
2502   windows_ops.to_attach_no_wait = 1;
2503   windows_ops.to_detach = windows_detach;
2504   windows_ops.to_resume = windows_resume;
2505   windows_ops.to_wait = windows_wait;
2506   windows_ops.to_fetch_registers = windows_fetch_inferior_registers;
2507   windows_ops.to_store_registers = windows_store_inferior_registers;
2508   windows_ops.to_prepare_to_store = windows_prepare_to_store;
2509   windows_ops.deprecated_xfer_memory = windows_xfer_memory;
2510   windows_ops.to_xfer_partial = windows_xfer_partial;
2511   windows_ops.to_files_info = windows_files_info;
2512   windows_ops.to_insert_breakpoint = memory_insert_breakpoint;
2513   windows_ops.to_remove_breakpoint = memory_remove_breakpoint;
2514   windows_ops.to_terminal_init = terminal_init_inferior;
2515   windows_ops.to_terminal_inferior = terminal_inferior;
2516   windows_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2517   windows_ops.to_terminal_ours = terminal_ours;
2518   windows_ops.to_terminal_save_ours = terminal_save_ours;
2519   windows_ops.to_terminal_info = child_terminal_info;
2520   windows_ops.to_kill = windows_kill_inferior;
2521   windows_ops.to_create_inferior = windows_create_inferior;
2522   windows_ops.to_mourn_inferior = windows_mourn_inferior;
2523   windows_ops.to_can_run = windows_can_run;
2524   windows_ops.to_thread_alive = windows_thread_alive;
2525   windows_ops.to_pid_to_str = windows_pid_to_str;
2526   windows_ops.to_stop = windows_stop;
2527   windows_ops.to_stratum = process_stratum;
2528   windows_ops.to_has_all_memory = default_child_has_all_memory;
2529   windows_ops.to_has_memory = default_child_has_memory;
2530   windows_ops.to_has_stack = default_child_has_stack;
2531   windows_ops.to_has_registers = default_child_has_registers;
2532   windows_ops.to_has_execution = default_child_has_execution;
2533   windows_ops.to_pid_to_exec_file = windows_pid_to_exec_file;
2534   windows_ops.to_get_ada_task_ptid = windows_get_ada_task_ptid;
2535   windows_ops.to_get_tib_address = windows_get_tib_address;
2536
2537   i386_use_watchpoints (&windows_ops);
2538
2539   i386_dr_low.set_control = cygwin_set_dr7;
2540   i386_dr_low.set_addr = cygwin_set_dr;
2541   i386_dr_low.get_addr = cygwin_get_dr;
2542   i386_dr_low.get_status = cygwin_get_dr6;
2543   i386_dr_low.get_control = cygwin_get_dr7;
2544
2545   /* i386_dr_low.debug_register_length field is set by
2546      calling i386_set_debug_register_length function
2547      in processor windows specific native file.  */
2548
2549   windows_ops.to_magic = OPS_MAGIC;
2550 }
2551
2552 static void
2553 set_windows_aliases (char *argv0)
2554 {
2555   add_info_alias ("dll", "sharedlibrary", 1);
2556 }
2557
2558 /* -Wmissing-prototypes */
2559 extern initialize_file_ftype _initialize_windows_nat;
2560
2561 void
2562 _initialize_windows_nat (void)
2563 {
2564   struct cmd_list_element *c;
2565
2566   init_windows_ops ();
2567
2568 #ifdef __CYGWIN__
2569   cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
2570 #endif
2571
2572   c = add_com ("dll-symbols", class_files, dll_symbol_command,
2573                _("Load dll library symbols from FILE."));
2574   set_cmd_completer (c, filename_completer);
2575
2576   add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2577
2578   add_com_alias ("add-shared-symbol-files", "dll-symbols", class_alias, 1);
2579
2580   add_com_alias ("assf", "dll-symbols", class_alias, 1);
2581
2582 #ifdef __CYGWIN__
2583   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2584 Set use of shell to start subprocess."), _("\
2585 Show use of shell to start subprocess."), NULL,
2586                            NULL,
2587                            NULL, /* FIXME: i18n: */
2588                            &setlist, &showlist);
2589
2590   add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
2591                            &cygwin_exceptions, _("\
2592 Break when an exception is detected in the Cygwin DLL itself."), _("\
2593 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2594                            NULL,
2595                            NULL, /* FIXME: i18n: */
2596                            &setlist, &showlist);
2597 #endif
2598
2599   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2600 Set creation of new console when creating child process."), _("\
2601 Show creation of new console when creating child process."), NULL,
2602                            NULL,
2603                            NULL, /* FIXME: i18n: */
2604                            &setlist, &showlist);
2605
2606   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2607 Set creation of new group when creating child process."), _("\
2608 Show creation of new group when creating child process."), NULL,
2609                            NULL,
2610                            NULL, /* FIXME: i18n: */
2611                            &setlist, &showlist);
2612
2613   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2614 Set whether to display execution in child process."), _("\
2615 Show whether to display execution in child process."), NULL,
2616                            NULL,
2617                            NULL, /* FIXME: i18n: */
2618                            &setlist, &showlist);
2619
2620   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2621 Set whether to display kernel events in child process."), _("\
2622 Show whether to display kernel events in child process."), NULL,
2623                            NULL,
2624                            NULL, /* FIXME: i18n: */
2625                            &setlist, &showlist);
2626
2627   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2628 Set whether to display memory accesses in child process."), _("\
2629 Show whether to display memory accesses in child process."), NULL,
2630                            NULL,
2631                            NULL, /* FIXME: i18n: */
2632                            &setlist, &showlist);
2633
2634   add_setshow_boolean_cmd ("debugexceptions", class_support,
2635                            &debug_exceptions, _("\
2636 Set whether to display kernel exceptions in child process."), _("\
2637 Show whether to display kernel exceptions in child process."), NULL,
2638                            NULL,
2639                            NULL, /* FIXME: i18n: */
2640                            &setlist, &showlist);
2641
2642   init_w32_command_list ();
2643
2644   add_cmd ("selector", class_info, display_selectors,
2645            _("Display selectors infos."),
2646            &info_w32_cmdlist);
2647   add_target (&windows_ops);
2648   deprecated_init_ui_hook = set_windows_aliases;
2649 }
2650
2651 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
2652
2653 /* Pass the address ADDR to the inferior in the I'th debug register.
2654    Here we just store the address in dr array, the registers will be
2655    actually set up when windows_continue is called.  */
2656 static void
2657 cygwin_set_dr (int i, CORE_ADDR addr)
2658 {
2659   if (i < 0 || i > 3)
2660     internal_error (__FILE__, __LINE__,
2661                     _("Invalid register %d in cygwin_set_dr.\n"), i);
2662   dr[i] = addr;
2663   debug_registers_changed = 1;
2664   debug_registers_used = 1;
2665 }
2666
2667 /* Pass the value VAL to the inferior in the DR7 debug control
2668    register.  Here we just store the address in D_REGS, the watchpoint
2669    will be actually set up in windows_wait.  */
2670 static void
2671 cygwin_set_dr7 (unsigned long val)
2672 {
2673   dr[7] = (CORE_ADDR) val;
2674   debug_registers_changed = 1;
2675   debug_registers_used = 1;
2676 }
2677
2678 /* Get the value of debug register I from the inferior.  */
2679
2680 static CORE_ADDR
2681 cygwin_get_dr (int i)
2682 {
2683   return dr[i];
2684 }
2685
2686 /* Get the value of the DR6 debug status register from the inferior.
2687    Here we just return the value stored in dr[6]
2688    by the last call to thread_rec for current_event.dwThreadId id.  */
2689 static unsigned long
2690 cygwin_get_dr6 (void)
2691 {
2692   return (unsigned long) dr[6];
2693 }
2694
2695 /* Get the value of the DR7 debug status register from the inferior.
2696    Here we just return the value stored in dr[7] by the last call to
2697    thread_rec for current_event.dwThreadId id.  */
2698
2699 static unsigned long
2700 cygwin_get_dr7 (void)
2701 {
2702   return (unsigned long) dr[7];
2703 }
2704
2705 /* Determine if the thread referenced by "ptid" is alive
2706    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
2707    it means that the thread has died.  Otherwise it is assumed to be alive.  */
2708 static int
2709 windows_thread_alive (struct target_ops *ops, ptid_t ptid)
2710 {
2711   int tid;
2712
2713   gdb_assert (ptid_get_tid (ptid) != 0);
2714   tid = ptid_get_tid (ptid);
2715
2716   return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) == WAIT_OBJECT_0
2717     ? FALSE : TRUE;
2718 }
2719
2720 /* -Wmissing-prototypes */
2721 extern initialize_file_ftype _initialize_check_for_gdb_ini;
2722
2723 void
2724 _initialize_check_for_gdb_ini (void)
2725 {
2726   char *homedir;
2727   if (inhibit_gdbinit)
2728     return;
2729
2730   homedir = getenv ("HOME");
2731   if (homedir)
2732     {
2733       char *p;
2734       char *oldini = (char *) alloca (strlen (homedir) +
2735                                       sizeof ("/gdb.ini"));
2736       strcpy (oldini, homedir);
2737       p = strchr (oldini, '\0');
2738       if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
2739         *p++ = '/';
2740       strcpy (p, "gdb.ini");
2741       if (access (oldini, 0) == 0)
2742         {
2743           int len = strlen (oldini);
2744           char *newini = alloca (len + 1);
2745
2746           xsnprintf (newini, len + 1, "%.*s.gdbinit",
2747                      (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2748           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2749         }
2750     }
2751 }
2752
2753 /* Define dummy functions which always return error for the rare cases where
2754    these functions could not be found.  */
2755 static BOOL WINAPI
2756 bad_DebugActiveProcessStop (DWORD w)
2757 {
2758   return FALSE;
2759 }
2760 static BOOL WINAPI
2761 bad_DebugBreakProcess (HANDLE w)
2762 {
2763   return FALSE;
2764 }
2765 static BOOL WINAPI
2766 bad_DebugSetProcessKillOnExit (BOOL w)
2767 {
2768   return FALSE;
2769 }
2770 static BOOL WINAPI
2771 bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
2772 {
2773   return FALSE;
2774 }
2775
2776 #ifdef __USEWIDE
2777 static DWORD WINAPI
2778 bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
2779 {
2780   return 0;
2781 }
2782 #else
2783 static DWORD WINAPI
2784 bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
2785 {
2786   return 0;
2787 }
2788 #endif
2789
2790 static BOOL WINAPI
2791 bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
2792 {
2793   return FALSE;
2794 }
2795
2796 static BOOL WINAPI
2797 bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
2798 {
2799   return FALSE;
2800 }
2801
2802 static BOOL WINAPI
2803 bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
2804 {
2805   f->nFont = 0;
2806   return 1;
2807 }
2808 static COORD WINAPI
2809 bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
2810 {
2811   COORD size;
2812   size.X = 8;
2813   size.Y = 12;
2814   return size;
2815 }
2816  
2817 /* -Wmissing-prototypes */
2818 extern initialize_file_ftype _initialize_loadable;
2819
2820 /* Load any functions which may not be available in ancient versions
2821    of Windows.  */
2822
2823 void
2824 _initialize_loadable (void)
2825 {
2826   HMODULE hm = NULL;
2827
2828   hm = LoadLibrary ("kernel32.dll");
2829   if (hm)
2830     {
2831       DebugActiveProcessStop = (void *)
2832         GetProcAddress (hm, "DebugActiveProcessStop");
2833       DebugBreakProcess = (void *)
2834         GetProcAddress (hm, "DebugBreakProcess");
2835       DebugSetProcessKillOnExit = (void *)
2836         GetProcAddress (hm, "DebugSetProcessKillOnExit");
2837       GetConsoleFontSize = (void *) 
2838         GetProcAddress (hm, "GetConsoleFontSize");
2839       GetCurrentConsoleFont = (void *) 
2840         GetProcAddress (hm, "GetCurrentConsoleFont");
2841     }
2842
2843   /* Set variables to dummy versions of these processes if the function
2844      wasn't found in kernel32.dll.  */
2845   if (!DebugBreakProcess)
2846     DebugBreakProcess = bad_DebugBreakProcess;
2847   if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
2848     {
2849       DebugActiveProcessStop = bad_DebugActiveProcessStop;
2850       DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
2851     }
2852   if (!GetConsoleFontSize)
2853     GetConsoleFontSize = bad_GetConsoleFontSize;
2854   if (!GetCurrentConsoleFont)
2855     GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
2856
2857   /* Load optional functions used for retrieving filename information
2858      associated with the currently debugged process or its dlls.  */
2859   hm = LoadLibrary ("psapi.dll");
2860   if (hm)
2861     {
2862       EnumProcessModules = (void *)
2863         GetProcAddress (hm, "EnumProcessModules");
2864       GetModuleInformation = (void *)
2865         GetProcAddress (hm, "GetModuleInformation");
2866       GetModuleFileNameEx = (void *)
2867         GetProcAddress (hm, GetModuleFileNameEx_name);
2868     }
2869
2870   if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
2871     {
2872       /* Set variables to dummy versions of these processes if the function
2873          wasn't found in psapi.dll.  */
2874       EnumProcessModules = bad_EnumProcessModules;
2875       GetModuleInformation = bad_GetModuleInformation;
2876       GetModuleFileNameEx = bad_GetModuleFileNameEx;
2877       /* This will probably fail on Windows 9x/Me.  Let the user know
2878          that we're missing some functionality.  */
2879       warning(_("\
2880 cannot automatically find executable file or library to read symbols.\n\
2881 Use \"file\" or \"dll\" command to load executable/libraries directly."));
2882     }
2883
2884   hm = LoadLibrary ("advapi32.dll");
2885   if (hm)
2886     {
2887       OpenProcessToken = (void *) GetProcAddress (hm, "OpenProcessToken");
2888       LookupPrivilegeValueA = (void *)
2889         GetProcAddress (hm, "LookupPrivilegeValueA");
2890       AdjustTokenPrivileges = (void *)
2891         GetProcAddress (hm, "AdjustTokenPrivileges");
2892       /* Only need to set one of these since if OpenProcessToken fails nothing
2893          else is needed.  */
2894       if (!OpenProcessToken || !LookupPrivilegeValueA
2895           || !AdjustTokenPrivileges)
2896         OpenProcessToken = bad_OpenProcessToken;
2897     }
2898 }