[C++/mingw] Fix windows-nat.c::xlate
[external/binutils.git] / gdb / windows-nat.c
1 /* Target-vector operations for controlling windows child processes, for GDB.
2
3    Copyright (C) 1995-2015 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 -1;
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       switch (handle_exception (ourstatus))
1495         {
1496         case 0:
1497           continue_status = DBG_EXCEPTION_NOT_HANDLED;
1498           break;
1499         case 1:
1500           thread_id = current_event.dwThreadId;
1501           break;
1502         case -1:
1503           last_sig = 1;
1504           continue_status = -1;
1505           break;
1506         }
1507       break;
1508
1509     case OUTPUT_DEBUG_STRING_EVENT:     /* Message from the kernel.  */
1510       DEBUG_EVENTS (("gdb: kernel event for pid=%u tid=0x%x code=%s)\n",
1511                      (unsigned) current_event.dwProcessId,
1512                      (unsigned) current_event.dwThreadId,
1513                      "OUTPUT_DEBUG_STRING_EVENT"));
1514       if (saw_create != 1)
1515         break;
1516       thread_id = handle_output_debug_string (ourstatus);
1517       break;
1518
1519     default:
1520       if (saw_create != 1)
1521         break;
1522       printf_unfiltered ("gdb: kernel event for pid=%u tid=0x%x\n",
1523                          (unsigned) current_event.dwProcessId,
1524                          (unsigned) current_event.dwThreadId);
1525       printf_unfiltered ("                 unknown event code %u\n",
1526                          (unsigned) current_event.dwDebugEventCode);
1527       break;
1528     }
1529
1530   if (!thread_id || saw_create != 1)
1531     {
1532       if (continue_status == -1)
1533         windows_resume (ops, minus_one_ptid, 0, 1);
1534       else
1535         CHECK (windows_continue (continue_status, -1, 0));
1536     }
1537   else
1538     {
1539       inferior_ptid = ptid_build (current_event.dwProcessId, 0,
1540                                   thread_id);
1541       current_thread = th;
1542       if (!current_thread)
1543         current_thread = thread_rec (thread_id, TRUE);
1544     }
1545
1546 out:
1547   return thread_id;
1548 }
1549
1550 /* Wait for interesting events to occur in the target process.  */
1551 static ptid_t
1552 windows_wait (struct target_ops *ops,
1553               ptid_t ptid, struct target_waitstatus *ourstatus, int options)
1554 {
1555   int pid = -1;
1556
1557   target_terminal_ours ();
1558
1559   /* We loop when we get a non-standard exception rather than return
1560      with a SPURIOUS because resume can try and step or modify things,
1561      which needs a current_thread->h.  But some of these exceptions mark
1562      the birth or death of threads, which mean that the current thread
1563      isn't necessarily what you think it is.  */
1564
1565   while (1)
1566     {
1567       int retval;
1568
1569       /* If the user presses Ctrl-c while the debugger is waiting
1570          for an event, he expects the debugger to interrupt his program
1571          and to get the prompt back.  There are two possible situations:
1572
1573            - The debugger and the program do not share the console, in
1574              which case the Ctrl-c event only reached the debugger.
1575              In that case, the ctrl_c handler will take care of interrupting
1576              the inferior.  Note that this case is working starting with
1577              Windows XP.  For Windows 2000, Ctrl-C should be pressed in the
1578              inferior console.
1579
1580            - The debugger and the program share the same console, in which
1581              case both debugger and inferior will receive the Ctrl-c event.
1582              In that case the ctrl_c handler will ignore the event, as the
1583              Ctrl-c event generated inside the inferior will trigger the
1584              expected debug event.
1585
1586              FIXME: brobecker/2008-05-20: If the inferior receives the
1587              signal first and the delay until GDB receives that signal
1588              is sufficiently long, GDB can sometimes receive the SIGINT
1589              after we have unblocked the CTRL+C handler.  This would
1590              lead to the debugger stopping prematurely while handling
1591              the new-thread event that comes with the handling of the SIGINT
1592              inside the inferior, and then stop again immediately when
1593              the user tries to resume the execution in the inferior.
1594              This is a classic race that we should try to fix one day.  */
1595       SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
1596       retval = get_windows_debug_event (ops, pid, ourstatus);
1597       SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
1598
1599       if (retval)
1600         return ptid_build (current_event.dwProcessId, 0, retval);
1601       else
1602         {
1603           int detach = 0;
1604
1605           if (deprecated_ui_loop_hook != NULL)
1606             detach = deprecated_ui_loop_hook (0);
1607
1608           if (detach)
1609             windows_kill_inferior (ops);
1610         }
1611     }
1612 }
1613
1614 /* Iterate over all DLLs currently mapped by our inferior, and
1615    add them to our list of solibs.  */
1616
1617 static void
1618 windows_add_all_dlls (void)
1619 {
1620   struct so_list *so;
1621   HMODULE dummy_hmodule;
1622   DWORD cb_needed;
1623   HMODULE *hmodules;
1624   int i;
1625
1626   if (EnumProcessModules (current_process_handle, &dummy_hmodule,
1627                           sizeof (HMODULE), &cb_needed) == 0)
1628     return;
1629
1630   if (cb_needed < 1)
1631     return;
1632
1633   hmodules = (HMODULE *) alloca (cb_needed);
1634   if (EnumProcessModules (current_process_handle, hmodules,
1635                           cb_needed, &cb_needed) == 0)
1636     return;
1637
1638   for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++)
1639     {
1640       MODULEINFO mi;
1641 #ifdef __USEWIDE
1642       wchar_t dll_name[__PMAX];
1643       char name[__PMAX];
1644 #else
1645       char dll_name[__PMAX];
1646       char *name;
1647 #endif
1648       if (GetModuleInformation (current_process_handle, hmodules[i],
1649                                 &mi, sizeof (mi)) == 0)
1650         continue;
1651       if (GetModuleFileNameEx (current_process_handle, hmodules[i],
1652                                dll_name, sizeof (dll_name)) == 0)
1653         continue;
1654 #ifdef __USEWIDE
1655       wcstombs (name, dll_name, __PMAX);
1656 #else
1657       name = dll_name;
1658 #endif
1659
1660       solib_end->next = windows_make_so (name, mi.lpBaseOfDll);
1661       solib_end = solib_end->next;
1662     }
1663 }
1664
1665 static void
1666 do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
1667 {
1668   int i;
1669   struct inferior *inf;
1670   struct thread_info *tp;
1671
1672   last_sig = GDB_SIGNAL_0;
1673   event_count = 0;
1674   exception_count = 0;
1675   open_process_used = 0;
1676   debug_registers_changed = 0;
1677   debug_registers_used = 0;
1678   for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1679     dr[i] = 0;
1680 #ifdef __CYGWIN__
1681   cygwin_load_start = cygwin_load_end = 0;
1682 #endif
1683   current_event.dwProcessId = pid;
1684   memset (&current_event, 0, sizeof (current_event));
1685   if (!target_is_pushed (ops))
1686     push_target (ops);
1687   disable_breakpoints_in_shlibs ();
1688   windows_clear_solib ();
1689   clear_proceed_status (0);
1690   init_wait_for_inferior ();
1691
1692   inf = current_inferior ();
1693   inferior_appeared (inf, pid);
1694   inf->attach_flag = attaching;
1695
1696   /* Make the new process the current inferior, so terminal handling
1697      can rely on it.  When attaching, we don't know about any thread
1698      id here, but that's OK --- nothing should be referencing the
1699      current thread until we report an event out of windows_wait.  */
1700   inferior_ptid = pid_to_ptid (pid);
1701
1702   target_terminal_init ();
1703   target_terminal_inferior ();
1704
1705   windows_initialization_done = 0;
1706
1707   while (1)
1708     {
1709       struct target_waitstatus status;
1710
1711       windows_wait (ops, minus_one_ptid, &status, 0);
1712
1713       /* Note windows_wait returns TARGET_WAITKIND_SPURIOUS for thread
1714          events.  */
1715       if (status.kind != TARGET_WAITKIND_LOADED
1716           && status.kind != TARGET_WAITKIND_SPURIOUS)
1717         break;
1718
1719       windows_resume (ops, minus_one_ptid, 0, GDB_SIGNAL_0);
1720     }
1721
1722   /* Now that the inferior has been started and all DLLs have been mapped,
1723      we can iterate over all DLLs and load them in.
1724
1725      We avoid doing it any earlier because, on certain versions of Windows,
1726      LOAD_DLL_DEBUG_EVENTs are sometimes not complete.  In particular,
1727      we have seen on Windows 8.1 that the ntdll.dll load event does not
1728      include the DLL name, preventing us from creating an associated SO.
1729      A possible explanation is that ntdll.dll might be mapped before
1730      the SO info gets created by the Windows system -- ntdll.dll is
1731      the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
1732      do not seem to suffer from that problem.
1733
1734      Rather than try to work around this sort of issue, it is much
1735      simpler to just ignore DLL load/unload events during the startup
1736      phase, and then process them all in one batch now.  */
1737   windows_add_all_dlls ();
1738
1739   windows_initialization_done = 1;
1740   return;
1741 }
1742
1743 /* Try to set or remove a user privilege to the current process.  Return -1
1744    if that fails, the previous setting of that privilege otherwise.
1745
1746    This code is copied from the Cygwin source code and rearranged to allow
1747    dynamically loading of the needed symbols from advapi32 which is only
1748    available on NT/2K/XP.  */
1749 static int
1750 set_process_privilege (const char *privilege, BOOL enable)
1751 {
1752   HANDLE token_hdl = NULL;
1753   LUID restore_priv;
1754   TOKEN_PRIVILEGES new_priv, orig_priv;
1755   int ret = -1;
1756   DWORD size;
1757
1758   if (!OpenProcessToken (GetCurrentProcess (),
1759                          TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1760                          &token_hdl))
1761     goto out;
1762
1763   if (!LookupPrivilegeValueA (NULL, privilege, &restore_priv))
1764     goto out;
1765
1766   new_priv.PrivilegeCount = 1;
1767   new_priv.Privileges[0].Luid = restore_priv;
1768   new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1769
1770   if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1771                               sizeof orig_priv, &orig_priv, &size))
1772     goto out;
1773 #if 0
1774   /* Disabled, otherwise every `attach' in an unprivileged user session
1775      would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1776      windows_attach().  */
1777   /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1778      be enabled.  GetLastError () returns an correct error code, though.  */
1779   if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1780     goto out;
1781 #endif
1782
1783   ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1784
1785 out:
1786   if (token_hdl)
1787     CloseHandle (token_hdl);
1788
1789   return ret;
1790 }
1791
1792 /* Attach to process PID, then initialize for debugging it.  */
1793 static void
1794 windows_attach (struct target_ops *ops, const char *args, int from_tty)
1795 {
1796   BOOL ok;
1797   DWORD pid;
1798
1799   pid = parse_pid_to_attach (args);
1800
1801   if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1802     {
1803       printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1804       printf_unfiltered ("This can cause attach to "
1805                          "fail on Windows NT/2K/XP\n");
1806     }
1807
1808   windows_init_thread_list ();
1809   ok = DebugActiveProcess (pid);
1810   saw_create = 0;
1811
1812 #ifdef __CYGWIN__
1813   if (!ok)
1814     {
1815       /* Try fall back to Cygwin pid.  */
1816       pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1817
1818       if (pid > 0)
1819         ok = DebugActiveProcess (pid);
1820   }
1821 #endif
1822
1823   if (!ok)
1824     error (_("Can't attach to process."));
1825
1826   DebugSetProcessKillOnExit (FALSE);
1827
1828   if (from_tty)
1829     {
1830       char *exec_file = (char *) get_exec_file (0);
1831
1832       if (exec_file)
1833         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1834                            target_pid_to_str (pid_to_ptid (pid)));
1835       else
1836         printf_unfiltered ("Attaching to %s\n",
1837                            target_pid_to_str (pid_to_ptid (pid)));
1838
1839       gdb_flush (gdb_stdout);
1840     }
1841
1842   do_initial_windows_stuff (ops, pid, 1);
1843   target_terminal_ours ();
1844 }
1845
1846 static void
1847 windows_detach (struct target_ops *ops, const char *args, int from_tty)
1848 {
1849   int detached = 1;
1850
1851   ptid_t ptid = {-1};
1852   windows_resume (ops, ptid, 0, GDB_SIGNAL_0);
1853
1854   if (!DebugActiveProcessStop (current_event.dwProcessId))
1855     {
1856       error (_("Can't detach process %u (error %u)"),
1857              (unsigned) current_event.dwProcessId, (unsigned) GetLastError ());
1858       detached = 0;
1859     }
1860   DebugSetProcessKillOnExit (FALSE);
1861
1862   if (detached && from_tty)
1863     {
1864       char *exec_file = get_exec_file (0);
1865       if (exec_file == 0)
1866         exec_file = "";
1867       printf_unfiltered ("Detaching from program: %s, Pid %u\n", exec_file,
1868                          (unsigned) current_event.dwProcessId);
1869       gdb_flush (gdb_stdout);
1870     }
1871
1872   x86_cleanup_dregs ();
1873   inferior_ptid = null_ptid;
1874   detach_inferior (current_event.dwProcessId);
1875
1876   inf_child_maybe_unpush_target (ops);
1877 }
1878
1879 /* Try to determine the executable filename.
1880
1881    EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
1882
1883    Upon success, the filename is stored inside EXE_NAME_RET, and
1884    this function returns nonzero.
1885
1886    Otherwise, this function returns zero and the contents of
1887    EXE_NAME_RET is undefined.  */
1888
1889 static int
1890 windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len)
1891 {
1892   DWORD len;
1893   HMODULE dh_buf;
1894   DWORD cbNeeded;
1895
1896   cbNeeded = 0;
1897   if (!EnumProcessModules (current_process_handle, &dh_buf,
1898                            sizeof (HMODULE), &cbNeeded) || !cbNeeded)
1899     return 0;
1900
1901   /* We know the executable is always first in the list of modules,
1902      which we just fetched.  So no need to fetch more.  */
1903
1904 #ifdef __CYGWIN__
1905   {
1906     /* Cygwin prefers that the path be in /x/y/z format, so extract
1907        the filename into a temporary buffer first, and then convert it
1908        to POSIX format into the destination buffer.  */
1909     cygwin_buf_t *pathbuf = alloca (exe_name_max_len * sizeof (cygwin_buf_t));
1910
1911     len = GetModuleFileNameEx (current_process_handle,
1912                                dh_buf, pathbuf, exe_name_max_len);
1913     if (len == 0)
1914       error (_("Error getting executable filename: %u."),
1915              (unsigned) GetLastError ());
1916     if (cygwin_conv_path (CCP_WIN_W_TO_POSIX, pathbuf, exe_name_ret,
1917                           exe_name_max_len) < 0)
1918       error (_("Error converting executable filename to POSIX: %d."), errno);
1919   }
1920 #else
1921   len = GetModuleFileNameEx (current_process_handle,
1922                              dh_buf, exe_name_ret, exe_name_max_len);
1923   if (len == 0)
1924     error (_("Error getting executable filename: %u."),
1925            (unsigned) GetLastError ());
1926 #endif
1927
1928     return 1;   /* success */
1929 }
1930
1931 /* The pid_to_exec_file target_ops method for this platform.  */
1932
1933 static char *
1934 windows_pid_to_exec_file (struct target_ops *self, int pid)
1935 {
1936   static char path[__PMAX];
1937 #ifdef __CYGWIN__
1938   /* Try to find exe name as symlink target of /proc/<pid>/exe.  */
1939   int nchars;
1940   char procexe[sizeof ("/proc/4294967295/exe")];
1941
1942   xsnprintf (procexe, sizeof (procexe), "/proc/%u/exe", pid);
1943   nchars = readlink (procexe, path, sizeof(path));
1944   if (nchars > 0 && nchars < sizeof (path))
1945     {
1946       path[nchars] = '\0';      /* Got it */
1947       return path;
1948     }
1949 #endif
1950
1951   /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
1952      of gdb, or we're trying to debug a non-Cygwin windows executable.  */
1953   if (!windows_get_exec_module_filename (path, sizeof (path)))
1954     path[0] = '\0';
1955
1956   return path;
1957 }
1958
1959 /* Print status information about what we're accessing.  */
1960
1961 static void
1962 windows_files_info (struct target_ops *ignore)
1963 {
1964   struct inferior *inf = current_inferior ();
1965
1966   printf_unfiltered ("\tUsing the running image of %s %s.\n",
1967                      inf->attach_flag ? "attached" : "child",
1968                      target_pid_to_str (inferior_ptid));
1969 }
1970
1971 /* Modify CreateProcess parameters for use of a new separate console.
1972    Parameters are:
1973    *FLAGS: DWORD parameter for general process creation flags.
1974    *SI: STARTUPINFO structure, for which the console window size and
1975    console buffer size is filled in if GDB is running in a console.
1976    to create the new console.
1977    The size of the used font is not available on all versions of
1978    Windows OS.  Furthermore, the current font might not be the default
1979    font, but this is still better than before.
1980    If the windows and buffer sizes are computed,
1981    SI->DWFLAGS is changed so that this information is used
1982    by CreateProcess function.  */
1983
1984 static void
1985 windows_set_console_info (STARTUPINFO *si, DWORD *flags)
1986 {
1987   HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
1988                                 FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
1989
1990   if (hconsole != INVALID_HANDLE_VALUE)
1991     {
1992       CONSOLE_SCREEN_BUFFER_INFO sbinfo;
1993       COORD font_size;
1994       CONSOLE_FONT_INFO cfi;
1995
1996       GetCurrentConsoleFont (hconsole, FALSE, &cfi);
1997       font_size = GetConsoleFontSize (hconsole, cfi.nFont);
1998       GetConsoleScreenBufferInfo(hconsole, &sbinfo);
1999       si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1;
2000       si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1;
2001       if (font_size.X)
2002         si->dwXSize *= font_size.X;
2003       else
2004         si->dwXSize *= 8;
2005       if (font_size.Y)
2006         si->dwYSize *= font_size.Y;
2007       else
2008         si->dwYSize *= 12;
2009       si->dwXCountChars = sbinfo.dwSize.X;
2010       si->dwYCountChars = sbinfo.dwSize.Y;
2011       si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS;
2012     }
2013   *flags |= CREATE_NEW_CONSOLE;
2014 }
2015
2016 #ifndef __CYGWIN__
2017 /* Function called by qsort to sort environment strings.  */
2018
2019 static int
2020 envvar_cmp (const void *a, const void *b)
2021 {
2022   const char **p = (const char **) a;
2023   const char **q = (const char **) b;
2024   return strcasecmp (*p, *q);
2025 }
2026 #endif
2027
2028 #ifdef __CYGWIN__
2029 static void
2030 clear_win32_environment (char **env)
2031 {
2032   int i;
2033   size_t len;
2034   wchar_t *copy = NULL, *equalpos;
2035
2036   for (i = 0; env[i] && *env[i]; i++)
2037     {
2038       len = mbstowcs (NULL, env[i], 0) + 1;
2039       copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t));
2040       mbstowcs (copy, env[i], len);
2041       equalpos = wcschr (copy, L'=');
2042       if (equalpos)
2043         *equalpos = L'\0';
2044       SetEnvironmentVariableW (copy, NULL);
2045     }
2046   xfree (copy);
2047 }
2048 #endif
2049
2050 /* Start an inferior windows child process and sets inferior_ptid to its pid.
2051    EXEC_FILE is the file to run.
2052    ALLARGS is a string containing the arguments to the program.
2053    ENV is the environment vector to pass.  Errors reported with error().  */
2054
2055 static void
2056 windows_create_inferior (struct target_ops *ops, char *exec_file,
2057                        char *allargs, char **in_env, int from_tty)
2058 {
2059   STARTUPINFO si;
2060 #ifdef __CYGWIN__
2061   cygwin_buf_t real_path[__PMAX];
2062   cygwin_buf_t shell[__PMAX]; /* Path to shell */
2063   const char *sh;
2064   cygwin_buf_t *toexec;
2065   cygwin_buf_t *cygallargs;
2066   cygwin_buf_t *args;
2067   char **old_env = NULL;
2068   PWCHAR w32_env;
2069   size_t len;
2070   int tty;
2071   int ostdin, ostdout, ostderr;
2072 #else
2073   char real_path[__PMAX];
2074   char shell[__PMAX]; /* Path to shell */
2075   char *toexec;
2076   char *args;
2077   size_t args_len;
2078   HANDLE tty;
2079   char *w32env;
2080   char *temp;
2081   size_t envlen;
2082   int i;
2083   size_t envsize;
2084   char **env;
2085 #endif
2086   PROCESS_INFORMATION pi;
2087   BOOL ret;
2088   DWORD flags = 0;
2089   const char *inferior_io_terminal = get_inferior_io_terminal ();
2090
2091   if (!exec_file)
2092     error (_("No executable specified, use `target exec'."));
2093
2094   memset (&si, 0, sizeof (si));
2095   si.cb = sizeof (si);
2096
2097   if (new_group)
2098     flags |= CREATE_NEW_PROCESS_GROUP;
2099
2100   if (new_console)
2101     windows_set_console_info (&si, &flags);
2102
2103 #ifdef __CYGWIN__
2104   if (!useshell)
2105     {
2106       flags |= DEBUG_ONLY_THIS_PROCESS;
2107       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, exec_file, real_path,
2108                             __PMAX * sizeof (cygwin_buf_t)) < 0)
2109         error (_("Error starting executable: %d"), errno);
2110       toexec = real_path;
2111 #ifdef __USEWIDE
2112       len = mbstowcs (NULL, allargs, 0) + 1;
2113       if (len == (size_t) -1)
2114         error (_("Error starting executable: %d"), errno);
2115       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2116       mbstowcs (cygallargs, allargs, len);
2117 #else
2118       cygallargs = allargs;
2119 #endif
2120     }
2121   else
2122     {
2123       sh = getenv ("SHELL");
2124       if (!sh)
2125         sh = "/bin/sh";
2126       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
2127         error (_("Error starting executable via shell: %d"), errno);
2128 #ifdef __USEWIDE
2129       len = sizeof (L" -c 'exec  '") + mbstowcs (NULL, exec_file, 0)
2130             + mbstowcs (NULL, allargs, 0) + 2;
2131       cygallargs = (wchar_t *) alloca (len * sizeof (wchar_t));
2132       swprintf (cygallargs, len, L" -c 'exec %s %s'", exec_file, allargs);
2133 #else
2134       len = (sizeof (" -c 'exec  '") + strlen (exec_file)
2135              + strlen (allargs) + 2);
2136       cygallargs = (char *) alloca (len);
2137       xsnprintf (cygallargs, len, " -c 'exec %s %s'", exec_file, allargs);
2138 #endif
2139       toexec = shell;
2140       flags |= DEBUG_PROCESS;
2141     }
2142
2143 #ifdef __USEWIDE
2144   args = (cygwin_buf_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
2145                                   * sizeof (wchar_t));
2146   wcscpy (args, toexec);
2147   wcscat (args, L" ");
2148   wcscat (args, cygallargs);
2149 #else
2150   args = (cygwin_buf_t *) alloca (strlen (toexec) + strlen (cygallargs) + 2);
2151   strcpy (args, toexec);
2152   strcat (args, " ");
2153   strcat (args, cygallargs);
2154 #endif
2155
2156 #ifdef CW_CVT_ENV_TO_WINENV
2157   /* First try to create a direct Win32 copy of the POSIX environment. */
2158   w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env);
2159   if (w32_env != (PWCHAR) -1)
2160     flags |= CREATE_UNICODE_ENVIRONMENT;
2161   else
2162     /* If that fails, fall back to old method tweaking GDB's environment. */
2163 #endif
2164     {
2165       /* Reset all Win32 environment variables to avoid leftover on next run. */
2166       clear_win32_environment (environ);
2167       /* Prepare the environment vars for CreateProcess.  */
2168       old_env = environ;
2169       environ = in_env;
2170       cygwin_internal (CW_SYNC_WINENV);
2171       w32_env = NULL;
2172     }
2173
2174   if (!inferior_io_terminal)
2175     tty = ostdin = ostdout = ostderr = -1;
2176   else
2177     {
2178       tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
2179       if (tty < 0)
2180         {
2181           print_sys_errmsg (inferior_io_terminal, errno);
2182           ostdin = ostdout = ostderr = -1;
2183         }
2184       else
2185         {
2186           ostdin = dup (0);
2187           ostdout = dup (1);
2188           ostderr = dup (2);
2189           dup2 (tty, 0);
2190           dup2 (tty, 1);
2191           dup2 (tty, 2);
2192         }
2193     }
2194
2195   windows_init_thread_list ();
2196   ret = CreateProcess (0,
2197                        args,    /* command line */
2198                        NULL,    /* Security */
2199                        NULL,    /* thread */
2200                        TRUE,    /* inherit handles */
2201                        flags,   /* start flags */
2202                        w32_env, /* environment */
2203                        NULL,    /* current directory */
2204                        &si,
2205                        &pi);
2206   if (w32_env)
2207     /* Just free the Win32 environment, if it could be created. */
2208     free (w32_env);
2209   else
2210     {
2211       /* Reset all environment variables to avoid leftover on next run. */
2212       clear_win32_environment (in_env);
2213       /* Restore normal GDB environment variables.  */
2214       environ = old_env;
2215       cygwin_internal (CW_SYNC_WINENV);
2216     }
2217
2218   if (tty >= 0)
2219     {
2220       close (tty);
2221       dup2 (ostdin, 0);
2222       dup2 (ostdout, 1);
2223       dup2 (ostderr, 2);
2224       close (ostdin);
2225       close (ostdout);
2226       close (ostderr);
2227     }
2228 #else
2229   toexec = exec_file;
2230   /* Build the command line, a space-separated list of tokens where
2231      the first token is the name of the module to be executed.
2232      To avoid ambiguities introduced by spaces in the module name,
2233      we quote it.  */
2234   args_len = strlen (toexec) + 2 /* quotes */ + strlen (allargs) + 2;
2235   args = (char *) alloca (args_len);
2236   xsnprintf (args, args_len, "\"%s\" %s", toexec, allargs);
2237
2238   flags |= DEBUG_ONLY_THIS_PROCESS;
2239
2240   if (!inferior_io_terminal)
2241     tty = INVALID_HANDLE_VALUE;
2242   else
2243     {
2244       SECURITY_ATTRIBUTES sa;
2245       sa.nLength = sizeof(sa);
2246       sa.lpSecurityDescriptor = 0;
2247       sa.bInheritHandle = TRUE;
2248       tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
2249                          0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
2250       if (tty == INVALID_HANDLE_VALUE)
2251         warning (_("Warning: Failed to open TTY %s, error %#x."),
2252                  inferior_io_terminal, (unsigned) GetLastError ());
2253       else
2254         {
2255           si.hStdInput = tty;
2256           si.hStdOutput = tty;
2257           si.hStdError = tty;
2258           si.dwFlags |= STARTF_USESTDHANDLES;
2259         }
2260     }
2261
2262   /* CreateProcess takes the environment list as a null terminated set of
2263      strings (i.e. two nulls terminate the list).  */
2264
2265   /* Get total size for env strings.  */
2266   for (envlen = 0, i = 0; in_env[i] && *in_env[i]; i++)
2267     envlen += strlen (in_env[i]) + 1;
2268
2269   envsize = sizeof (in_env[0]) * (i + 1);
2270   env = (char **) alloca (envsize);
2271   memcpy (env, in_env, envsize);
2272   /* Windows programs expect the environment block to be sorted.  */
2273   qsort (env, i, sizeof (char *), envvar_cmp);
2274
2275   w32env = (char *) alloca (envlen + 1);
2276
2277   /* Copy env strings into new buffer.  */
2278   for (temp = w32env, i = 0; env[i] && *env[i]; i++)
2279     {
2280       strcpy (temp, env[i]);
2281       temp += strlen (temp) + 1;
2282     }
2283
2284   /* Final nil string to terminate new env.  */
2285   *temp = 0;
2286
2287   windows_init_thread_list ();
2288   ret = CreateProcessA (0,
2289                         args,   /* command line */
2290                         NULL,   /* Security */
2291                         NULL,   /* thread */
2292                         TRUE,   /* inherit handles */
2293                         flags,  /* start flags */
2294                         w32env, /* environment */
2295                         NULL,   /* current directory */
2296                         &si,
2297                         &pi);
2298   if (tty != INVALID_HANDLE_VALUE)
2299     CloseHandle (tty);
2300 #endif
2301
2302   if (!ret)
2303     error (_("Error creating process %s, (error %u)."),
2304            exec_file, (unsigned) GetLastError ());
2305
2306   CloseHandle (pi.hThread);
2307   CloseHandle (pi.hProcess);
2308
2309   if (useshell && shell[0] != '\0')
2310     saw_create = -1;
2311   else
2312     saw_create = 0;
2313
2314   do_initial_windows_stuff (ops, pi.dwProcessId, 0);
2315
2316   /* windows_continue (DBG_CONTINUE, -1, 0); */
2317 }
2318
2319 static void
2320 windows_mourn_inferior (struct target_ops *ops)
2321 {
2322   (void) windows_continue (DBG_CONTINUE, -1, 0);
2323   x86_cleanup_dregs();
2324   if (open_process_used)
2325     {
2326       CHECK (CloseHandle (current_process_handle));
2327       open_process_used = 0;
2328     }
2329   inf_child_mourn_inferior (ops);
2330 }
2331
2332 /* Send a SIGINT to the process group.  This acts just like the user typed a
2333    ^C on the controlling terminal.  */
2334
2335 static void
2336 windows_interrupt (struct target_ops *self, ptid_t ptid)
2337 {
2338   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
2339   CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
2340   registers_changed ();         /* refresh register state */
2341 }
2342
2343 /* Helper for windows_xfer_partial that handles memory transfers.
2344    Arguments are like target_xfer_partial.  */
2345
2346 static enum target_xfer_status
2347 windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
2348                      ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
2349 {
2350   SIZE_T done = 0;
2351   BOOL success;
2352   DWORD lasterror = 0;
2353
2354   if (writebuf != NULL)
2355     {
2356       DEBUG_MEM (("gdb: write target memory, %s bytes at %s\n",
2357                   pulongest (len), core_addr_to_string (memaddr)));
2358       success = WriteProcessMemory (current_process_handle,
2359                                     (LPVOID) (uintptr_t) memaddr, writebuf,
2360                                     len, &done);
2361       if (!success)
2362         lasterror = GetLastError ();
2363       FlushInstructionCache (current_process_handle,
2364                              (LPCVOID) (uintptr_t) memaddr, len);
2365     }
2366   else
2367     {
2368       DEBUG_MEM (("gdb: read target memory, %s bytes at %s\n",
2369                   pulongest (len), core_addr_to_string (memaddr)));
2370       success = ReadProcessMemory (current_process_handle,
2371                                    (LPCVOID) (uintptr_t) memaddr, readbuf,
2372                                    len, &done);
2373       if (!success)
2374         lasterror = GetLastError ();
2375     }
2376   *xfered_len = (ULONGEST) done;
2377   if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
2378     return TARGET_XFER_OK;
2379   else
2380     return success ? TARGET_XFER_OK : TARGET_XFER_E_IO;
2381 }
2382
2383 static void
2384 windows_kill_inferior (struct target_ops *ops)
2385 {
2386   CHECK (TerminateProcess (current_process_handle, 0));
2387
2388   for (;;)
2389     {
2390       if (!windows_continue (DBG_CONTINUE, -1, 1))
2391         break;
2392       if (!WaitForDebugEvent (&current_event, INFINITE))
2393         break;
2394       if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2395         break;
2396     }
2397
2398   target_mourn_inferior ();     /* Or just windows_mourn_inferior?  */
2399 }
2400
2401 static void
2402 windows_close (struct target_ops *self)
2403 {
2404   DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2405                 ptid_get_pid (inferior_ptid)));
2406 }
2407
2408 /* Convert pid to printable format.  */
2409 static char *
2410 windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
2411 {
2412   static char buf[80];
2413
2414   if (ptid_get_tid (ptid) != 0)
2415     {
2416       snprintf (buf, sizeof (buf), "Thread %d.0x%lx",
2417                 ptid_get_pid (ptid), ptid_get_tid (ptid));
2418       return buf;
2419     }
2420
2421   return normal_pid_to_str (ptid);
2422 }
2423
2424 static enum target_xfer_status
2425 windows_xfer_shared_libraries (struct target_ops *ops,
2426                                enum target_object object, const char *annex,
2427                                gdb_byte *readbuf, const gdb_byte *writebuf,
2428                                ULONGEST offset, ULONGEST len,
2429                                ULONGEST *xfered_len)
2430 {
2431   struct obstack obstack;
2432   const char *buf;
2433   LONGEST len_avail;
2434   struct so_list *so;
2435
2436   if (writebuf)
2437     return TARGET_XFER_E_IO;
2438
2439   obstack_init (&obstack);
2440   obstack_grow_str (&obstack, "<library-list>\n");
2441   for (so = solib_start.next; so; so = so->next)
2442     windows_xfer_shared_library (so->so_name, (CORE_ADDR)
2443                                  (uintptr_t) so->lm_info->load_addr,
2444                                  target_gdbarch (), &obstack);
2445   obstack_grow_str0 (&obstack, "</library-list>\n");
2446
2447   buf = (const char *) obstack_finish (&obstack);
2448   len_avail = strlen (buf);
2449   if (offset >= len_avail)
2450     len= 0;
2451   else
2452     {
2453       if (len > len_avail - offset)
2454         len = len_avail - offset;
2455       memcpy (readbuf, buf + offset, len);
2456     }
2457
2458   obstack_free (&obstack, NULL);
2459   *xfered_len = (ULONGEST) len;
2460   return len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF;
2461 }
2462
2463 static enum target_xfer_status
2464 windows_xfer_partial (struct target_ops *ops, enum target_object object,
2465                       const char *annex, gdb_byte *readbuf,
2466                       const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
2467                       ULONGEST *xfered_len)
2468 {
2469   switch (object)
2470     {
2471     case TARGET_OBJECT_MEMORY:
2472       return windows_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
2473
2474     case TARGET_OBJECT_LIBRARIES:
2475       return windows_xfer_shared_libraries (ops, object, annex, readbuf,
2476                                             writebuf, offset, len, xfered_len);
2477
2478     default:
2479       return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
2480                                             readbuf, writebuf, offset, len,
2481                                             xfered_len);
2482     }
2483 }
2484
2485 /* Provide thread local base, i.e. Thread Information Block address.
2486    Returns 1 if ptid is found and sets *ADDR to thread_local_base.  */
2487
2488 static int
2489 windows_get_tib_address (struct target_ops *self,
2490                          ptid_t ptid, CORE_ADDR *addr)
2491 {
2492   windows_thread_info *th;
2493
2494   th = thread_rec (ptid_get_tid (ptid), 0);
2495   if (th == NULL)
2496     return 0;
2497
2498   if (addr != NULL)
2499     *addr = th->thread_local_base;
2500
2501   return 1;
2502 }
2503
2504 static ptid_t
2505 windows_get_ada_task_ptid (struct target_ops *self, long lwp, long thread)
2506 {
2507   return ptid_build (ptid_get_pid (inferior_ptid), 0, lwp);
2508 }
2509
2510 static struct target_ops *
2511 windows_target (void)
2512 {
2513   struct target_ops *t = inf_child_target ();
2514
2515   t->to_close = windows_close;
2516   t->to_attach = windows_attach;
2517   t->to_attach_no_wait = 1;
2518   t->to_detach = windows_detach;
2519   t->to_resume = windows_resume;
2520   t->to_wait = windows_wait;
2521   t->to_fetch_registers = windows_fetch_inferior_registers;
2522   t->to_store_registers = windows_store_inferior_registers;
2523   t->to_xfer_partial = windows_xfer_partial;
2524   t->to_files_info = windows_files_info;
2525   t->to_kill = windows_kill_inferior;
2526   t->to_create_inferior = windows_create_inferior;
2527   t->to_mourn_inferior = windows_mourn_inferior;
2528   t->to_thread_alive = windows_thread_alive;
2529   t->to_pid_to_str = windows_pid_to_str;
2530   t->to_interrupt = windows_interrupt;
2531   t->to_pid_to_exec_file = windows_pid_to_exec_file;
2532   t->to_get_ada_task_ptid = windows_get_ada_task_ptid;
2533   t->to_get_tib_address = windows_get_tib_address;
2534
2535   return t;
2536 }
2537
2538 /* -Wmissing-prototypes */
2539 extern initialize_file_ftype _initialize_windows_nat;
2540
2541 void
2542 _initialize_windows_nat (void)
2543 {
2544   struct target_ops *t;
2545
2546   t = windows_target ();
2547
2548   x86_use_watchpoints (t);
2549
2550   x86_dr_low.set_control = cygwin_set_dr7;
2551   x86_dr_low.set_addr = cygwin_set_dr;
2552   x86_dr_low.get_addr = cygwin_get_dr;
2553   x86_dr_low.get_status = cygwin_get_dr6;
2554   x86_dr_low.get_control = cygwin_get_dr7;
2555
2556   /* x86_dr_low.debug_register_length field is set by
2557      calling x86_set_debug_register_length function
2558      in processor windows specific native file.  */
2559
2560   add_target (t);
2561
2562 #ifdef __CYGWIN__
2563   cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);
2564 #endif
2565
2566 #ifdef __CYGWIN__
2567   add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2568 Set use of shell to start subprocess."), _("\
2569 Show use of shell to start subprocess."), NULL,
2570                            NULL,
2571                            NULL, /* FIXME: i18n: */
2572                            &setlist, &showlist);
2573
2574   add_setshow_boolean_cmd ("cygwin-exceptions", class_support,
2575                            &cygwin_exceptions, _("\
2576 Break when an exception is detected in the Cygwin DLL itself."), _("\
2577 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2578                            NULL,
2579                            NULL, /* FIXME: i18n: */
2580                            &setlist, &showlist);
2581 #endif
2582
2583   add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2584 Set creation of new console when creating child process."), _("\
2585 Show creation of new console when creating child process."), NULL,
2586                            NULL,
2587                            NULL, /* FIXME: i18n: */
2588                            &setlist, &showlist);
2589
2590   add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2591 Set creation of new group when creating child process."), _("\
2592 Show creation of new group when creating child process."), NULL,
2593                            NULL,
2594                            NULL, /* FIXME: i18n: */
2595                            &setlist, &showlist);
2596
2597   add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2598 Set whether to display execution in child process."), _("\
2599 Show whether to display execution in child process."), NULL,
2600                            NULL,
2601                            NULL, /* FIXME: i18n: */
2602                            &setlist, &showlist);
2603
2604   add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2605 Set whether to display kernel events in child process."), _("\
2606 Show whether to display kernel events in child process."), NULL,
2607                            NULL,
2608                            NULL, /* FIXME: i18n: */
2609                            &setlist, &showlist);
2610
2611   add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2612 Set whether to display memory accesses in child process."), _("\
2613 Show whether to display memory accesses in child process."), NULL,
2614                            NULL,
2615                            NULL, /* FIXME: i18n: */
2616                            &setlist, &showlist);
2617
2618   add_setshow_boolean_cmd ("debugexceptions", class_support,
2619                            &debug_exceptions, _("\
2620 Set whether to display kernel exceptions in child process."), _("\
2621 Show whether to display kernel exceptions in child process."), NULL,
2622                            NULL,
2623                            NULL, /* FIXME: i18n: */
2624                            &setlist, &showlist);
2625
2626   init_w32_command_list ();
2627
2628   add_cmd ("selector", class_info, display_selectors,
2629            _("Display selectors infos."),
2630            &info_w32_cmdlist);
2631 }
2632
2633 /* Hardware watchpoint support, adapted from go32-nat.c code.  */
2634
2635 /* Pass the address ADDR to the inferior in the I'th debug register.
2636    Here we just store the address in dr array, the registers will be
2637    actually set up when windows_continue is called.  */
2638 static void
2639 cygwin_set_dr (int i, CORE_ADDR addr)
2640 {
2641   if (i < 0 || i > 3)
2642     internal_error (__FILE__, __LINE__,
2643                     _("Invalid register %d in cygwin_set_dr.\n"), i);
2644   dr[i] = addr;
2645   debug_registers_changed = 1;
2646   debug_registers_used = 1;
2647 }
2648
2649 /* Pass the value VAL to the inferior in the DR7 debug control
2650    register.  Here we just store the address in D_REGS, the watchpoint
2651    will be actually set up in windows_wait.  */
2652 static void
2653 cygwin_set_dr7 (unsigned long val)
2654 {
2655   dr[7] = (CORE_ADDR) val;
2656   debug_registers_changed = 1;
2657   debug_registers_used = 1;
2658 }
2659
2660 /* Get the value of debug register I from the inferior.  */
2661
2662 static CORE_ADDR
2663 cygwin_get_dr (int i)
2664 {
2665   return dr[i];
2666 }
2667
2668 /* Get the value of the DR6 debug status register from the inferior.
2669    Here we just return the value stored in dr[6]
2670    by the last call to thread_rec for current_event.dwThreadId id.  */
2671 static unsigned long
2672 cygwin_get_dr6 (void)
2673 {
2674   return (unsigned long) dr[6];
2675 }
2676
2677 /* Get the value of the DR7 debug status register from the inferior.
2678    Here we just return the value stored in dr[7] by the last call to
2679    thread_rec for current_event.dwThreadId id.  */
2680
2681 static unsigned long
2682 cygwin_get_dr7 (void)
2683 {
2684   return (unsigned long) dr[7];
2685 }
2686
2687 /* Determine if the thread referenced by "ptid" is alive
2688    by "polling" it.  If WaitForSingleObject returns WAIT_OBJECT_0
2689    it means that the thread has died.  Otherwise it is assumed to be alive.  */
2690 static int
2691 windows_thread_alive (struct target_ops *ops, ptid_t ptid)
2692 {
2693   int tid;
2694
2695   gdb_assert (ptid_get_tid (ptid) != 0);
2696   tid = ptid_get_tid (ptid);
2697
2698   return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) == WAIT_OBJECT_0
2699     ? FALSE : TRUE;
2700 }
2701
2702 /* -Wmissing-prototypes */
2703 extern initialize_file_ftype _initialize_check_for_gdb_ini;
2704
2705 void
2706 _initialize_check_for_gdb_ini (void)
2707 {
2708   char *homedir;
2709   if (inhibit_gdbinit)
2710     return;
2711
2712   homedir = getenv ("HOME");
2713   if (homedir)
2714     {
2715       char *p;
2716       char *oldini = (char *) alloca (strlen (homedir) +
2717                                       sizeof ("/gdb.ini"));
2718       strcpy (oldini, homedir);
2719       p = strchr (oldini, '\0');
2720       if (p > oldini && !IS_DIR_SEPARATOR (p[-1]))
2721         *p++ = '/';
2722       strcpy (p, "gdb.ini");
2723       if (access (oldini, 0) == 0)
2724         {
2725           int len = strlen (oldini);
2726           char *newini = (char *) alloca (len + 1);
2727
2728           xsnprintf (newini, len + 1, "%.*s.gdbinit",
2729                      (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2730           warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2731         }
2732     }
2733 }
2734
2735 /* Define dummy functions which always return error for the rare cases where
2736    these functions could not be found.  */
2737 static BOOL WINAPI
2738 bad_DebugActiveProcessStop (DWORD w)
2739 {
2740   return FALSE;
2741 }
2742 static BOOL WINAPI
2743 bad_DebugBreakProcess (HANDLE w)
2744 {
2745   return FALSE;
2746 }
2747 static BOOL WINAPI
2748 bad_DebugSetProcessKillOnExit (BOOL w)
2749 {
2750   return FALSE;
2751 }
2752 static BOOL WINAPI
2753 bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
2754 {
2755   return FALSE;
2756 }
2757
2758 #ifdef __USEWIDE
2759 static DWORD WINAPI
2760 bad_GetModuleFileNameExW (HANDLE w, HMODULE x, LPWSTR y, DWORD z)
2761 {
2762   return 0;
2763 }
2764 #else
2765 static DWORD WINAPI
2766 bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
2767 {
2768   return 0;
2769 }
2770 #endif
2771
2772 static BOOL WINAPI
2773 bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
2774 {
2775   return FALSE;
2776 }
2777
2778 static BOOL WINAPI
2779 bad_OpenProcessToken (HANDLE w, DWORD x, PHANDLE y)
2780 {
2781   return FALSE;
2782 }
2783
2784 static BOOL WINAPI
2785 bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f)
2786 {
2787   f->nFont = 0;
2788   return 1;
2789 }
2790 static COORD WINAPI
2791 bad_GetConsoleFontSize (HANDLE w, DWORD nFont)
2792 {
2793   COORD size;
2794   size.X = 8;
2795   size.Y = 12;
2796   return size;
2797 }
2798  
2799 /* -Wmissing-prototypes */
2800 extern initialize_file_ftype _initialize_loadable;
2801
2802 /* Load any functions which may not be available in ancient versions
2803    of Windows.  */
2804
2805 void
2806 _initialize_loadable (void)
2807 {
2808   HMODULE hm = NULL;
2809
2810 #define GPA(m, func)                                    \
2811   func = (func ## _ftype *) GetProcAddress (m, #func)
2812
2813   hm = LoadLibrary ("kernel32.dll");
2814   if (hm)
2815     {
2816       GPA (hm, DebugActiveProcessStop);
2817       GPA (hm, DebugBreakProcess);
2818       GPA (hm, DebugSetProcessKillOnExit);
2819       GPA (hm, GetConsoleFontSize);
2820       GPA (hm, DebugActiveProcessStop);
2821       GPA (hm, GetCurrentConsoleFont);
2822     }
2823
2824   /* Set variables to dummy versions of these processes if the function
2825      wasn't found in kernel32.dll.  */
2826   if (!DebugBreakProcess)
2827     DebugBreakProcess = bad_DebugBreakProcess;
2828   if (!DebugActiveProcessStop || !DebugSetProcessKillOnExit)
2829     {
2830       DebugActiveProcessStop = bad_DebugActiveProcessStop;
2831       DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
2832     }
2833   if (!GetConsoleFontSize)
2834     GetConsoleFontSize = bad_GetConsoleFontSize;
2835   if (!GetCurrentConsoleFont)
2836     GetCurrentConsoleFont = bad_GetCurrentConsoleFont;
2837
2838   /* Load optional functions used for retrieving filename information
2839      associated with the currently debugged process or its dlls.  */
2840   hm = LoadLibrary ("psapi.dll");
2841   if (hm)
2842     {
2843       GPA (hm, EnumProcessModules);
2844       GPA (hm, GetModuleInformation);
2845       GPA (hm, GetModuleFileNameEx);
2846     }
2847
2848   if (!EnumProcessModules || !GetModuleInformation || !GetModuleFileNameEx)
2849     {
2850       /* Set variables to dummy versions of these processes if the function
2851          wasn't found in psapi.dll.  */
2852       EnumProcessModules = bad_EnumProcessModules;
2853       GetModuleInformation = bad_GetModuleInformation;
2854       GetModuleFileNameEx = bad_GetModuleFileNameEx;
2855       /* This will probably fail on Windows 9x/Me.  Let the user know
2856          that we're missing some functionality.  */
2857       warning(_("\
2858 cannot automatically find executable file or library to read symbols.\n\
2859 Use \"file\" or \"dll\" command to load executable/libraries directly."));
2860     }
2861
2862   hm = LoadLibrary ("advapi32.dll");
2863   if (hm)
2864     {
2865       GPA (hm, OpenProcessToken);
2866       GPA (hm, LookupPrivilegeValueA);
2867       GPA (hm, AdjustTokenPrivileges);
2868       /* Only need to set one of these since if OpenProcessToken fails nothing
2869          else is needed.  */
2870       if (!OpenProcessToken || !LookupPrivilegeValueA
2871           || !AdjustTokenPrivileges)
2872         OpenProcessToken = bad_OpenProcessToken;
2873     }
2874
2875 #undef GPA
2876 }