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