* win32-nat.c (env_sort): Remove.
[binutils-gdb.git] / gdb / win32-nat.c
1 /* Target-vector operations for controlling win32 child processes, for GDB.
2
3 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006
5 Free Software Foundation, Inc.
6
7 Contributed by Cygnus Solutions, A Red Hat Company.
8
9 This file is part of GDB.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without eve nthe implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 Boston, MA 02110-1301, USA. */
25
26 /* Originally by Steve Chamberlain, sac@cygnus.com */
27
28 /* We assume we're being built with and will be used for cygwin. */
29
30 #include "defs.h"
31 #include "frame.h" /* required by inferior.h */
32 #include "inferior.h"
33 #include "target.h"
34 #include "exceptions.h"
35 #include "gdbcore.h"
36 #include "command.h"
37 #include "completer.h"
38 #include "regcache.h"
39 #include "top.h"
40 #include <signal.h>
41 #include <sys/types.h>
42 #include <fcntl.h>
43 #include <stdlib.h>
44 #include <windows.h>
45 #include <imagehlp.h>
46 #include <sys/cygwin.h>
47 #include <signal.h>
48
49 #include "buildsym.h"
50 #include "symfile.h"
51 #include "objfiles.h"
52 #include "gdb_string.h"
53 #include "gdbthread.h"
54 #include "gdbcmd.h"
55 #include <sys/param.h>
56 #include <unistd.h>
57 #include "exec.h"
58 #include "solist.h"
59 #include "solib.h"
60
61 #include "i386-tdep.h"
62 #include "i387-tdep.h"
63
64 static struct target_ops win32_ops;
65 static struct target_so_ops win32_so_ops;
66
67 /* The starting and ending address of the cygwin1.dll text segment. */
68 static bfd_vma cygwin_load_start;
69 static bfd_vma cygwin_load_end;
70
71 static int have_saved_context; /* True if we've saved context from a cygwin signal. */
72 static CONTEXT saved_context; /* Containes the saved context from a cygwin signal. */
73
74 /* If we're not using the old Cygwin header file set, define the
75 following which never should have been in the generic Win32 API
76 headers in the first place since they were our own invention... */
77 #ifndef _GNU_H_WINDOWS_H
78 enum
79 {
80 FLAG_TRACE_BIT = 0x100,
81 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
82 };
83 #endif
84 #include <sys/procfs.h>
85 #include <psapi.h>
86
87 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
88 | CONTEXT_EXTENDED_REGISTERS
89
90 static unsigned dr[8];
91 static int debug_registers_changed;
92 static int debug_registers_used;
93
94 /* The string sent by cygwin when it processes a signal.
95 FIXME: This should be in a cygwin include file. */
96 #ifndef _CYGWIN_SIGNAL_STRING
97 #define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
98 #endif
99
100 #define CHECK(x) check (x, __FILE__,__LINE__)
101 #define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
102 #define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
103 #define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
104 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
105
106 static void win32_stop (void);
107 static int win32_win32_thread_alive (ptid_t);
108 static void win32_kill_inferior (void);
109
110 static enum target_signal last_sig = TARGET_SIGNAL_0;
111 /* Set if a signal was received from the debugged process */
112
113 /* Thread information structure used to track information that is
114 not available in gdb's thread structure. */
115 typedef struct thread_info_struct
116 {
117 struct thread_info_struct *next;
118 DWORD id;
119 HANDLE h;
120 char *name;
121 int suspend_count;
122 int reload_context;
123 CONTEXT context;
124 STACKFRAME sf;
125 }
126 thread_info;
127
128 static thread_info thread_head;
129
130 /* The process and thread handles for the above context. */
131
132 static DEBUG_EVENT current_event; /* The current debug event from
133 WaitForDebugEvent */
134 static HANDLE current_process_handle; /* Currently executing process */
135 static thread_info *current_thread; /* Info on currently selected thread */
136 static DWORD main_thread_id; /* Thread ID of the main thread */
137
138 /* Counts of things. */
139 static int exception_count = 0;
140 static int event_count = 0;
141 static int saw_create;
142
143 /* User options. */
144 static int new_console = 0;
145 static int cygwin_exceptions = 0;
146 static int new_group = 1;
147 static int debug_exec = 0; /* show execution */
148 static int debug_events = 0; /* show events from kernel */
149 static int debug_memory = 0; /* show target memory accesses */
150 static int debug_exceptions = 0; /* show target exceptions */
151 static int useshell = 0; /* use shell for subprocesses */
152
153 /* This vector maps GDB's idea of a register's number into an address
154 in the win32 exception context vector.
155
156 It also contains the bit mask needed to load the register in question.
157
158 One day we could read a reg, we could inspect the context we
159 already have loaded, if it doesn't have the bit set that we need,
160 we read that set of registers in using GetThreadContext. If the
161 context already contains what we need, we just unpack it. Then to
162 write a register, first we have to ensure that the context contains
163 the other regs of the group, and then we copy the info in and set
164 out bit. */
165
166 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
167 static const int mappings[] =
168 {
169 context_offset (Eax),
170 context_offset (Ecx),
171 context_offset (Edx),
172 context_offset (Ebx),
173 context_offset (Esp),
174 context_offset (Ebp),
175 context_offset (Esi),
176 context_offset (Edi),
177 context_offset (Eip),
178 context_offset (EFlags),
179 context_offset (SegCs),
180 context_offset (SegSs),
181 context_offset (SegDs),
182 context_offset (SegEs),
183 context_offset (SegFs),
184 context_offset (SegGs),
185 context_offset (FloatSave.RegisterArea[0 * 10]),
186 context_offset (FloatSave.RegisterArea[1 * 10]),
187 context_offset (FloatSave.RegisterArea[2 * 10]),
188 context_offset (FloatSave.RegisterArea[3 * 10]),
189 context_offset (FloatSave.RegisterArea[4 * 10]),
190 context_offset (FloatSave.RegisterArea[5 * 10]),
191 context_offset (FloatSave.RegisterArea[6 * 10]),
192 context_offset (FloatSave.RegisterArea[7 * 10]),
193 context_offset (FloatSave.ControlWord),
194 context_offset (FloatSave.StatusWord),
195 context_offset (FloatSave.TagWord),
196 context_offset (FloatSave.ErrorSelector),
197 context_offset (FloatSave.ErrorOffset),
198 context_offset (FloatSave.DataSelector),
199 context_offset (FloatSave.DataOffset),
200 context_offset (FloatSave.ErrorSelector)
201 /* XMM0-7 */ ,
202 context_offset (ExtendedRegisters[10*16]),
203 context_offset (ExtendedRegisters[11*16]),
204 context_offset (ExtendedRegisters[12*16]),
205 context_offset (ExtendedRegisters[13*16]),
206 context_offset (ExtendedRegisters[14*16]),
207 context_offset (ExtendedRegisters[15*16]),
208 context_offset (ExtendedRegisters[16*16]),
209 context_offset (ExtendedRegisters[17*16]),
210 /* MXCSR */
211 context_offset (ExtendedRegisters[24])
212 };
213
214 #undef context_offset
215
216 /* This vector maps the target's idea of an exception (extracted
217 from the DEBUG_EVENT structure) to GDB's idea. */
218
219 struct xlate_exception
220 {
221 int them;
222 enum target_signal us;
223 };
224
225 static const struct xlate_exception
226 xlate[] =
227 {
228 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
229 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
230 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
231 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
232 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
233 {STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
234 {-1, -1}};
235
236 static void
237 check (BOOL ok, const char *file, int line)
238 {
239 if (!ok)
240 printf_filtered ("error return %s:%d was %lu\n", file, line,
241 GetLastError ());
242 }
243
244 /* Find a thread record given a thread id.
245 If get_context then also retrieve the context for this
246 thread. */
247 static thread_info *
248 thread_rec (DWORD id, int get_context)
249 {
250 thread_info *th;
251
252 for (th = &thread_head; (th = th->next) != NULL;)
253 if (th->id == id)
254 {
255 if (!th->suspend_count && get_context)
256 {
257 if (get_context > 0 && id != current_event.dwThreadId)
258 th->suspend_count = SuspendThread (th->h) + 1;
259 else if (get_context < 0)
260 th->suspend_count = -1;
261 th->reload_context = 1;
262 }
263 return th;
264 }
265
266 return NULL;
267 }
268
269 /* Add a thread to the thread list */
270 static thread_info *
271 win32_add_thread (DWORD id, HANDLE h)
272 {
273 thread_info *th;
274
275 if ((th = thread_rec (id, FALSE)))
276 return th;
277
278 th = XZALLOC (thread_info);
279 th->id = id;
280 th->h = h;
281 th->next = thread_head.next;
282 thread_head.next = th;
283 add_thread (pid_to_ptid (id));
284 /* Set the debug registers for the new thread in they are used. */
285 if (debug_registers_used)
286 {
287 /* Only change the value of the debug registers. */
288 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
289 CHECK (GetThreadContext (th->h, &th->context));
290 th->context.Dr0 = dr[0];
291 th->context.Dr1 = dr[1];
292 th->context.Dr2 = dr[2];
293 th->context.Dr3 = dr[3];
294 /* th->context.Dr6 = dr[6];
295 FIXME: should we set dr6 also ?? */
296 th->context.Dr7 = dr[7];
297 CHECK (SetThreadContext (th->h, &th->context));
298 th->context.ContextFlags = 0;
299 }
300 return th;
301 }
302
303 /* Clear out any old thread list and reintialize it to a
304 pristine state. */
305 static void
306 win32_init_thread_list (void)
307 {
308 thread_info *th = &thread_head;
309
310 DEBUG_EVENTS (("gdb: win32_init_thread_list\n"));
311 init_thread_list ();
312 while (th->next != NULL)
313 {
314 thread_info *here = th->next;
315 th->next = here->next;
316 (void) CloseHandle (here->h);
317 xfree (here);
318 }
319 thread_head.next = NULL;
320 }
321
322 /* Delete a thread from the list of threads */
323 static void
324 win32_delete_thread (DWORD id)
325 {
326 thread_info *th;
327
328 if (info_verbose)
329 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
330 delete_thread (pid_to_ptid (id));
331
332 for (th = &thread_head;
333 th->next != NULL && th->next->id != id;
334 th = th->next)
335 continue;
336
337 if (th->next != NULL)
338 {
339 thread_info *here = th->next;
340 th->next = here->next;
341 CloseHandle (here->h);
342 xfree (here);
343 }
344 }
345
346 static void
347 do_win32_fetch_inferior_registers (int r)
348 {
349 char *context_offset = ((char *) &current_thread->context) + mappings[r];
350 long l;
351
352 if (!current_thread)
353 return; /* Windows sometimes uses a non-existent thread id in its
354 events */
355
356 if (current_thread->reload_context)
357 {
358 #ifdef __COPY_CONTEXT_SIZE
359 if (have_saved_context)
360 {
361 /* Lie about where the program actually is stopped since cygwin has informed us that
362 we should consider the signal to have occurred at another location which is stored
363 in "saved_context. */
364 memcpy (&current_thread->context, &saved_context, __COPY_CONTEXT_SIZE);
365 have_saved_context = 0;
366 }
367 else
368 #endif
369 {
370 thread_info *th = current_thread;
371 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
372 GetThreadContext (th->h, &th->context);
373 /* Copy dr values from that thread. */
374 dr[0] = th->context.Dr0;
375 dr[1] = th->context.Dr1;
376 dr[2] = th->context.Dr2;
377 dr[3] = th->context.Dr3;
378 dr[6] = th->context.Dr6;
379 dr[7] = th->context.Dr7;
380 }
381 current_thread->reload_context = 0;
382 }
383
384 #define I387_ST0_REGNUM I386_ST0_REGNUM
385
386 if (r == I387_FISEG_REGNUM)
387 {
388 l = *((long *) context_offset) & 0xffff;
389 regcache_raw_supply (current_regcache, r, (char *) &l);
390 }
391 else if (r == I387_FOP_REGNUM)
392 {
393 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
394 regcache_raw_supply (current_regcache, r, (char *) &l);
395 }
396 else if (r >= 0)
397 regcache_raw_supply (current_regcache, r, context_offset);
398 else
399 {
400 for (r = 0; r < NUM_REGS; r++)
401 do_win32_fetch_inferior_registers (r);
402 }
403
404 #undef I387_ST0_REGNUM
405 }
406
407 static void
408 win32_fetch_inferior_registers (int r)
409 {
410 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
411 /* Check if current_thread exists. Windows sometimes uses a non-existent
412 thread id in its events */
413 if (current_thread)
414 do_win32_fetch_inferior_registers (r);
415 }
416
417 static void
418 do_win32_store_inferior_registers (int r)
419 {
420 if (!current_thread)
421 /* Windows sometimes uses a non-existent thread id in its events */;
422 else if (r >= 0)
423 regcache_raw_collect (current_regcache, r,
424 ((char *) &current_thread->context) + mappings[r]);
425 else
426 {
427 for (r = 0; r < NUM_REGS; r++)
428 do_win32_store_inferior_registers (r);
429 }
430 }
431
432 /* Store a new register value into the current thread context */
433 static void
434 win32_store_inferior_registers (int r)
435 {
436 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
437 /* Check if current_thread exists. Windows sometimes uses a non-existent
438 thread id in its events */
439 if (current_thread)
440 do_win32_store_inferior_registers (r);
441 }
442
443 static int psapi_loaded = 0;
444 static HMODULE psapi_module_handle = NULL;
445 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
446 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
447 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
448
449 static int
450 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
451 {
452 DWORD len;
453 MODULEINFO mi;
454 int i;
455 HMODULE dh_buf[1];
456 HMODULE *DllHandle = dh_buf;
457 DWORD cbNeeded;
458 BOOL ok;
459
460 if (!psapi_loaded ||
461 psapi_EnumProcessModules == NULL ||
462 psapi_GetModuleInformation == NULL ||
463 psapi_GetModuleFileNameExA == NULL)
464 {
465 if (psapi_loaded)
466 goto failed;
467 psapi_loaded = 1;
468 psapi_module_handle = LoadLibrary ("psapi.dll");
469 if (!psapi_module_handle)
470 {
471 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
472 goto failed;
473 }
474 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
475 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
476 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
477 "GetModuleFileNameExA");
478 if (psapi_EnumProcessModules == NULL ||
479 psapi_GetModuleInformation == NULL ||
480 psapi_GetModuleFileNameExA == NULL)
481 goto failed;
482 }
483
484 cbNeeded = 0;
485 ok = (*psapi_EnumProcessModules) (current_process_handle,
486 DllHandle,
487 sizeof (HMODULE),
488 &cbNeeded);
489
490 if (!ok || !cbNeeded)
491 goto failed;
492
493 DllHandle = (HMODULE *) alloca (cbNeeded);
494 if (!DllHandle)
495 goto failed;
496
497 ok = (*psapi_EnumProcessModules) (current_process_handle,
498 DllHandle,
499 cbNeeded,
500 &cbNeeded);
501 if (!ok)
502 goto failed;
503
504 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
505 {
506 if (!(*psapi_GetModuleInformation) (current_process_handle,
507 DllHandle[i],
508 &mi,
509 sizeof (mi)))
510 error (_("Can't get module info"));
511
512 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
513 DllHandle[i],
514 dll_name_ret,
515 MAX_PATH);
516 if (len == 0)
517 error (_("Error getting dll name: %u."), (unsigned) GetLastError ());
518
519 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
520 return 1;
521 }
522
523 failed:
524 dll_name_ret[0] = '\0';
525 return 0;
526 }
527
528 /* Encapsulate the information required in a call to
529 symbol_file_add_args */
530 struct safe_symbol_file_add_args
531 {
532 char *name;
533 int from_tty;
534 struct section_addr_info *addrs;
535 int mainline;
536 int flags;
537 struct ui_file *err, *out;
538 struct objfile *ret;
539 };
540
541 /* Maintain a linked list of "so" information. */
542 struct lm_info
543 {
544 DWORD load_addr;
545 };
546
547 static struct so_list solib_start, *solib_end;
548
549 /* Call symbol_file_add with stderr redirected. We don't care if there
550 are errors. */
551 static int
552 safe_symbol_file_add_stub (void *argv)
553 {
554 #define p ((struct safe_symbol_file_add_args *) argv)
555 struct so_list *so = &solib_start;
556
557 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
558 return !!p->ret;
559 #undef p
560 }
561
562 /* Restore gdb's stderr after calling symbol_file_add */
563 static void
564 safe_symbol_file_add_cleanup (void *p)
565 {
566 #define sp ((struct safe_symbol_file_add_args *)p)
567 gdb_flush (gdb_stderr);
568 gdb_flush (gdb_stdout);
569 ui_file_delete (gdb_stderr);
570 ui_file_delete (gdb_stdout);
571 gdb_stderr = sp->err;
572 gdb_stdout = sp->out;
573 #undef sp
574 }
575
576 /* symbol_file_add wrapper that prevents errors from being displayed. */
577 static struct objfile *
578 safe_symbol_file_add (char *name, int from_tty,
579 struct section_addr_info *addrs,
580 int mainline, int flags)
581 {
582 struct safe_symbol_file_add_args p;
583 struct cleanup *cleanup;
584
585 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
586
587 p.err = gdb_stderr;
588 p.out = gdb_stdout;
589 gdb_flush (gdb_stderr);
590 gdb_flush (gdb_stdout);
591 gdb_stderr = ui_file_new ();
592 gdb_stdout = ui_file_new ();
593 p.name = name;
594 p.from_tty = from_tty;
595 p.addrs = addrs;
596 p.mainline = mainline;
597 p.flags = flags;
598 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
599
600 do_cleanups (cleanup);
601 return p.ret;
602 }
603
604 /* Get the loaded address of all sections, given that .text was loaded
605 at text_load. Assumes that all sections are subject to the same
606 relocation offset. Returns NULL if problems occur or if the
607 sections were not relocated. */
608
609 static struct section_addr_info *
610 get_relocated_section_addrs (bfd *abfd, CORE_ADDR text_load)
611 {
612 struct section_addr_info *result = NULL;
613 int section_count = bfd_count_sections (abfd);
614 asection *text_section = bfd_get_section_by_name (abfd, ".text");
615 CORE_ADDR text_vma;
616
617 if (!text_section)
618 {
619 /* Couldn't get the .text section. Weird. */
620 }
621 else if (text_load == (text_vma = bfd_get_section_vma (abfd, text_section)))
622 {
623 /* DLL wasn't relocated. */
624 }
625 else
626 {
627 /* Figure out all sections' loaded addresses. The offset here is
628 such that taking a bfd_get_section_vma() result and adding
629 offset will give the real load address of the section. */
630
631 CORE_ADDR offset = text_load - text_vma;
632
633 struct section_table *table_start = NULL;
634 struct section_table *table_end = NULL;
635 struct section_table *iter = NULL;
636
637 build_section_table (abfd, &table_start, &table_end);
638
639 for (iter = table_start; iter < table_end; ++iter)
640 {
641 /* Relocated addresses. */
642 iter->addr += offset;
643 iter->endaddr += offset;
644 }
645
646 result = build_section_addr_info_from_section_table (table_start,
647 table_end);
648
649 xfree (table_start);
650 }
651
652 return result;
653 }
654
655 /* Add DLL symbol information. */
656 static void
657 solib_symbols_add (struct so_list *so, CORE_ADDR load_addr)
658 {
659 struct section_addr_info *addrs = NULL;
660 static struct objfile *result = NULL;
661 char *name = so->so_name;
662 bfd *abfd = NULL;
663 char *p;
664
665 /* The symbols in a dll are offset by 0x1000, which is the
666 the offset from 0 of the first byte in an image - because
667 of the file header and the section alignment. */
668
669 if (!name || !name[0])
670 return;
671
672 abfd = bfd_openr (name, "pei-i386");
673
674 if (!abfd)
675 {
676 /* pei failed - try pe */
677 abfd = bfd_openr (name, "pe-i386");
678 }
679
680 if (abfd)
681 {
682 if (bfd_check_format (abfd, bfd_object))
683 addrs = get_relocated_section_addrs (abfd, load_addr);
684 }
685
686 if (addrs)
687 {
688 result = safe_symbol_file_add (name, 0, addrs, 0, OBJF_SHARED);
689 free_section_addr_info (addrs);
690 }
691 else
692 {
693 /* Fallback on handling just the .text section. */
694 struct cleanup *my_cleanups;
695
696 addrs = alloc_section_addr_info (1);
697 my_cleanups = make_cleanup (xfree, addrs);
698 addrs->other[0].name = ".text";
699 addrs->other[0].addr = load_addr;
700
701 result = safe_symbol_file_add (name, 0, addrs, 0, OBJF_SHARED);
702 do_cleanups (my_cleanups);
703 }
704
705 p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
706 if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
707 {
708 asection *text = bfd_get_section_by_name (abfd, ".text");
709 cygwin_load_start = bfd_section_vma (abfd, text);
710 cygwin_load_end = cygwin_load_start + bfd_section_size (abfd, text);
711 }
712
713 bfd_close (abfd);
714
715 so->symbols_loaded = !!result;
716 return;
717 }
718
719 static char *
720 register_loaded_dll (const char *name, DWORD load_addr, int readsyms)
721 {
722 struct so_list *so;
723 char buf[MAX_PATH + 1];
724 char cwd[MAX_PATH + 1];
725 char *p;
726 WIN32_FIND_DATA w32_fd;
727 HANDLE h = FindFirstFile(name, &w32_fd);
728 MEMORY_BASIC_INFORMATION m;
729 size_t len;
730
731 if (h == INVALID_HANDLE_VALUE)
732 strcpy (buf, name);
733 else
734 {
735 FindClose (h);
736 strcpy (buf, name);
737 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
738 {
739 p = strrchr (buf, '\\');
740 if (p)
741 p[1] = '\0';
742 SetCurrentDirectory (buf);
743 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
744 SetCurrentDirectory (cwd);
745 }
746 }
747
748 if (strcasecmp (buf, "ntdll.dll") == 0)
749 {
750 GetSystemDirectory (buf, sizeof (buf));
751 strcat (buf, "\\ntdll.dll");
752 }
753 so = XZALLOC (struct so_list);
754 so->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info));
755 so->lm_info->load_addr = load_addr;
756 cygwin_conv_to_posix_path (buf, so->so_name);
757 strcpy (so->so_original_name, so->so_name);
758
759 solib_end->next = so;
760 solib_end = so;
761 len = strlen (so->so_name);
762 if (readsyms)
763 solib_symbols_add (so, (CORE_ADDR) load_addr);
764
765 return so->so_name;
766 }
767
768 static char *
769 get_image_name (HANDLE h, void *address, int unicode)
770 {
771 static char buf[(2 * MAX_PATH) + 1];
772 DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
773 char *address_ptr;
774 int len = 0;
775 char b[2];
776 DWORD done;
777
778 /* Attempt to read the name of the dll that was detected.
779 This is documented to work only when actively debugging
780 a program. It will not work for attached processes. */
781 if (address == NULL)
782 return NULL;
783
784 /* See if we could read the address of a string, and that the
785 address isn't null. */
786 if (!ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done)
787 || done != sizeof (address_ptr) || !address_ptr)
788 return NULL;
789
790 /* Find the length of the string */
791 while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
792 && (b[0] != 0 || b[size - 1] != 0) && done == size)
793 continue;
794
795 if (!unicode)
796 ReadProcessMemory (h, address_ptr, buf, len, &done);
797 else
798 {
799 WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
800 ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
801 &done);
802
803 WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
804 }
805
806 return buf;
807 }
808
809 /* Wait for child to do something. Return pid of child, or -1 in case
810 of error; store status through argument pointer OURSTATUS. */
811 static int
812 handle_load_dll (void *dummy)
813 {
814 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
815 char dll_buf[MAX_PATH + 1];
816 char *dll_name = NULL;
817
818 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
819
820 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
821 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
822
823 dll_name = dll_buf;
824
825 if (*dll_name == '\0')
826 dll_name = get_image_name (current_process_handle, event->lpImageName, event->fUnicode);
827 if (!dll_name)
828 return 1;
829
830 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000, auto_solib_add);
831
832 return 1;
833 }
834
835 static void
836 win32_free_so (struct so_list *so)
837 {
838 if (so->lm_info)
839 xfree (so->lm_info);
840 }
841
842 static void
843 win32_relocate_section_addresses (struct so_list *so,
844 struct section_table *sec)
845 {
846 /* FIXME */
847 return;
848 }
849
850 static void
851 win32_solib_create_inferior_hook (void)
852 {
853 solib_add (NULL, 0, NULL, auto_solib_add);
854 return;
855 }
856
857 static int
858 handle_unload_dll (void *dummy)
859 {
860 DWORD lpBaseOfDll = (DWORD) current_event.u.UnloadDll.lpBaseOfDll + 0x1000;
861 struct so_list *so;
862
863 for (so = &solib_start; so->next != NULL; so = so->next)
864 if (so->next->lm_info->load_addr == lpBaseOfDll)
865 {
866 struct so_list *sodel = so->next;
867 so->next = sodel->next;
868 if (!so->next)
869 solib_end = so;
870 free_so (sodel);
871 solib_add (NULL, 0, NULL, auto_solib_add);
872 return 1;
873 }
874
875 error (_("Error: dll starting at 0x%lx not found."), (DWORD) lpBaseOfDll);
876
877 return 0;
878 }
879
880 /* Clear list of loaded DLLs. */
881 static void
882 win32_clear_solib (void)
883 {
884 solib_start.next = NULL;
885 solib_end = &solib_start;
886 }
887
888 static void
889 win32_special_symbol_handling (void)
890 {
891 return;
892 }
893
894 /* Load DLL symbol info. */
895 void
896 dll_symbol_command (char *args, int from_tty)
897 {
898 int n;
899 dont_repeat ();
900
901 if (args == NULL)
902 error (_("dll-symbols requires a file name"));
903
904 n = strlen (args);
905 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
906 {
907 char *newargs = (char *) alloca (n + 4 + 1);
908 strcpy (newargs, args);
909 strcat (newargs, ".dll");
910 args = newargs;
911 }
912
913 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
914 }
915
916 /* Handle DEBUG_STRING output from child process.
917 Cygwin prepends its messages with a "cygwin:". Interpret this as
918 a Cygwin signal. Otherwise just print the string as a warning. */
919 static int
920 handle_output_debug_string (struct target_waitstatus *ourstatus)
921 {
922 char *s = NULL;
923 int retval = 0;
924
925 if (!target_read_string
926 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
927 || !s || !*s)
928 /* nothing to do */;
929 else if (strncmp (s, _CYGWIN_SIGNAL_STRING, sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0)
930 {
931 if (strncmp (s, "cYg", 3) != 0)
932 warning (("%s"), s);
933 }
934 #ifdef __COPY_CONTEXT_SIZE
935 else
936 {
937 /* Got a cygwin signal marker. A cygwin signal is followed by the signal number
938 itself and then optionally followed by the thread id and address to saved context
939 within the DLL. If these are supplied, then the given thread is assumed to have
940 issued the signal and the context from the thread is assumed to be stored at the
941 given address in the inferior. Tell gdb to treat this like a real signal. */
942 char *p;
943 int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
944 int gotasig = target_signal_from_host (sig);
945 ourstatus->value.sig = gotasig;
946 if (gotasig)
947 {
948 LPCVOID x;
949 DWORD n;
950 ourstatus->kind = TARGET_WAITKIND_STOPPED;
951 retval = strtoul (p, &p, 0);
952 if (!retval)
953 retval = main_thread_id;
954 else if ((x = (LPCVOID) strtoul (p, &p, 0))
955 && ReadProcessMemory (current_process_handle, x,
956 &saved_context, __COPY_CONTEXT_SIZE, &n)
957 && n == __COPY_CONTEXT_SIZE)
958 have_saved_context = 1;
959 current_event.dwThreadId = retval;
960 }
961 }
962 #endif
963
964 if (s)
965 xfree (s);
966 return retval;
967 }
968
969 static int
970 display_selector (HANDLE thread, DWORD sel)
971 {
972 LDT_ENTRY info;
973 if (GetThreadSelectorEntry (thread, sel, &info))
974 {
975 int base, limit;
976 printf_filtered ("0x%03lx: ", sel);
977 if (!info.HighWord.Bits.Pres)
978 {
979 puts_filtered ("Segment not present\n");
980 return 0;
981 }
982 base = (info.HighWord.Bits.BaseHi << 24) +
983 (info.HighWord.Bits.BaseMid << 16)
984 + info.BaseLow;
985 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
986 if (info.HighWord.Bits.Granularity)
987 limit = (limit << 12) | 0xfff;
988 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
989 if (info.HighWord.Bits.Default_Big)
990 puts_filtered(" 32-bit ");
991 else
992 puts_filtered(" 16-bit ");
993 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
994 {
995 case 0:
996 puts_filtered ("Data (Read-Only, Exp-up");
997 break;
998 case 1:
999 puts_filtered ("Data (Read/Write, Exp-up");
1000 break;
1001 case 2:
1002 puts_filtered ("Unused segment (");
1003 break;
1004 case 3:
1005 puts_filtered ("Data (Read/Write, Exp-down");
1006 break;
1007 case 4:
1008 puts_filtered ("Code (Exec-Only, N.Conf");
1009 break;
1010 case 5:
1011 puts_filtered ("Code (Exec/Read, N.Conf");
1012 break;
1013 case 6:
1014 puts_filtered ("Code (Exec-Only, Conf");
1015 break;
1016 case 7:
1017 puts_filtered ("Code (Exec/Read, Conf");
1018 break;
1019 default:
1020 printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
1021 }
1022 if ((info.HighWord.Bits.Type & 0x1) == 0)
1023 puts_filtered(", N.Acc");
1024 puts_filtered (")\n");
1025 if ((info.HighWord.Bits.Type & 0x10) == 0)
1026 puts_filtered("System selector ");
1027 printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
1028 if (info.HighWord.Bits.Granularity)
1029 puts_filtered ("Page granular.\n");
1030 else
1031 puts_filtered ("Byte granular.\n");
1032 return 1;
1033 }
1034 else
1035 {
1036 printf_filtered ("Invalid selector 0x%lx.\n",sel);
1037 return 0;
1038 }
1039 }
1040
1041 static void
1042 display_selectors (char * args, int from_tty)
1043 {
1044 if (!current_thread)
1045 {
1046 puts_filtered ("Impossible to display selectors now.\n");
1047 return;
1048 }
1049 if (!args)
1050 {
1051
1052 puts_filtered ("Selector $cs\n");
1053 display_selector (current_thread->h,
1054 current_thread->context.SegCs);
1055 puts_filtered ("Selector $ds\n");
1056 display_selector (current_thread->h,
1057 current_thread->context.SegDs);
1058 puts_filtered ("Selector $es\n");
1059 display_selector (current_thread->h,
1060 current_thread->context.SegEs);
1061 puts_filtered ("Selector $ss\n");
1062 display_selector (current_thread->h,
1063 current_thread->context.SegSs);
1064 puts_filtered ("Selector $fs\n");
1065 display_selector (current_thread->h,
1066 current_thread->context.SegFs);
1067 puts_filtered ("Selector $gs\n");
1068 display_selector (current_thread->h,
1069 current_thread->context.SegGs);
1070 }
1071 else
1072 {
1073 int sel;
1074 sel = parse_and_eval_long (args);
1075 printf_filtered ("Selector \"%s\"\n",args);
1076 display_selector (current_thread->h, sel);
1077 }
1078 }
1079
1080 static struct cmd_list_element *info_w32_cmdlist = NULL;
1081
1082 static void
1083 info_w32_command (char *args, int from_tty)
1084 {
1085 help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
1086 }
1087
1088
1089 #define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
1090 printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
1091 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
1092
1093 static int
1094 handle_exception (struct target_waitstatus *ourstatus)
1095 {
1096 thread_info *th;
1097 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
1098
1099 ourstatus->kind = TARGET_WAITKIND_STOPPED;
1100
1101 /* Record the context of the current thread */
1102 th = thread_rec (current_event.dwThreadId, -1);
1103
1104 switch (code)
1105 {
1106 case EXCEPTION_ACCESS_VIOLATION:
1107 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1108 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1109 {
1110 /* See if the access violation happened within the cygwin DLL itself. Cygwin uses
1111 a kind of exception handling to deal with passed-in invalid addresses. gdb
1112 should not treat these as real SEGVs since they will be silently handled by
1113 cygwin. A real SEGV will (theoretically) be caught by cygwin later in the process
1114 and will be sent as a cygwin-specific-signal. So, ignore SEGVs if they show up
1115 within the text segment of the DLL itself. */
1116 char *fn;
1117 bfd_vma addr = (bfd_vma) current_event.u.Exception.ExceptionRecord.ExceptionAddress;
1118 if ((!cygwin_exceptions && (addr >= cygwin_load_start && addr < cygwin_load_end))
1119 || (find_pc_partial_function (addr, &fn, NULL, NULL)
1120 && strncmp (fn, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0))
1121 return 0;
1122 }
1123 break;
1124 case STATUS_STACK_OVERFLOW:
1125 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1126 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1127 break;
1128 case STATUS_FLOAT_DENORMAL_OPERAND:
1129 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1130 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1131 break;
1132 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1133 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1134 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1135 break;
1136 case STATUS_FLOAT_INEXACT_RESULT:
1137 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1138 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1139 break;
1140 case STATUS_FLOAT_INVALID_OPERATION:
1141 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1142 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1143 break;
1144 case STATUS_FLOAT_OVERFLOW:
1145 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1146 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1147 break;
1148 case STATUS_FLOAT_STACK_CHECK:
1149 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1150 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1151 break;
1152 case STATUS_FLOAT_UNDERFLOW:
1153 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1154 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1155 break;
1156 case STATUS_FLOAT_DIVIDE_BY_ZERO:
1157 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1158 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1159 break;
1160 case STATUS_INTEGER_DIVIDE_BY_ZERO:
1161 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1162 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1163 break;
1164 case STATUS_INTEGER_OVERFLOW:
1165 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1166 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1167 break;
1168 case EXCEPTION_BREAKPOINT:
1169 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1170 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1171 break;
1172 case DBG_CONTROL_C:
1173 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1174 ourstatus->value.sig = TARGET_SIGNAL_INT;
1175 break;
1176 case DBG_CONTROL_BREAK:
1177 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1178 ourstatus->value.sig = TARGET_SIGNAL_INT;
1179 break;
1180 case EXCEPTION_SINGLE_STEP:
1181 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1182 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1183 break;
1184 case EXCEPTION_ILLEGAL_INSTRUCTION:
1185 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1186 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1187 break;
1188 case EXCEPTION_PRIV_INSTRUCTION:
1189 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1190 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1191 break;
1192 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1193 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1194 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1195 break;
1196 default:
1197 /* Treat unhandled first chance exceptions specially. */
1198 if (current_event.u.Exception.dwFirstChance)
1199 return -1;
1200 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
1201 current_event.u.Exception.ExceptionRecord.ExceptionCode,
1202 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
1203 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1204 break;
1205 }
1206 exception_count++;
1207 last_sig = ourstatus->value.sig;
1208 return 1;
1209 }
1210
1211 /* Resume all artificially suspended threads if we are continuing
1212 execution */
1213 static BOOL
1214 win32_continue (DWORD continue_status, int id)
1215 {
1216 int i;
1217 thread_info *th;
1218 BOOL res;
1219
1220 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1221 current_event.dwProcessId, current_event.dwThreadId,
1222 continue_status == DBG_CONTINUE ?
1223 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1224 res = ContinueDebugEvent (current_event.dwProcessId,
1225 current_event.dwThreadId,
1226 continue_status);
1227 if (res)
1228 for (th = &thread_head; (th = th->next) != NULL;)
1229 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
1230 {
1231
1232 for (i = 0; i < th->suspend_count; i++)
1233 (void) ResumeThread (th->h);
1234 th->suspend_count = 0;
1235 if (debug_registers_changed)
1236 {
1237 /* Only change the value of the debug registers */
1238 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
1239 th->context.Dr0 = dr[0];
1240 th->context.Dr1 = dr[1];
1241 th->context.Dr2 = dr[2];
1242 th->context.Dr3 = dr[3];
1243 /* th->context.Dr6 = dr[6];
1244 FIXME: should we set dr6 also ?? */
1245 th->context.Dr7 = dr[7];
1246 CHECK (SetThreadContext (th->h, &th->context));
1247 th->context.ContextFlags = 0;
1248 }
1249 }
1250
1251 debug_registers_changed = 0;
1252 return res;
1253 }
1254
1255 /* Called in pathological case where Windows fails to send a
1256 CREATE_PROCESS_DEBUG_EVENT after an attach. */
1257 static DWORD
1258 fake_create_process (void)
1259 {
1260 current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1261 current_event.dwProcessId);
1262 main_thread_id = current_event.dwThreadId;
1263 current_thread = win32_add_thread (main_thread_id,
1264 current_event.u.CreateThread.hThread);
1265 return main_thread_id;
1266 }
1267
1268 static void
1269 win32_resume (ptid_t ptid, int step, enum target_signal sig)
1270 {
1271 thread_info *th;
1272 DWORD continue_status = DBG_CONTINUE;
1273
1274 int pid = PIDGET (ptid);
1275
1276 if (sig != TARGET_SIGNAL_0)
1277 {
1278 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1279 {
1280 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1281 }
1282 else if (sig == last_sig)
1283 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1284 else
1285 #if 0
1286 /* This code does not seem to work, because
1287 the kernel does probably not consider changes in the ExceptionRecord
1288 structure when passing the exception to the inferior.
1289 Note that this seems possible in the exception handler itself. */
1290 {
1291 int i;
1292 for (i = 0; xlate[i].them != -1; i++)
1293 if (xlate[i].us == sig)
1294 {
1295 current_event.u.Exception.ExceptionRecord.ExceptionCode =
1296 xlate[i].them;
1297 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1298 break;
1299 }
1300 if (continue_status == DBG_CONTINUE)
1301 {
1302 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1303 }
1304 }
1305 #endif
1306 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1307 last_sig));
1308 }
1309
1310 last_sig = TARGET_SIGNAL_0;
1311
1312 DEBUG_EXEC (("gdb: win32_resume (pid=%d, step=%d, sig=%d);\n",
1313 pid, step, sig));
1314
1315 /* Get context for currently selected thread */
1316 th = thread_rec (current_event.dwThreadId, FALSE);
1317 if (th)
1318 {
1319 if (step)
1320 {
1321 /* Single step by setting t bit */
1322 win32_fetch_inferior_registers (PS_REGNUM);
1323 th->context.EFlags |= FLAG_TRACE_BIT;
1324 }
1325
1326 if (th->context.ContextFlags)
1327 {
1328 if (debug_registers_changed)
1329 {
1330 th->context.Dr0 = dr[0];
1331 th->context.Dr1 = dr[1];
1332 th->context.Dr2 = dr[2];
1333 th->context.Dr3 = dr[3];
1334 /* th->context.Dr6 = dr[6];
1335 FIXME: should we set dr6 also ?? */
1336 th->context.Dr7 = dr[7];
1337 }
1338 CHECK (SetThreadContext (th->h, &th->context));
1339 th->context.ContextFlags = 0;
1340 }
1341 }
1342
1343 /* Allow continuing with the same signal that interrupted us.
1344 Otherwise complain. */
1345
1346 win32_continue (continue_status, pid);
1347 }
1348
1349 /* Get the next event from the child. Return 1 if the event requires
1350 handling by WFI (or whatever).
1351 */
1352 static int
1353 get_win32_debug_event (int pid, struct target_waitstatus *ourstatus)
1354 {
1355 BOOL debug_event;
1356 DWORD continue_status, event_code;
1357 thread_info *th;
1358 static thread_info dummy_thread_info;
1359 int retval = 0;
1360 ptid_t ptid = {-1};
1361
1362 last_sig = TARGET_SIGNAL_0;
1363
1364 if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1365 goto out;
1366
1367 event_count++;
1368 continue_status = DBG_CONTINUE;
1369
1370 event_code = current_event.dwDebugEventCode;
1371 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1372 th = NULL;
1373 have_saved_context = 0;
1374
1375 switch (event_code)
1376 {
1377 case CREATE_THREAD_DEBUG_EVENT:
1378 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1379 (unsigned) current_event.dwProcessId,
1380 (unsigned) current_event.dwThreadId,
1381 "CREATE_THREAD_DEBUG_EVENT"));
1382 if (saw_create != 1)
1383 {
1384 if (!saw_create && attach_flag)
1385 {
1386 /* Kludge around a Windows bug where first event is a create
1387 thread event. Caused when attached process does not have
1388 a main thread. */
1389 retval = ourstatus->value.related_pid = fake_create_process ();
1390 saw_create++;
1391 }
1392 break;
1393 }
1394 /* Record the existence of this thread */
1395 th = win32_add_thread (current_event.dwThreadId,
1396 current_event.u.CreateThread.hThread);
1397 if (info_verbose)
1398 printf_unfiltered ("[New %s]\n",
1399 target_pid_to_str (
1400 pid_to_ptid (current_event.dwThreadId)));
1401 retval = current_event.dwThreadId;
1402 break;
1403
1404 case EXIT_THREAD_DEBUG_EVENT:
1405 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1406 (unsigned) current_event.dwProcessId,
1407 (unsigned) current_event.dwThreadId,
1408 "EXIT_THREAD_DEBUG_EVENT"));
1409 if (current_event.dwThreadId != main_thread_id)
1410 {
1411 win32_delete_thread (current_event.dwThreadId);
1412 th = &dummy_thread_info;
1413 }
1414 break;
1415
1416 case CREATE_PROCESS_DEBUG_EVENT:
1417 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1418 (unsigned) current_event.dwProcessId,
1419 (unsigned) current_event.dwThreadId,
1420 "CREATE_PROCESS_DEBUG_EVENT"));
1421 CloseHandle (current_event.u.CreateProcessInfo.hFile);
1422 if (++saw_create != 1)
1423 {
1424 CloseHandle (current_event.u.CreateProcessInfo.hProcess);
1425 break;
1426 }
1427
1428 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1429 if (main_thread_id)
1430 win32_delete_thread (main_thread_id);
1431 main_thread_id = current_event.dwThreadId;
1432 /* Add the main thread */
1433 th = win32_add_thread (main_thread_id,
1434 current_event.u.CreateProcessInfo.hThread);
1435 retval = ourstatus->value.related_pid = current_event.dwThreadId;
1436 break;
1437
1438 case EXIT_PROCESS_DEBUG_EVENT:
1439 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1440 (unsigned) current_event.dwProcessId,
1441 (unsigned) current_event.dwThreadId,
1442 "EXIT_PROCESS_DEBUG_EVENT"));
1443 if (saw_create != 1)
1444 break;
1445 ourstatus->kind = TARGET_WAITKIND_EXITED;
1446 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1447 CloseHandle (current_process_handle);
1448 retval = main_thread_id;
1449 break;
1450
1451 case LOAD_DLL_DEBUG_EVENT:
1452 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1453 (unsigned) current_event.dwProcessId,
1454 (unsigned) current_event.dwThreadId,
1455 "LOAD_DLL_DEBUG_EVENT"));
1456 CloseHandle (current_event.u.LoadDll.hFile);
1457 if (saw_create != 1)
1458 break;
1459 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1460 registers_changed (); /* mark all regs invalid */
1461 ourstatus->kind = TARGET_WAITKIND_LOADED;
1462 ourstatus->value.integer = 0;
1463 retval = main_thread_id;
1464 re_enable_breakpoints_in_shlibs ();
1465 break;
1466
1467 case UNLOAD_DLL_DEBUG_EVENT:
1468 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1469 (unsigned) current_event.dwProcessId,
1470 (unsigned) current_event.dwThreadId,
1471 "UNLOAD_DLL_DEBUG_EVENT"));
1472 if (saw_create != 1)
1473 break;
1474 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1475 registers_changed (); /* mark all regs invalid */
1476 /* ourstatus->kind = TARGET_WAITKIND_UNLOADED;
1477 does not exist yet. */
1478 break;
1479
1480 case EXCEPTION_DEBUG_EVENT:
1481 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1482 (unsigned) current_event.dwProcessId,
1483 (unsigned) current_event.dwThreadId,
1484 "EXCEPTION_DEBUG_EVENT"));
1485 if (saw_create != 1)
1486 break;
1487 switch (handle_exception (ourstatus))
1488 {
1489 case 0:
1490 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1491 break;
1492 case 1:
1493 retval = current_event.dwThreadId;
1494 break;
1495 case -1:
1496 last_sig = 1;
1497 continue_status = -1;
1498 break;
1499 }
1500 break;
1501
1502 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
1503 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1504 (unsigned) current_event.dwProcessId,
1505 (unsigned) current_event.dwThreadId,
1506 "OUTPUT_DEBUG_STRING_EVENT"));
1507 if (saw_create != 1)
1508 break;
1509 retval = handle_output_debug_string (ourstatus);
1510 break;
1511
1512 default:
1513 if (saw_create != 1)
1514 break;
1515 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1516 (DWORD) current_event.dwProcessId,
1517 (DWORD) current_event.dwThreadId);
1518 printf_unfiltered (" unknown event code %ld\n",
1519 current_event.dwDebugEventCode);
1520 break;
1521 }
1522
1523 if (!retval || saw_create != 1)
1524 {
1525 if (continue_status == -1)
1526 win32_resume (ptid, 0, 1);
1527 else
1528 CHECK (win32_continue (continue_status, -1));
1529 }
1530 else
1531 {
1532 inferior_ptid = pid_to_ptid (retval);
1533 current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
1534 }
1535
1536 out:
1537 return retval;
1538 }
1539
1540 /* Wait for interesting events to occur in the target process. */
1541 static ptid_t
1542 win32_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
1543 {
1544 int pid = PIDGET (ptid);
1545
1546 /* We loop when we get a non-standard exception rather than return
1547 with a SPURIOUS because resume can try and step or modify things,
1548 which needs a current_thread->h. But some of these exceptions mark
1549 the birth or death of threads, which mean that the current thread
1550 isn't necessarily what you think it is. */
1551
1552 while (1)
1553 {
1554 int retval = get_win32_debug_event (pid, ourstatus);
1555 if (retval)
1556 return pid_to_ptid (retval);
1557 else
1558 {
1559 int detach = 0;
1560
1561 if (deprecated_ui_loop_hook != NULL)
1562 detach = deprecated_ui_loop_hook (0);
1563
1564 if (detach)
1565 win32_kill_inferior ();
1566 }
1567 }
1568 }
1569
1570 static void
1571 do_initial_win32_stuff (DWORD pid)
1572 {
1573 extern int stop_after_trap;
1574 int i;
1575
1576 last_sig = TARGET_SIGNAL_0;
1577 event_count = 0;
1578 exception_count = 0;
1579 debug_registers_changed = 0;
1580 debug_registers_used = 0;
1581 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1582 dr[i] = 0;
1583 current_event.dwProcessId = pid;
1584 memset (&current_event, 0, sizeof (current_event));
1585 push_target (&win32_ops);
1586 disable_breakpoints_in_shlibs (1);
1587 win32_clear_solib ();
1588 clear_proceed_status ();
1589 init_wait_for_inferior ();
1590
1591 target_terminal_init ();
1592 target_terminal_inferior ();
1593
1594 while (1)
1595 {
1596 stop_after_trap = 1;
1597 wait_for_inferior ();
1598 if (stop_signal != TARGET_SIGNAL_TRAP)
1599 resume (0, stop_signal);
1600 else
1601 break;
1602 }
1603 stop_after_trap = 0;
1604 return;
1605 }
1606
1607 /* Since Windows XP, detaching from a process is supported by Windows.
1608 The following code tries loading the appropriate functions dynamically.
1609 If loading these functions succeeds use them to actually detach from
1610 the inferior process, otherwise behave as usual, pretending that
1611 detach has worked. */
1612 static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
1613 static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
1614
1615 static int
1616 has_detach_ability (void)
1617 {
1618 static HMODULE kernel32 = NULL;
1619
1620 if (!kernel32)
1621 kernel32 = LoadLibrary ("kernel32.dll");
1622 if (kernel32)
1623 {
1624 if (!DebugSetProcessKillOnExit)
1625 DebugSetProcessKillOnExit = GetProcAddress (kernel32,
1626 "DebugSetProcessKillOnExit");
1627 if (!DebugActiveProcessStop)
1628 DebugActiveProcessStop = GetProcAddress (kernel32,
1629 "DebugActiveProcessStop");
1630 if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
1631 return 1;
1632 }
1633 return 0;
1634 }
1635
1636 /* Try to set or remove a user privilege to the current process. Return -1
1637 if that fails, the previous setting of that privilege otherwise.
1638
1639 This code is copied from the Cygwin source code and rearranged to allow
1640 dynamically loading of the needed symbols from advapi32 which is only
1641 available on NT/2K/XP. */
1642 static int
1643 set_process_privilege (const char *privilege, BOOL enable)
1644 {
1645 static HMODULE advapi32 = NULL;
1646 static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
1647 static BOOL WINAPI (*LookupPrivilegeValue)(LPCSTR, LPCSTR, PLUID);
1648 static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
1649 DWORD, PTOKEN_PRIVILEGES, PDWORD);
1650
1651 HANDLE token_hdl = NULL;
1652 LUID restore_priv;
1653 TOKEN_PRIVILEGES new_priv, orig_priv;
1654 int ret = -1;
1655 DWORD size;
1656
1657 if (GetVersion () >= 0x80000000) /* No security availbale on 9x/Me */
1658 return 0;
1659
1660 if (!advapi32)
1661 {
1662 if (!(advapi32 = LoadLibrary ("advapi32.dll")))
1663 goto out;
1664 if (!OpenProcessToken)
1665 OpenProcessToken = GetProcAddress (advapi32, "OpenProcessToken");
1666 if (!LookupPrivilegeValue)
1667 LookupPrivilegeValue = GetProcAddress (advapi32,
1668 "LookupPrivilegeValueA");
1669 if (!AdjustTokenPrivileges)
1670 AdjustTokenPrivileges = GetProcAddress (advapi32,
1671 "AdjustTokenPrivileges");
1672 if (!OpenProcessToken || !LookupPrivilegeValue || !AdjustTokenPrivileges)
1673 {
1674 advapi32 = NULL;
1675 goto out;
1676 }
1677 }
1678
1679 if (!OpenProcessToken (GetCurrentProcess (),
1680 TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1681 &token_hdl))
1682 goto out;
1683
1684 if (!LookupPrivilegeValue (NULL, privilege, &restore_priv))
1685 goto out;
1686
1687 new_priv.PrivilegeCount = 1;
1688 new_priv.Privileges[0].Luid = restore_priv;
1689 new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1690
1691 if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1692 sizeof orig_priv, &orig_priv, &size))
1693 goto out;
1694 #if 0
1695 /* Disabled, otherwise every `attach' in an unprivileged user session
1696 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1697 win32_attach(). */
1698 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1699 be enabled. GetLastError () returns an correct error code, though. */
1700 if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1701 goto out;
1702 #endif
1703
1704 ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1705
1706 out:
1707 if (token_hdl)
1708 CloseHandle (token_hdl);
1709
1710 return ret;
1711 }
1712
1713 /* Attach to process PID, then initialize for debugging it. */
1714 static void
1715 win32_attach (char *args, int from_tty)
1716 {
1717 BOOL ok;
1718 DWORD pid;
1719
1720 if (!args)
1721 error_no_arg (_("process-id to attach"));
1722
1723 if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1724 {
1725 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1726 printf_unfiltered ("This can cause attach to fail on Windows NT/2K/XP\n");
1727 }
1728
1729 pid = strtoul (args, 0, 0); /* Windows pid */
1730
1731 win32_init_thread_list ();
1732 ok = DebugActiveProcess (pid);
1733 saw_create = 0;
1734
1735 if (!ok)
1736 {
1737 /* Try fall back to Cygwin pid */
1738 pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1739
1740 if (pid > 0)
1741 ok = DebugActiveProcess (pid);
1742
1743 if (!ok)
1744 error (_("Can't attach to process."));
1745 }
1746
1747 if (has_detach_ability ())
1748 DebugSetProcessKillOnExit (FALSE);
1749
1750 attach_flag = 1;
1751
1752 if (from_tty)
1753 {
1754 char *exec_file = (char *) get_exec_file (0);
1755
1756 if (exec_file)
1757 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1758 target_pid_to_str (pid_to_ptid (pid)));
1759 else
1760 printf_unfiltered ("Attaching to %s\n",
1761 target_pid_to_str (pid_to_ptid (pid)));
1762
1763 gdb_flush (gdb_stdout);
1764 }
1765
1766 do_initial_win32_stuff (pid);
1767 target_terminal_ours ();
1768 }
1769
1770 static void
1771 win32_detach (char *args, int from_tty)
1772 {
1773 int detached = 1;
1774
1775 if (has_detach_ability ())
1776 {
1777 delete_command (NULL, 0);
1778 win32_continue (DBG_CONTINUE, -1);
1779 if (!DebugActiveProcessStop (current_event.dwProcessId))
1780 {
1781 error (_("Can't detach process %lu (error %lu)"),
1782 current_event.dwProcessId, GetLastError ());
1783 detached = 0;
1784 }
1785 DebugSetProcessKillOnExit (FALSE);
1786 }
1787 if (detached && from_tty)
1788 {
1789 char *exec_file = get_exec_file (0);
1790 if (exec_file == 0)
1791 exec_file = "";
1792 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1793 current_event.dwProcessId);
1794 gdb_flush (gdb_stdout);
1795 }
1796 inferior_ptid = null_ptid;
1797 unpush_target (&win32_ops);
1798 }
1799
1800 static char *
1801 win32_pid_to_exec_file (int pid)
1802 {
1803 /* Try to find the process path using the Cygwin internal process list
1804 pid isn't a valid pid, unfortunately. Use current_event.dwProcessId
1805 instead. */
1806 /* TODO: Also find native Windows processes using CW_GETPINFO_FULL. */
1807
1808 static char path[MAX_PATH + 1];
1809 char *path_ptr = NULL;
1810 int cpid;
1811 struct external_pinfo *pinfo;
1812
1813 cygwin_internal (CW_LOCK_PINFO, 1000);
1814 for (cpid = 0;
1815 (pinfo = (struct external_pinfo *)
1816 cygwin_internal (CW_GETPINFO, cpid | CW_NEXTPID));
1817 cpid = pinfo->pid)
1818 {
1819 if (pinfo->dwProcessId == current_event.dwProcessId) /* Got it */
1820 {
1821 cygwin_conv_to_full_posix_path (pinfo->progname, path);
1822 path_ptr = path;
1823 break;
1824 }
1825 }
1826 cygwin_internal (CW_UNLOCK_PINFO);
1827 return path_ptr;
1828 }
1829
1830 /* Print status information about what we're accessing. */
1831
1832 static void
1833 win32_files_info (struct target_ops *ignore)
1834 {
1835 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1836 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1837 }
1838
1839 static void
1840 win32_open (char *arg, int from_tty)
1841 {
1842 error (_("Use the \"run\" command to start a Unix child process."));
1843 }
1844
1845 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1846 EXEC_FILE is the file to run.
1847 ALLARGS is a string containing the arguments to the program.
1848 ENV is the environment vector to pass. Errors reported with error(). */
1849
1850 static void
1851 win32_create_inferior (char *exec_file, char *allargs, char **in_env,
1852 int from_tty)
1853 {
1854 STARTUPINFO si;
1855 PROCESS_INFORMATION pi;
1856 BOOL ret;
1857 DWORD flags;
1858 char *args;
1859 char real_path[MAXPATHLEN];
1860 char *toexec;
1861 char shell[MAX_PATH + 1]; /* Path to shell */
1862 const char *sh;
1863 int tty;
1864 int ostdin, ostdout, ostderr;
1865 const char *inferior_io_terminal = get_inferior_io_terminal ();
1866
1867 if (!exec_file)
1868 error (_("No executable specified, use `target exec'."));
1869
1870 memset (&si, 0, sizeof (si));
1871 si.cb = sizeof (si);
1872
1873 if (!useshell)
1874 {
1875 flags = DEBUG_ONLY_THIS_PROCESS;
1876 cygwin_conv_to_win32_path (exec_file, real_path);
1877 toexec = real_path;
1878 }
1879 else
1880 {
1881 char *newallargs;
1882 sh = getenv ("SHELL");
1883 if (!sh)
1884 sh = "/bin/sh";
1885 cygwin_conv_to_win32_path (sh, shell);
1886 newallargs = alloca (sizeof (" -c 'exec '") + strlen (exec_file)
1887 + strlen (allargs) + 2);
1888 sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1889 allargs = newallargs;
1890 toexec = shell;
1891 flags = DEBUG_PROCESS;
1892 }
1893
1894 if (new_group)
1895 flags |= CREATE_NEW_PROCESS_GROUP;
1896
1897 if (new_console)
1898 flags |= CREATE_NEW_CONSOLE;
1899
1900 attach_flag = 0;
1901
1902 args = alloca (strlen (toexec) + strlen (allargs) + 2);
1903 strcpy (args, toexec);
1904 strcat (args, " ");
1905 strcat (args, allargs);
1906
1907 /* Prepare the environment vars for CreateProcess. */
1908 cygwin_internal (CW_SYNC_WINENV);
1909
1910 if (!inferior_io_terminal)
1911 tty = ostdin = ostdout = ostderr = -1;
1912 else
1913 {
1914 tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
1915 if (tty < 0)
1916 {
1917 print_sys_errmsg (inferior_io_terminal, errno);
1918 ostdin = ostdout = ostderr = -1;
1919 }
1920 else
1921 {
1922 ostdin = dup (0);
1923 ostdout = dup (1);
1924 ostderr = dup (2);
1925 dup2 (tty, 0);
1926 dup2 (tty, 1);
1927 dup2 (tty, 2);
1928 }
1929 }
1930
1931 win32_init_thread_list ();
1932 ret = CreateProcess (0,
1933 args, /* command line */
1934 NULL, /* Security */
1935 NULL, /* thread */
1936 TRUE, /* inherit handles */
1937 flags, /* start flags */
1938 NULL, /* environment */
1939 NULL, /* current directory */
1940 &si,
1941 &pi);
1942 if (tty >= 0)
1943 {
1944 close (tty);
1945 dup2 (ostdin, 0);
1946 dup2 (ostdout, 1);
1947 dup2 (ostderr, 2);
1948 close (ostdin);
1949 close (ostdout);
1950 close (ostderr);
1951 }
1952
1953 if (!ret)
1954 error (_("Error creating process %s, (error %d)."),
1955 exec_file, (unsigned) GetLastError ());
1956
1957 CloseHandle (pi.hThread);
1958 CloseHandle (pi.hProcess);
1959
1960 if (useshell && shell[0] != '\0')
1961 saw_create = -1;
1962 else
1963 saw_create = 0;
1964
1965 do_initial_win32_stuff (pi.dwProcessId);
1966
1967 /* win32_continue (DBG_CONTINUE, -1); */
1968 }
1969
1970 static void
1971 win32_mourn_inferior (void)
1972 {
1973 (void) win32_continue (DBG_CONTINUE, -1);
1974 i386_cleanup_dregs();
1975 unpush_target (&win32_ops);
1976 generic_mourn_inferior ();
1977 }
1978
1979 /* Send a SIGINT to the process group. This acts just like the user typed a
1980 ^C on the controlling terminal. */
1981
1982 static void
1983 win32_stop (void)
1984 {
1985 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1986 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1987 registers_changed (); /* refresh register state */
1988 }
1989
1990 static int
1991 win32_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
1992 int write, struct mem_attrib *mem,
1993 struct target_ops *target)
1994 {
1995 DWORD done = 0;
1996 if (write)
1997 {
1998 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1999 len, (DWORD) memaddr));
2000 if (!WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
2001 len, &done))
2002 done = 0;
2003 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
2004 }
2005 else
2006 {
2007 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
2008 len, (DWORD) memaddr));
2009 if (!ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our,
2010 len, &done))
2011 done = 0;
2012 }
2013 return done;
2014 }
2015
2016 static void
2017 win32_kill_inferior (void)
2018 {
2019 CHECK (TerminateProcess (current_process_handle, 0));
2020
2021 for (;;)
2022 {
2023 if (!win32_continue (DBG_CONTINUE, -1))
2024 break;
2025 if (!WaitForDebugEvent (&current_event, INFINITE))
2026 break;
2027 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2028 break;
2029 }
2030
2031 CHECK (CloseHandle (current_process_handle));
2032
2033 /* this may fail in an attached process so don't check. */
2034 if (current_thread && current_thread->h)
2035 (void) CloseHandle (current_thread->h);
2036 target_mourn_inferior (); /* or just win32_mourn_inferior? */
2037 }
2038
2039 static void
2040 win32_prepare_to_store (void)
2041 {
2042 /* Do nothing, since we can store individual regs */
2043 }
2044
2045 static int
2046 win32_can_run (void)
2047 {
2048 return 1;
2049 }
2050
2051 static void
2052 win32_close (int x)
2053 {
2054 DEBUG_EVENTS (("gdb: win32_close, inferior_ptid=%d\n",
2055 PIDGET (inferior_ptid)));
2056 }
2057
2058 /* Convert pid to printable format. */
2059 static char *
2060 cygwin_pid_to_str (ptid_t ptid)
2061 {
2062 static char buf[80];
2063 int pid = PIDGET (ptid);
2064
2065 if ((DWORD) pid == current_event.dwProcessId)
2066 sprintf (buf, "process %d", pid);
2067 else
2068 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
2069 return buf;
2070 }
2071
2072 typedef struct
2073 {
2074 struct target_ops *target;
2075 bfd_vma addr;
2076 } map_code_section_args;
2077
2078 static void
2079 map_single_dll_code_section (bfd *abfd, asection *sect, void *obj)
2080 {
2081 int old;
2082 int update_coreops;
2083 struct section_table *new_target_sect_ptr;
2084
2085 map_code_section_args *args = (map_code_section_args *) obj;
2086 struct target_ops *target = args->target;
2087 if (sect->flags & SEC_CODE)
2088 {
2089 update_coreops = core_ops.to_sections == target->to_sections;
2090
2091 if (target->to_sections)
2092 {
2093 old = target->to_sections_end - target->to_sections;
2094 target->to_sections = (struct section_table *)
2095 xrealloc ((char *) target->to_sections,
2096 (sizeof (struct section_table)) * (1 + old));
2097 }
2098 else
2099 {
2100 old = 0;
2101 target->to_sections = (struct section_table *)
2102 xmalloc ((sizeof (struct section_table)));
2103 }
2104 target->to_sections_end = target->to_sections + (1 + old);
2105
2106 /* Update the to_sections field in the core_ops structure
2107 if needed. */
2108 if (update_coreops)
2109 {
2110 core_ops.to_sections = target->to_sections;
2111 core_ops.to_sections_end = target->to_sections_end;
2112 }
2113 new_target_sect_ptr = target->to_sections + old;
2114 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
2115 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
2116 bfd_section_size (abfd, sect);;
2117 new_target_sect_ptr->the_bfd_section = sect;
2118 new_target_sect_ptr->bfd = abfd;
2119 }
2120 }
2121
2122 static int
2123 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
2124 {
2125 bfd *dll_bfd;
2126 map_code_section_args map_args;
2127 asection *lowest_sect;
2128 char *name;
2129 if (dll_name == NULL || target == NULL)
2130 return 0;
2131 name = xstrdup (dll_name);
2132 dll_bfd = bfd_openr (name, "pei-i386");
2133 if (dll_bfd == NULL)
2134 return 0;
2135
2136 if (bfd_check_format (dll_bfd, bfd_object))
2137 {
2138 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
2139 if (lowest_sect == NULL)
2140 return 0;
2141 map_args.target = target;
2142 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
2143
2144 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
2145 }
2146
2147 return 1;
2148 }
2149
2150 static void
2151 core_section_load_dll_symbols (bfd *abfd, asection *sect, void *obj)
2152 {
2153 struct target_ops *target = (struct target_ops *) obj;
2154
2155 DWORD base_addr;
2156
2157 int dll_name_size;
2158 struct win32_pstatus *pstatus;
2159 struct so_list *so;
2160 char *dll_name;
2161 char *buf = NULL;
2162 char *p;
2163 struct objfile *objfile;
2164 const char *dll_basename;
2165
2166 if (strncmp (sect->name, ".module", 7) != 0)
2167 return;
2168
2169 buf = (char *) xmalloc (bfd_get_section_size (sect) + 1);
2170 if (!buf)
2171 {
2172 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2173 goto out;
2174 }
2175 if (!bfd_get_section_contents (abfd, sect, buf, 0, bfd_get_section_size (sect)))
2176 goto out;
2177
2178 pstatus = (struct win32_pstatus *) buf;
2179
2180 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
2181 dll_name_size = pstatus->data.module_info.module_name_size;
2182 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > bfd_get_section_size (sect))
2183 goto out;
2184
2185 dll_name = pstatus->data.module_info.module_name;
2186
2187 if (!(dll_basename = strrchr (dll_name, '/')))
2188 dll_basename = dll_name;
2189 else
2190 dll_basename++;
2191
2192 ALL_OBJFILES (objfile)
2193 {
2194 char *objfile_basename = strrchr (objfile->name, '/');
2195
2196 if (objfile_basename &&
2197 strcasecmp (dll_basename, objfile_basename + 1) == 0)
2198 goto out;
2199 }
2200
2201 base_addr += 0x1000;
2202 dll_name = register_loaded_dll (dll_name, base_addr, 1);
2203
2204 if (!dll_code_sections_add (dll_name, (DWORD) base_addr, target))
2205 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
2206
2207 out:
2208 if (buf)
2209 xfree (buf);
2210 return;
2211 }
2212
2213 static struct so_list *
2214 win32_current_sos (void)
2215 {
2216 struct so_list *sop;
2217 struct so_list *start = NULL;
2218 struct so_list *last = NULL;
2219
2220 if (!solib_start.next && core_bfd)
2221 {
2222 win32_clear_solib ();
2223 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols,
2224 &win32_ops);
2225 }
2226
2227 for (sop = solib_start.next; sop; sop = sop->next)
2228 {
2229 struct so_list *new = XZALLOC (struct so_list);
2230 strcpy (new->so_name, sop->so_name);
2231 strcpy (new->so_original_name, sop->so_original_name);
2232 if (!start)
2233 last = start = new;
2234 else
2235 {
2236 last->next = new;
2237 last = new;
2238 }
2239 }
2240
2241 return start;
2242 }
2243
2244 static void
2245 fetch_elf_core_registers (char *core_reg_sect,
2246 unsigned core_reg_size,
2247 int which,
2248 CORE_ADDR reg_addr)
2249 {
2250 int r;
2251 if (core_reg_size < sizeof (CONTEXT))
2252 {
2253 error (_("Core file register section too small (%u bytes)."), core_reg_size);
2254 return;
2255 }
2256 for (r = 0; r < NUM_REGS; r++)
2257 regcache_raw_supply (current_regcache, r, core_reg_sect + mappings[r]);
2258 }
2259
2260 static int
2261 open_symbol_file_object (void *from_ttyp)
2262 {
2263 return 0;
2264 }
2265
2266 static int
2267 in_dynsym_resolve_code (CORE_ADDR pc)
2268 {
2269 return 0;
2270 }
2271
2272 static void
2273 init_win32_ops (void)
2274 {
2275 win32_ops.to_shortname = "child";
2276 win32_ops.to_longname = "Win32 child process";
2277 win32_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2278 win32_ops.to_open = win32_open;
2279 win32_ops.to_close = win32_close;
2280 win32_ops.to_attach = win32_attach;
2281 win32_ops.to_detach = win32_detach;
2282 win32_ops.to_resume = win32_resume;
2283 win32_ops.to_wait = win32_wait;
2284 win32_ops.to_fetch_registers = win32_fetch_inferior_registers;
2285 win32_ops.to_store_registers = win32_store_inferior_registers;
2286 win32_ops.to_prepare_to_store = win32_prepare_to_store;
2287 win32_ops.deprecated_xfer_memory = win32_xfer_memory;
2288 win32_ops.to_files_info = win32_files_info;
2289 win32_ops.to_insert_breakpoint = memory_insert_breakpoint;
2290 win32_ops.to_remove_breakpoint = memory_remove_breakpoint;
2291 win32_ops.to_terminal_init = terminal_init_inferior;
2292 win32_ops.to_terminal_inferior = terminal_inferior;
2293 win32_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2294 win32_ops.to_terminal_ours = terminal_ours;
2295 win32_ops.to_terminal_save_ours = terminal_save_ours;
2296 win32_ops.to_terminal_info = child_terminal_info;
2297 win32_ops.to_kill = win32_kill_inferior;
2298 win32_ops.to_create_inferior = win32_create_inferior;
2299 win32_ops.to_mourn_inferior = win32_mourn_inferior;
2300 win32_ops.to_can_run = win32_can_run;
2301 win32_ops.to_thread_alive = win32_win32_thread_alive;
2302 win32_ops.to_pid_to_str = cygwin_pid_to_str;
2303 win32_ops.to_stop = win32_stop;
2304 win32_ops.to_stratum = process_stratum;
2305 win32_ops.to_has_all_memory = 1;
2306 win32_ops.to_has_memory = 1;
2307 win32_ops.to_has_stack = 1;
2308 win32_ops.to_has_registers = 1;
2309 win32_ops.to_has_execution = 1;
2310 win32_ops.to_magic = OPS_MAGIC;
2311 win32_ops.to_pid_to_exec_file = win32_pid_to_exec_file;
2312
2313 win32_so_ops.relocate_section_addresses = win32_relocate_section_addresses;
2314 win32_so_ops.free_so = win32_free_so;
2315 win32_so_ops.clear_solib = win32_clear_solib;
2316 win32_so_ops.solib_create_inferior_hook = win32_solib_create_inferior_hook;
2317 win32_so_ops.special_symbol_handling = win32_special_symbol_handling;
2318 win32_so_ops.current_sos = win32_current_sos;
2319 win32_so_ops.open_symbol_file_object = open_symbol_file_object;
2320 win32_so_ops.in_dynsym_resolve_code = in_dynsym_resolve_code;
2321
2322 /* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */
2323 current_target_so_ops = &win32_so_ops;
2324 }
2325
2326 static void
2327 set_win32_aliases (char *argv0)
2328 {
2329 add_info_alias ("dll", "sharedlibrary", 1);
2330 }
2331
2332 void
2333 _initialize_win32_nat (void)
2334 {
2335 struct cmd_list_element *c;
2336
2337 init_win32_ops ();
2338
2339 c = add_com ("dll-symbols", class_files, dll_symbol_command,
2340 _("Load dll library symbols from FILE."));
2341 set_cmd_completer (c, filename_completer);
2342
2343 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2344
2345 add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2346 Set use of shell to start subprocess."), _("\
2347 Show use of shell to start subprocess."), NULL,
2348 NULL,
2349 NULL, /* FIXME: i18n: */
2350 &setlist, &showlist);
2351
2352 add_setshow_boolean_cmd ("cygwin-exceptions", class_support, &cygwin_exceptions, _("\
2353 Break when an exception is detected in the Cygwin DLL itself."), _("\
2354 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2355 NULL,
2356 NULL, /* FIXME: i18n: */
2357 &setlist, &showlist);
2358
2359 add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2360 Set creation of new console when creating child process."), _("\
2361 Show creation of new console when creating child process."), NULL,
2362 NULL,
2363 NULL, /* FIXME: i18n: */
2364 &setlist, &showlist);
2365
2366 add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2367 Set creation of new group when creating child process."), _("\
2368 Show creation of new group when creating child process."), NULL,
2369 NULL,
2370 NULL, /* FIXME: i18n: */
2371 &setlist, &showlist);
2372
2373 add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2374 Set whether to display execution in child process."), _("\
2375 Show whether to display execution in child process."), NULL,
2376 NULL,
2377 NULL, /* FIXME: i18n: */
2378 &setlist, &showlist);
2379
2380 add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2381 Set whether to display kernel events in child process."), _("\
2382 Show whether to display kernel events in child process."), NULL,
2383 NULL,
2384 NULL, /* FIXME: i18n: */
2385 &setlist, &showlist);
2386
2387 add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2388 Set whether to display memory accesses in child process."), _("\
2389 Show whether to display memory accesses in child process."), NULL,
2390 NULL,
2391 NULL, /* FIXME: i18n: */
2392 &setlist, &showlist);
2393
2394 add_setshow_boolean_cmd ("debugexceptions", class_support,
2395 &debug_exceptions, _("\
2396 Set whether to display kernel exceptions in child process."), _("\
2397 Show whether to display kernel exceptions in child process."), NULL,
2398 NULL,
2399 NULL, /* FIXME: i18n: */
2400 &setlist, &showlist);
2401
2402 add_prefix_cmd ("w32", class_info, info_w32_command,
2403 _("Print information specific to Win32 debugging."),
2404 &info_w32_cmdlist, "info w32 ", 0, &infolist);
2405
2406 add_cmd ("selector", class_info, display_selectors,
2407 _("Display selectors infos."),
2408 &info_w32_cmdlist);
2409 add_target (&win32_ops);
2410 deprecated_init_ui_hook = set_win32_aliases;
2411 }
2412
2413 /* Hardware watchpoint support, adapted from go32-nat.c code. */
2414
2415 /* Pass the address ADDR to the inferior in the I'th debug register.
2416 Here we just store the address in dr array, the registers will be
2417 actually set up when win32_continue is called. */
2418 void
2419 cygwin_set_dr (int i, CORE_ADDR addr)
2420 {
2421 if (i < 0 || i > 3)
2422 internal_error (__FILE__, __LINE__,
2423 _("Invalid register %d in cygwin_set_dr.\n"), i);
2424 dr[i] = (unsigned) addr;
2425 debug_registers_changed = 1;
2426 debug_registers_used = 1;
2427 }
2428
2429 /* Pass the value VAL to the inferior in the DR7 debug control
2430 register. Here we just store the address in D_REGS, the watchpoint
2431 will be actually set up in win32_wait. */
2432 void
2433 cygwin_set_dr7 (unsigned val)
2434 {
2435 dr[7] = val;
2436 debug_registers_changed = 1;
2437 debug_registers_used = 1;
2438 }
2439
2440 /* Get the value of the DR6 debug status register from the inferior.
2441 Here we just return the value stored in dr[6]
2442 by the last call to thread_rec for current_event.dwThreadId id. */
2443 unsigned
2444 cygwin_get_dr6 (void)
2445 {
2446 return dr[6];
2447 }
2448
2449 /* Determine if the thread referenced by "pid" is alive
2450 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
2451 it means that the pid has died. Otherwise it is assumed to be alive. */
2452 static int
2453 win32_win32_thread_alive (ptid_t ptid)
2454 {
2455 int pid = PIDGET (ptid);
2456
2457 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
2458 FALSE : TRUE;
2459 }
2460
2461 static struct core_fns win32_elf_core_fns =
2462 {
2463 bfd_target_elf_flavour,
2464 default_check_format,
2465 default_core_sniffer,
2466 fetch_elf_core_registers,
2467 NULL
2468 };
2469
2470 void
2471 _initialize_core_win32 (void)
2472 {
2473 deprecated_add_core_fns (&win32_elf_core_fns);
2474 }
2475
2476 void
2477 _initialize_check_for_gdb_ini (void)
2478 {
2479 char *homedir;
2480 if (inhibit_gdbinit)
2481 return;
2482
2483 homedir = getenv ("HOME");
2484 if (homedir)
2485 {
2486 char *p;
2487 char *oldini = (char *) alloca (strlen (homedir) +
2488 sizeof ("/gdb.ini"));
2489 strcpy (oldini, homedir);
2490 p = strchr (oldini, '\0');
2491 if (p > oldini && p[-1] != '/')
2492 *p++ = '/';
2493 strcpy (p, "gdb.ini");
2494 if (access (oldini, 0) == 0)
2495 {
2496 int len = strlen (oldini);
2497 char *newini = alloca (len + 1);
2498 sprintf (newini, "%.*s.gdbinit",
2499 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2500 warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2501 }
2502 }
2503 }