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