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