OSDN Git Service

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