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