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