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