1 /* Low level interface to Windows debugging, for gdbserver.
2 Copyright (C) 2006-2020 Free Software Foundation, Inc.
4 Contributed by Leo Zayas. Based on "win32-nat.c" from GDB.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "gdb/fileio.h"
24 #include "mem-break.h"
25 #include "win32-low.h"
26 #include "gdbthread.h"
35 #include "gdbsupport/gdb_tilde_expand.h"
36 #include "gdbsupport/common-inferior.h"
37 #include "gdbsupport/gdb_wait.h"
39 using namespace windows_nat
;
42 #include <sys/cygwin.h>
45 #define OUTMSG(X) do { printf X; fflush (stderr); } while (0)
58 #define _T(x) TEXT (x)
62 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
66 # define GETPROCADDRESS(DLL, PROC) \
67 ((winapi_ ## PROC) GetProcAddress (DLL, TEXT (#PROC)))
69 # define GETPROCADDRESS(DLL, PROC) \
70 ((winapi_ ## PROC) GetProcAddress (DLL, #PROC))
73 int using_threads
= 1;
76 static int attaching
= 0;
78 /* A status that hasn't been reported to the core yet, and so
79 win32_wait should return it next, instead of fetching the next
80 debug event off the win32 API. */
81 static struct target_waitstatus cached_status
;
83 /* Non zero if an interrupt request is to be satisfied by suspending
85 static int soft_interrupt_requested
= 0;
87 /* Non zero if the inferior is stopped in a simulated breakpoint done
88 by suspending all the threads. */
89 static int faked_breakpoint
= 0;
92 bool wow64_process
= false;
95 const struct target_desc
*win32_tdesc
;
97 const struct target_desc
*wow64_win32_tdesc
;
100 #define NUM_REGS (the_low_target.num_regs ())
102 typedef BOOL (WINAPI
*winapi_DebugActiveProcessStop
) (DWORD dwProcessId
);
103 typedef BOOL (WINAPI
*winapi_DebugSetProcessKillOnExit
) (BOOL KillOnExit
);
104 typedef BOOL (WINAPI
*winapi_DebugBreakProcess
) (HANDLE
);
105 typedef BOOL (WINAPI
*winapi_GenerateConsoleCtrlEvent
) (DWORD
, DWORD
);
108 typedef BOOL (WINAPI
*winapi_Wow64SetThreadContext
) (HANDLE
,
109 const WOW64_CONTEXT
*);
111 winapi_Wow64GetThreadContext win32_Wow64GetThreadContext
;
112 static winapi_Wow64SetThreadContext win32_Wow64SetThreadContext
;
116 static void win32_add_all_dlls (void);
119 /* Get the thread ID from the current selected inferior (the current
122 current_thread_ptid (void)
127 /* The current debug event from WaitForDebugEvent. */
129 debug_event_ptid (DEBUG_EVENT
*event
)
131 return ptid_t (event
->dwProcessId
, event
->dwThreadId
, 0);
134 /* Get the thread context of the thread associated with TH. */
137 win32_get_thread_context (windows_thread_info
*th
)
141 memset (&th
->wow64_context
, 0, sizeof (WOW64_CONTEXT
));
144 memset (&th
->context
, 0, sizeof (CONTEXT
));
145 (*the_low_target
.get_thread_context
) (th
);
147 memcpy (&th
->base_context
, &th
->context
, sizeof (CONTEXT
));
151 /* Set the thread context of the thread associated with TH. */
154 win32_set_thread_context (windows_thread_info
*th
)
157 /* Calling SuspendThread on a thread that is running kernel code
158 will report that the suspending was successful, but in fact, that
159 will often not be true. In those cases, the context returned by
160 GetThreadContext will not be correct by the time the thread
161 stops, hence we can't set that context back into the thread when
162 resuming - it will most likely crash the inferior.
163 Unfortunately, there is no way to know when the thread will
164 really stop. To work around it, we'll only write the context
165 back to the thread when either the user or GDB explicitly change
166 it between stopping and resuming. */
167 if (memcmp (&th
->context
, &th
->base_context
, sizeof (CONTEXT
)) != 0)
172 win32_Wow64SetThreadContext (th
->h
, &th
->wow64_context
);
175 SetThreadContext (th
->h
, &th
->context
);
179 /* Set the thread context of the thread associated with TH. */
182 win32_prepare_to_resume (windows_thread_info
*th
)
184 if (the_low_target
.prepare_to_resume
!= NULL
)
185 (*the_low_target
.prepare_to_resume
) (th
);
188 /* See win32-low.h. */
191 win32_require_context (windows_thread_info
*th
)
196 context_flags
= th
->wow64_context
.ContextFlags
;
199 context_flags
= th
->context
.ContextFlags
;
200 if (context_flags
== 0)
203 win32_get_thread_context (th
);
207 /* See nat/windows-nat.h. */
209 windows_thread_info
*
210 windows_nat::thread_rec (ptid_t ptid
, thread_disposition_type disposition
)
212 thread_info
*thread
= find_thread_ptid (ptid
);
216 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
217 if (disposition
!= DONT_INVALIDATE_CONTEXT
)
218 win32_require_context (th
);
222 /* Add a thread to the thread list. */
223 static windows_thread_info
*
224 child_add_thread (DWORD pid
, DWORD tid
, HANDLE h
, void *tlb
)
226 windows_thread_info
*th
;
227 ptid_t ptid
= ptid_t (pid
, tid
, 0);
229 if ((th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
)))
232 CORE_ADDR base
= (CORE_ADDR
) (uintptr_t) tlb
;
234 /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
235 and the 32bit TIB is exactly 2 pages after it. */
237 base
+= 2 * 4096; /* page size = 4096 */
239 th
= new windows_thread_info (tid
, h
, base
);
241 add_thread (ptid
, th
);
243 if (the_low_target
.thread_added
!= NULL
)
244 (*the_low_target
.thread_added
) (th
);
249 /* Delete a thread from the list of threads. */
251 delete_thread_info (thread_info
*thread
)
253 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
255 remove_thread (thread
);
259 /* Delete a thread from the list of threads. */
261 child_delete_thread (DWORD pid
, DWORD tid
)
263 /* If the last thread is exiting, just return. */
264 if (all_threads
.size () == 1)
267 thread_info
*thread
= find_thread_ptid (ptid_t (pid
, tid
));
271 delete_thread_info (thread
);
274 /* These watchpoint related wrapper functions simply pass on the function call
275 if the low target has registered a corresponding function. */
278 win32_process_target::supports_z_point_type (char z_type
)
280 return (z_type
== Z_PACKET_SW_BP
281 || (the_low_target
.supports_z_point_type
!= NULL
282 && the_low_target
.supports_z_point_type (z_type
)));
286 win32_process_target::insert_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
287 int size
, raw_breakpoint
*bp
)
289 if (type
== raw_bkpt_type_sw
)
290 return insert_memory_breakpoint (bp
);
291 else if (the_low_target
.insert_point
!= NULL
)
292 return the_low_target
.insert_point (type
, addr
, size
, bp
);
294 /* Unsupported (see target.h). */
299 win32_process_target::remove_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
300 int size
, raw_breakpoint
*bp
)
302 if (type
== raw_bkpt_type_sw
)
303 return remove_memory_breakpoint (bp
);
304 else if (the_low_target
.remove_point
!= NULL
)
305 return the_low_target
.remove_point (type
, addr
, size
, bp
);
307 /* Unsupported (see target.h). */
312 win32_process_target::stopped_by_watchpoint ()
314 if (the_low_target
.stopped_by_watchpoint
!= NULL
)
315 return the_low_target
.stopped_by_watchpoint ();
321 win32_process_target::stopped_data_address ()
323 if (the_low_target
.stopped_data_address
!= NULL
)
324 return the_low_target
.stopped_data_address ();
330 /* Transfer memory from/to the debugged process. */
332 child_xfer_memory (CORE_ADDR memaddr
, char *our
, int len
,
333 int write
, process_stratum_target
*target
)
338 uintptr_t addr
= (uintptr_t) memaddr
;
342 success
= WriteProcessMemory (current_process_handle
, (LPVOID
) addr
,
343 (LPCVOID
) our
, len
, &done
);
345 lasterror
= GetLastError ();
346 FlushInstructionCache (current_process_handle
, (LPCVOID
) addr
, len
);
350 success
= ReadProcessMemory (current_process_handle
, (LPCVOID
) addr
,
351 (LPVOID
) our
, len
, &done
);
353 lasterror
= GetLastError ();
355 if (!success
&& lasterror
== ERROR_PARTIAL_COPY
&& done
> 0)
358 return success
? done
: -1;
361 /* Clear out any old thread list and reinitialize it to a pristine
364 child_init_thread_list (void)
366 for_each_thread (delete_thread_info
);
369 /* Zero during the child initialization phase, and nonzero otherwise. */
371 static int child_initialization_done
= 0;
374 do_initial_child_stuff (HANDLE proch
, DWORD pid
, int attached
)
376 struct process_info
*proc
;
378 last_sig
= GDB_SIGNAL_0
;
380 current_process_handle
= proch
;
381 current_process_id
= pid
;
384 soft_interrupt_requested
= 0;
385 faked_breakpoint
= 0;
387 memset (¤t_event
, 0, sizeof (current_event
));
391 if (!IsWow64Process (proch
, &wow64
))
393 DWORD err
= GetLastError ();
394 error ("Check if WOW64 process failed (error %d): %s\n",
395 (int) err
, strwinerror (err
));
397 wow64_process
= wow64
;
400 && (win32_Wow64GetThreadContext
== nullptr
401 || win32_Wow64SetThreadContext
== nullptr))
402 error ("WOW64 debugging is not supported on this system.\n");
404 ignore_first_breakpoint
= !attached
&& wow64_process
;
407 proc
= add_process (pid
, attached
);
410 proc
->tdesc
= wow64_win32_tdesc
;
413 proc
->tdesc
= win32_tdesc
;
414 child_init_thread_list ();
415 child_initialization_done
= 0;
417 if (the_low_target
.initial_stuff
!= NULL
)
418 (*the_low_target
.initial_stuff
) ();
420 cached_status
.kind
= TARGET_WAITKIND_IGNORE
;
422 /* Flush all currently pending debug events (thread and dll list) up
423 to the initial breakpoint. */
426 struct target_waitstatus status
;
428 the_target
->wait (minus_one_ptid
, &status
, 0);
430 /* Note win32_wait doesn't return thread events. */
431 if (status
.kind
!= TARGET_WAITKIND_LOADED
)
433 cached_status
= status
;
438 struct thread_resume resume
;
440 resume
.thread
= minus_one_ptid
;
441 resume
.kind
= resume_continue
;
444 the_target
->resume (&resume
, 1);
449 /* Now that the inferior has been started and all DLLs have been mapped,
450 we can iterate over all DLLs and load them in.
452 We avoid doing it any earlier because, on certain versions of Windows,
453 LOAD_DLL_DEBUG_EVENTs are sometimes not complete. In particular,
454 we have seen on Windows 8.1 that the ntdll.dll load event does not
455 include the DLL name, preventing us from creating an associated SO.
456 A possible explanation is that ntdll.dll might be mapped before
457 the SO info gets created by the Windows system -- ntdll.dll is
458 the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
459 do not seem to suffer from that problem.
461 Rather than try to work around this sort of issue, it is much
462 simpler to just ignore DLL load/unload events during the startup
463 phase, and then process them all in one batch now. */
464 win32_add_all_dlls ();
467 child_initialization_done
= 1;
470 /* Resume all artificially suspended threads if we are continuing
473 continue_one_thread (thread_info
*thread
, int thread_id
)
475 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
477 if (thread_id
== -1 || thread_id
== th
->tid
)
479 win32_prepare_to_resume (th
);
483 DWORD
*context_flags
;
486 context_flags
= &th
->wow64_context
.ContextFlags
;
489 context_flags
= &th
->context
.ContextFlags
;
492 win32_set_thread_context (th
);
502 child_continue (DWORD continue_status
, int thread_id
)
504 desired_stop_thread_id
= thread_id
;
505 if (matching_pending_stop (debug_threads
))
508 /* The inferior will only continue after the ContinueDebugEvent
510 for_each_thread ([&] (thread_info
*thread
)
512 continue_one_thread (thread
, thread_id
);
514 faked_breakpoint
= 0;
516 return continue_last_debug_event (continue_status
, debug_threads
);
519 /* Fetch register(s) from the current thread context. */
521 child_fetch_inferior_registers (struct regcache
*regcache
, int r
)
524 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
526 if (r
== -1 || r
> NUM_REGS
)
527 child_fetch_inferior_registers (regcache
, NUM_REGS
);
529 for (regno
= 0; regno
< r
; regno
++)
530 (*the_low_target
.fetch_inferior_register
) (regcache
, th
, regno
);
533 /* Store a new register value into the current thread context. We don't
534 change the program's context until later, when we resume it. */
536 child_store_inferior_registers (struct regcache
*regcache
, int r
)
539 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
541 if (r
== -1 || r
== 0 || r
> NUM_REGS
)
542 child_store_inferior_registers (regcache
, NUM_REGS
);
544 for (regno
= 0; regno
< r
; regno
++)
545 (*the_low_target
.store_inferior_register
) (regcache
, th
, regno
);
548 /* Map the Windows error number in ERROR to a locale-dependent error
549 message string and return a pointer to it. Typically, the values
550 for ERROR come from GetLastError.
552 The string pointed to shall not be modified by the application,
553 but may be overwritten by a subsequent call to strwinerror
555 The strwinerror function does not change the current setting
559 strwinerror (DWORD error
)
561 static char buf
[1024];
563 DWORD lasterr
= GetLastError ();
564 DWORD chars
= FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
565 | FORMAT_MESSAGE_ALLOCATE_BUFFER
,
568 0, /* Default language */
574 /* If there is an \r\n appended, zap it. */
576 && msgbuf
[chars
- 2] == '\r'
577 && msgbuf
[chars
- 1] == '\n')
583 if (chars
> ((COUNTOF (buf
)) - 1))
585 chars
= COUNTOF (buf
) - 1;
590 wcstombs (buf
, msgbuf
, chars
+ 1);
592 strncpy (buf
, msgbuf
, chars
+ 1);
597 sprintf (buf
, "unknown win32 error (%u)", (unsigned) error
);
599 SetLastError (lasterr
);
604 create_process (const char *program
, char *args
,
605 DWORD flags
, PROCESS_INFORMATION
*pi
)
607 const char *inferior_cwd
= get_inferior_cwd ();
609 size_t argslen
, proglen
;
611 proglen
= strlen (program
) + 1;
612 argslen
= strlen (args
) + proglen
;
615 wchar_t *p
, *wprogram
, *wargs
, *wcwd
= NULL
;
617 wprogram
= (wchar_t *) alloca (proglen
* sizeof (wchar_t));
618 mbstowcs (wprogram
, program
, proglen
);
620 for (p
= wprogram
; *p
; ++p
)
624 wargs
= alloca ((argslen
+ 1) * sizeof (wchar_t));
625 wcscpy (wargs
, wprogram
);
626 wcscat (wargs
, L
" ");
627 mbstowcs (wargs
+ proglen
, args
, argslen
+ 1 - proglen
);
629 if (inferior_cwd
!= NULL
)
631 std::string expanded_infcwd
= gdb_tilde_expand (inferior_cwd
);
632 std::replace (expanded_infcwd
.begin (), expanded_infcwd
.end (),
634 wcwd
= alloca ((expanded_infcwd
.size () + 1) * sizeof (wchar_t));
635 if (mbstowcs (wcwd
, expanded_infcwd
.c_str (),
636 expanded_infcwd
.size () + 1) == NULL
)
639 Could not convert the expanded inferior cwd to wide-char."));
643 ret
= CreateProcessW (wprogram
, /* image name */
644 wargs
, /* command line */
645 NULL
, /* security, not supported */
646 NULL
, /* thread, not supported */
647 FALSE
, /* inherit handles, not supported */
648 flags
, /* start flags */
649 NULL
, /* environment, not supported */
650 wcwd
, /* current directory */
651 NULL
, /* start info, not supported */
654 STARTUPINFOA si
= { sizeof (STARTUPINFOA
) };
655 char *program_and_args
= (char *) alloca (argslen
+ 1);
657 strcpy (program_and_args
, program
);
658 strcat (program_and_args
, " ");
659 strcat (program_and_args
, args
);
660 ret
= CreateProcessA (program
, /* image name */
661 program_and_args
, /* command line */
664 TRUE
, /* inherit handles */
665 flags
, /* start flags */
666 NULL
, /* environment */
667 /* current directory */
668 (inferior_cwd
== NULL
670 : gdb_tilde_expand (inferior_cwd
).c_str()),
671 &si
, /* start info */
678 /* Start a new process.
679 PROGRAM is the program name.
680 PROGRAM_ARGS is the vector containing the inferior's args.
681 Returns the new PID on success, -1 on failure. Registers the new
682 process with the process list. */
684 win32_process_target::create_inferior (const char *program
,
685 const std::vector
<char *> &program_args
)
687 client_state
&cs
= get_client_state ();
689 char real_path
[PATH_MAX
];
690 char *orig_path
, *new_path
, *path_ptr
;
694 PROCESS_INFORMATION pi
;
696 std::string str_program_args
= stringify_argv (program_args
);
697 char *args
= (char *) str_program_args
.c_str ();
699 /* win32_wait needs to know we're not attaching. */
703 error ("No executable specified, specify executable to debug.\n");
705 flags
= DEBUG_PROCESS
| DEBUG_ONLY_THIS_PROCESS
;
709 path_ptr
= getenv ("PATH");
712 int size
= cygwin_conv_path_list (CCP_POSIX_TO_WIN_A
, path_ptr
, NULL
, 0);
713 orig_path
= (char *) alloca (strlen (path_ptr
) + 1);
714 new_path
= (char *) alloca (size
);
715 strcpy (orig_path
, path_ptr
);
716 cygwin_conv_path_list (CCP_POSIX_TO_WIN_A
, path_ptr
, new_path
, size
);
717 setenv ("PATH", new_path
, 1);
719 cygwin_conv_path (CCP_POSIX_TO_WIN_A
, program
, real_path
, PATH_MAX
);
723 OUTMSG2 (("Command line is \"%s %s\"\n", program
, args
));
725 #ifdef CREATE_NEW_PROCESS_GROUP
726 flags
|= CREATE_NEW_PROCESS_GROUP
;
729 ret
= create_process (program
, args
, flags
, &pi
);
730 err
= GetLastError ();
731 if (!ret
&& err
== ERROR_FILE_NOT_FOUND
)
733 char *exename
= (char *) alloca (strlen (program
) + 5);
734 strcat (strcpy (exename
, program
), ".exe");
735 ret
= create_process (exename
, args
, flags
, &pi
);
736 err
= GetLastError ();
741 setenv ("PATH", orig_path
, 1);
746 error ("Error creating process \"%s %s\", (error %d): %s\n",
747 program
, args
, (int) err
, strwinerror (err
));
751 OUTMSG2 (("Process created: %s %s\n", program
, (char *) args
));
755 /* On Windows CE this handle can't be closed. The OS reuses
756 it in the debug events, while the 9x/NT versions of Windows
757 probably use a DuplicateHandle'd one. */
758 CloseHandle (pi
.hThread
);
761 do_initial_child_stuff (pi
.hProcess
, pi
.dwProcessId
, 0);
763 /* Wait till we are at 1st instruction in program, return new pid
764 (assuming success). */
765 cs
.last_ptid
= wait (ptid_t (current_process_id
), &cs
.last_status
, 0);
767 /* Necessary for handle_v_kill. */
768 signal_pid
= current_process_id
;
770 return current_process_id
;
773 /* Attach to a running process.
774 PID is the process ID to attach to, specified by the user
775 or a higher layer. */
777 win32_process_target::attach (unsigned long pid
)
780 winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit
= NULL
;
783 HMODULE dll
= GetModuleHandle (_T("COREDLL.DLL"));
785 HMODULE dll
= GetModuleHandle (_T("KERNEL32.DLL"));
787 DebugSetProcessKillOnExit
= GETPROCADDRESS (dll
, DebugSetProcessKillOnExit
);
789 h
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
, pid
);
792 if (DebugActiveProcess (pid
))
794 if (DebugSetProcessKillOnExit
!= NULL
)
795 DebugSetProcessKillOnExit (FALSE
);
797 /* win32_wait needs to know we're attaching. */
799 do_initial_child_stuff (h
, pid
, 1);
806 err
= GetLastError ();
807 error ("Attach to process failed (error %d): %s\n",
808 (int) err
, strwinerror (err
));
811 /* See nat/windows-nat.h. */
814 windows_nat::handle_output_debug_string (struct target_waitstatus
*ourstatus
)
816 #define READ_BUFFER_LEN 1024
818 char s
[READ_BUFFER_LEN
+ 1] = { 0 };
819 DWORD nbytes
= current_event
.u
.DebugString
.nDebugStringLength
;
824 if (nbytes
> READ_BUFFER_LEN
)
825 nbytes
= READ_BUFFER_LEN
;
827 addr
= (CORE_ADDR
) (size_t) current_event
.u
.DebugString
.lpDebugStringData
;
829 if (current_event
.u
.DebugString
.fUnicode
)
831 /* The event tells us how many bytes, not chars, even
833 WCHAR buffer
[(READ_BUFFER_LEN
+ 1) / sizeof (WCHAR
)] = { 0 };
834 if (read_inferior_memory (addr
, (unsigned char *) buffer
, nbytes
) != 0)
836 wcstombs (s
, buffer
, (nbytes
+ 1) / sizeof (WCHAR
));
840 if (read_inferior_memory (addr
, (unsigned char *) s
, nbytes
) != 0)
844 if (!startswith (s
, "cYg"))
854 #undef READ_BUFFER_LEN
860 win32_clear_inferiors (void)
862 if (current_process_handle
!= NULL
)
863 CloseHandle (current_process_handle
);
865 for_each_thread (delete_thread_info
);
866 siginfo_er
.ExceptionCode
= 0;
870 /* Implementation of target_ops::kill. */
873 win32_process_target::kill (process_info
*process
)
875 TerminateProcess (current_process_handle
, 0);
878 if (!child_continue (DBG_CONTINUE
, -1))
880 if (!wait_for_debug_event (¤t_event
, INFINITE
))
882 if (current_event
.dwDebugEventCode
== EXIT_PROCESS_DEBUG_EVENT
)
884 else if (current_event
.dwDebugEventCode
== OUTPUT_DEBUG_STRING_EVENT
)
885 handle_output_debug_string (nullptr);
888 win32_clear_inferiors ();
890 remove_process (process
);
894 /* Implementation of target_ops::detach. */
897 win32_process_target::detach (process_info
*process
)
899 winapi_DebugActiveProcessStop DebugActiveProcessStop
= NULL
;
900 winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit
= NULL
;
902 HMODULE dll
= GetModuleHandle (_T("COREDLL.DLL"));
904 HMODULE dll
= GetModuleHandle (_T("KERNEL32.DLL"));
906 DebugActiveProcessStop
= GETPROCADDRESS (dll
, DebugActiveProcessStop
);
907 DebugSetProcessKillOnExit
= GETPROCADDRESS (dll
, DebugSetProcessKillOnExit
);
909 if (DebugSetProcessKillOnExit
== NULL
910 || DebugActiveProcessStop
== NULL
)
914 struct thread_resume resume
;
915 resume
.thread
= minus_one_ptid
;
916 resume
.kind
= resume_continue
;
918 this->resume (&resume
, 1);
921 if (!DebugActiveProcessStop (current_process_id
))
924 DebugSetProcessKillOnExit (FALSE
);
925 remove_process (process
);
927 win32_clear_inferiors ();
932 win32_process_target::mourn (struct process_info
*process
)
934 remove_process (process
);
937 /* Implementation of target_ops::join. */
940 win32_process_target::join (int pid
)
942 HANDLE h
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
, pid
);
945 WaitForSingleObject (h
, INFINITE
);
950 /* Return true iff the thread with thread ID TID is alive. */
952 win32_process_target::thread_alive (ptid_t ptid
)
954 /* Our thread list is reliable; don't bother to poll target
956 return find_thread_ptid (ptid
) != NULL
;
959 /* Resume the inferior process. RESUME_INFO describes how we want
962 win32_process_target::resume (thread_resume
*resume_info
, size_t n
)
967 windows_thread_info
*th
;
968 DWORD continue_status
= DBG_CONTINUE
;
971 /* This handles the very limited set of resume packets that GDB can
972 currently produce. */
974 if (n
== 1 && resume_info
[0].thread
== minus_one_ptid
)
979 /* Yes, we're ignoring resume_info[0].thread. It'd be tricky to make
980 the Windows resume code do the right thing for thread switching. */
981 tid
= current_event
.dwThreadId
;
983 if (resume_info
[0].thread
!= minus_one_ptid
)
985 sig
= gdb_signal_from_host (resume_info
[0].sig
);
986 step
= resume_info
[0].kind
== resume_step
;
994 if (sig
!= GDB_SIGNAL_0
)
996 if (current_event
.dwDebugEventCode
!= EXCEPTION_DEBUG_EVENT
)
998 OUTMSG (("Cannot continue with signal %s here.\n",
999 gdb_signal_to_string (sig
)));
1001 else if (sig
== last_sig
)
1002 continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1004 OUTMSG (("Can only continue with received signal %s.\n",
1005 gdb_signal_to_string (last_sig
)));
1008 last_sig
= GDB_SIGNAL_0
;
1010 /* Get context for the currently selected thread. */
1011 ptid
= debug_event_ptid (¤t_event
);
1012 th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
);
1015 win32_prepare_to_resume (th
);
1017 DWORD
*context_flags
;
1020 context_flags
= &th
->wow64_context
.ContextFlags
;
1023 context_flags
= &th
->context
.ContextFlags
;
1026 /* Move register values from the inferior into the thread
1027 context structure. */
1028 regcache_invalidate ();
1032 if (the_low_target
.single_step
!= NULL
)
1033 (*the_low_target
.single_step
) (th
);
1035 error ("Single stepping is not supported "
1036 "in this configuration.\n");
1039 win32_set_thread_context (th
);
1044 /* Allow continuing with the same signal that interrupted us.
1045 Otherwise complain. */
1047 child_continue (continue_status
, tid
);
1051 win32_add_one_solib (const char *name
, CORE_ADDR load_addr
)
1053 char buf
[MAX_PATH
+ 1];
1054 char buf2
[MAX_PATH
+ 1];
1057 WIN32_FIND_DATA w32_fd
;
1058 WCHAR wname
[MAX_PATH
+ 1];
1059 mbstowcs (wname
, name
, MAX_PATH
);
1060 HANDLE h
= FindFirstFile (wname
, &w32_fd
);
1062 WIN32_FIND_DATAA w32_fd
;
1063 HANDLE h
= FindFirstFileA (name
, &w32_fd
);
1066 /* The symbols in a dll are offset by 0x1000, which is the
1067 offset from 0 of the first byte in an image - because
1068 of the file header and the section alignment. */
1069 load_addr
+= 0x1000;
1071 if (h
== INVALID_HANDLE_VALUE
)
1079 char cwd
[MAX_PATH
+ 1];
1081 if (GetCurrentDirectoryA (MAX_PATH
+ 1, cwd
))
1083 p
= strrchr (buf
, '\\');
1086 SetCurrentDirectoryA (buf
);
1087 GetFullPathNameA (w32_fd
.cFileName
, MAX_PATH
, buf
, &p
);
1088 SetCurrentDirectoryA (cwd
);
1095 if (strcasecmp (buf
, "ntdll.dll") == 0)
1097 GetSystemDirectoryA (buf
, sizeof (buf
));
1098 strcat (buf
, "\\ntdll.dll");
1103 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, buf
, buf2
, sizeof (buf2
));
1108 loaded_dll (buf2
, load_addr
);
1111 typedef BOOL (WINAPI
*winapi_EnumProcessModules
) (HANDLE
, HMODULE
*,
1114 typedef BOOL (WINAPI
*winapi_EnumProcessModulesEx
) (HANDLE
, HMODULE
*, DWORD
,
1117 typedef BOOL (WINAPI
*winapi_GetModuleInformation
) (HANDLE
, HMODULE
,
1118 LPMODULEINFO
, DWORD
);
1119 typedef DWORD (WINAPI
*winapi_GetModuleFileNameExA
) (HANDLE
, HMODULE
,
1122 static winapi_EnumProcessModules win32_EnumProcessModules
;
1124 static winapi_EnumProcessModulesEx win32_EnumProcessModulesEx
;
1126 static winapi_GetModuleInformation win32_GetModuleInformation
;
1127 static winapi_GetModuleFileNameExA win32_GetModuleFileNameExA
;
1132 static int psapi_loaded
= 0;
1133 static HMODULE dll
= NULL
;
1138 dll
= LoadLibrary (TEXT("psapi.dll"));
1141 win32_EnumProcessModules
=
1142 GETPROCADDRESS (dll
, EnumProcessModules
);
1144 win32_EnumProcessModulesEx
=
1145 GETPROCADDRESS (dll
, EnumProcessModulesEx
);
1147 win32_GetModuleInformation
=
1148 GETPROCADDRESS (dll
, GetModuleInformation
);
1149 win32_GetModuleFileNameExA
=
1150 GETPROCADDRESS (dll
, GetModuleFileNameExA
);
1154 if (wow64_process
&& win32_EnumProcessModulesEx
== nullptr)
1158 return (win32_EnumProcessModules
!= NULL
1159 && win32_GetModuleInformation
!= NULL
1160 && win32_GetModuleFileNameExA
!= NULL
);
1165 /* Iterate over all DLLs currently mapped by our inferior, and
1166 add them to our list of solibs. */
1169 win32_add_all_dlls (void)
1173 HMODULE
*DllHandle
= dh_buf
;
1183 ok
= (*win32_EnumProcessModulesEx
) (current_process_handle
,
1187 LIST_MODULES_32BIT
);
1190 ok
= (*win32_EnumProcessModules
) (current_process_handle
,
1195 if (!ok
|| !cbNeeded
)
1198 DllHandle
= (HMODULE
*) alloca (cbNeeded
);
1204 ok
= (*win32_EnumProcessModulesEx
) (current_process_handle
,
1208 LIST_MODULES_32BIT
);
1211 ok
= (*win32_EnumProcessModules
) (current_process_handle
,
1218 char system_dir
[MAX_PATH
];
1219 char syswow_dir
[MAX_PATH
];
1220 size_t system_dir_len
= 0;
1221 bool convert_syswow_dir
= false;
1226 /* This fails on 32bit Windows because it has no SysWOW64 directory,
1227 and in this case a path conversion isn't necessary. */
1228 UINT len
= GetSystemWow64DirectoryA (syswow_dir
, sizeof (syswow_dir
));
1231 /* Check that we have passed a large enough buffer. */
1232 gdb_assert (len
< sizeof (syswow_dir
));
1234 len
= GetSystemDirectoryA (system_dir
, sizeof (system_dir
));
1236 gdb_assert (len
!= 0);
1237 /* Check that we have passed a large enough buffer. */
1238 gdb_assert (len
< sizeof (system_dir
));
1240 strcat (system_dir
, "\\");
1241 strcat (syswow_dir
, "\\");
1242 system_dir_len
= strlen (system_dir
);
1244 convert_syswow_dir
= true;
1249 for (i
= 1; i
< ((size_t) cbNeeded
/ sizeof (HMODULE
)); i
++)
1252 char dll_name
[MAX_PATH
];
1254 if (!(*win32_GetModuleInformation
) (current_process_handle
,
1259 if ((*win32_GetModuleFileNameExA
) (current_process_handle
,
1265 const char *name
= dll_name
;
1266 /* Convert the DLL path of 32bit processes returned by
1267 GetModuleFileNameEx from the 64bit system directory to the
1268 32bit syswow64 directory if necessary. */
1269 std::string syswow_dll_path
;
1270 if (convert_syswow_dir
1271 && strncasecmp (dll_name
, system_dir
, system_dir_len
) == 0
1272 && strchr (dll_name
+ system_dir_len
, '\\') == nullptr)
1274 syswow_dll_path
= syswow_dir
;
1275 syswow_dll_path
+= dll_name
+ system_dir_len
;
1276 name
= syswow_dll_path
.c_str();
1279 win32_add_one_solib (name
, (CORE_ADDR
) (uintptr_t) mi
.lpBaseOfDll
);
1284 typedef HANDLE (WINAPI
*winapi_CreateToolhelp32Snapshot
) (DWORD
, DWORD
);
1285 typedef BOOL (WINAPI
*winapi_Module32First
) (HANDLE
, LPMODULEENTRY32
);
1286 typedef BOOL (WINAPI
*winapi_Module32Next
) (HANDLE
, LPMODULEENTRY32
);
1288 /* See nat/windows-nat.h. */
1291 windows_nat::handle_load_dll ()
1293 LOAD_DLL_DEBUG_INFO
*event
= ¤t_event
.u
.LoadDll
;
1294 const char *dll_name
;
1296 dll_name
= get_image_name (current_process_handle
,
1297 event
->lpImageName
, event
->fUnicode
);
1301 win32_add_one_solib (dll_name
, (CORE_ADDR
) (uintptr_t) event
->lpBaseOfDll
);
1304 /* See nat/windows-nat.h. */
1307 windows_nat::handle_unload_dll ()
1309 CORE_ADDR load_addr
=
1310 (CORE_ADDR
) (uintptr_t) current_event
.u
.UnloadDll
.lpBaseOfDll
;
1312 /* The symbols in a dll are offset by 0x1000, which is the
1313 offset from 0 of the first byte in an image - because
1314 of the file header and the section alignment. */
1315 load_addr
+= 0x1000;
1316 unloaded_dll (NULL
, load_addr
);
1320 suspend_one_thread (thread_info
*thread
)
1322 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
1328 fake_breakpoint_event (void)
1330 OUTMSG2(("fake_breakpoint_event\n"));
1332 faked_breakpoint
= 1;
1334 memset (¤t_event
, 0, sizeof (current_event
));
1335 current_event
.dwThreadId
= main_thread_id
;
1336 current_event
.dwDebugEventCode
= EXCEPTION_DEBUG_EVENT
;
1337 current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1338 = EXCEPTION_BREAKPOINT
;
1340 for_each_thread (suspend_one_thread
);
1345 auto_delete_breakpoint (CORE_ADDR stop_pc
)
1351 /* See nat/windows-nat.h. */
1354 windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD
*rec
)
1359 /* See nat/windows-nat.h. */
1362 windows_nat::handle_access_violation (const EXCEPTION_RECORD
*rec
)
1367 /* A helper function that will, if needed, set
1368 'stopped_at_software_breakpoint' on the thread and adjust the
1374 struct regcache
*regcache
= get_thread_regcache (current_thread
, 1);
1375 child_fetch_inferior_registers (regcache
, -1);
1377 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
1378 DONT_INVALIDATE_CONTEXT
);
1379 th
->stopped_at_software_breakpoint
= false;
1381 if (current_event
.dwDebugEventCode
== EXCEPTION_DEBUG_EVENT
1382 && ((current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1383 == EXCEPTION_BREAKPOINT
)
1384 || (current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1385 == STATUS_WX86_BREAKPOINT
))
1386 && child_initialization_done
)
1388 th
->stopped_at_software_breakpoint
= true;
1389 CORE_ADDR pc
= regcache_read_pc (regcache
);
1390 CORE_ADDR sw_breakpoint_pc
= pc
- the_low_target
.decr_pc_after_break
;
1391 regcache_write_pc (regcache
, sw_breakpoint_pc
);
1395 /* Get the next event from the child. */
1398 get_child_debug_event (DWORD
*continue_status
,
1399 struct target_waitstatus
*ourstatus
)
1403 last_sig
= GDB_SIGNAL_0
;
1404 ourstatus
->kind
= TARGET_WAITKIND_SPURIOUS
;
1405 *continue_status
= DBG_CONTINUE
;
1407 /* Check if GDB sent us an interrupt request. */
1408 check_remote_input_interrupt_request ();
1410 if (soft_interrupt_requested
)
1412 soft_interrupt_requested
= 0;
1413 fake_breakpoint_event ();
1422 /* WinCE doesn't set an initial breakpoint automatically. To
1423 stop the inferior, we flush all currently pending debug
1424 events -- the thread list and the dll list are always
1425 reported immediatelly without delay, then, we suspend all
1426 threads and pretend we saw a trap at the current PC of the
1429 Contrary to desktop Windows, Windows CE *does* report the dll
1430 names on LOAD_DLL_DEBUG_EVENTs resulting from a
1431 DebugActiveProcess call. This limits the way we can detect
1432 if all the dlls have already been reported. If we get a real
1433 debug event before leaving attaching, the worst that will
1434 happen is the user will see a spurious breakpoint. */
1436 current_event
.dwDebugEventCode
= 0;
1437 if (!wait_for_debug_event (¤t_event
, 0))
1439 OUTMSG2(("no attach events left\n"));
1440 fake_breakpoint_event ();
1444 OUTMSG2(("got attach event\n"));
1449 gdb::optional
<pending_stop
> stop
= fetch_pending_stop (debug_threads
);
1450 if (stop
.has_value ())
1452 *ourstatus
= stop
->status
;
1453 current_event
= stop
->event
;
1454 ptid
= debug_event_ptid (¤t_event
);
1455 current_thread
= find_thread_ptid (ptid
);
1459 /* Keep the wait time low enough for comfortable remote
1460 interruption, but high enough so gdbserver doesn't become a
1462 if (!wait_for_debug_event (¤t_event
, 250))
1464 DWORD e
= GetLastError();
1466 if (e
== ERROR_PIPE_NOT_CONNECTED
)
1468 /* This will happen if the loader fails to succesfully
1469 load the application, e.g., if the main executable
1470 tries to pull in a non-existing export from a
1472 ourstatus
->kind
= TARGET_WAITKIND_EXITED
;
1473 ourstatus
->value
.integer
= 1;
1483 switch (current_event
.dwDebugEventCode
)
1485 case CREATE_THREAD_DEBUG_EVENT
:
1486 OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT "
1487 "for pid=%u tid=%x)\n",
1488 (unsigned) current_event
.dwProcessId
,
1489 (unsigned) current_event
.dwThreadId
));
1491 /* Record the existence of this thread. */
1492 child_add_thread (current_event
.dwProcessId
,
1493 current_event
.dwThreadId
,
1494 current_event
.u
.CreateThread
.hThread
,
1495 current_event
.u
.CreateThread
.lpThreadLocalBase
);
1498 case EXIT_THREAD_DEBUG_EVENT
:
1499 OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT "
1500 "for pid=%u tid=%x\n",
1501 (unsigned) current_event
.dwProcessId
,
1502 (unsigned) current_event
.dwThreadId
));
1503 child_delete_thread (current_event
.dwProcessId
,
1504 current_event
.dwThreadId
);
1506 current_thread
= get_first_thread ();
1509 case CREATE_PROCESS_DEBUG_EVENT
:
1510 OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT "
1511 "for pid=%u tid=%x\n",
1512 (unsigned) current_event
.dwProcessId
,
1513 (unsigned) current_event
.dwThreadId
));
1514 CloseHandle (current_event
.u
.CreateProcessInfo
.hFile
);
1516 current_process_handle
= current_event
.u
.CreateProcessInfo
.hProcess
;
1517 main_thread_id
= current_event
.dwThreadId
;
1519 /* Add the main thread. */
1520 child_add_thread (current_event
.dwProcessId
,
1522 current_event
.u
.CreateProcessInfo
.hThread
,
1523 current_event
.u
.CreateProcessInfo
.lpThreadLocalBase
);
1528 /* Windows CE doesn't set the initial breakpoint
1529 automatically like the desktop versions of Windows do.
1530 We add it explicitly here. It will be removed as soon as
1532 set_breakpoint_at ((CORE_ADDR
) (long) current_event
.u
1533 .CreateProcessInfo
.lpStartAddress
,
1534 auto_delete_breakpoint
);
1539 case EXIT_PROCESS_DEBUG_EVENT
:
1540 OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT "
1541 "for pid=%u tid=%x\n",
1542 (unsigned) current_event
.dwProcessId
,
1543 (unsigned) current_event
.dwThreadId
));
1545 DWORD exit_status
= current_event
.u
.ExitProcess
.dwExitCode
;
1546 /* If the exit status looks like a fatal exception, but we
1547 don't recognize the exception's code, make the original
1548 exit status value available, to avoid losing information. */
1550 = WIFSIGNALED (exit_status
) ? WTERMSIG (exit_status
) : -1;
1551 if (exit_signal
== -1)
1553 ourstatus
->kind
= TARGET_WAITKIND_EXITED
;
1554 ourstatus
->value
.integer
= exit_status
;
1558 ourstatus
->kind
= TARGET_WAITKIND_SIGNALLED
;
1559 ourstatus
->value
.sig
= gdb_signal_from_host (exit_signal
);
1562 child_continue (DBG_CONTINUE
, desired_stop_thread_id
);
1563 CloseHandle (current_process_handle
);
1564 current_process_handle
= NULL
;
1567 case LOAD_DLL_DEBUG_EVENT
:
1568 OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT "
1569 "for pid=%u tid=%x\n",
1570 (unsigned) current_event
.dwProcessId
,
1571 (unsigned) current_event
.dwThreadId
));
1572 CloseHandle (current_event
.u
.LoadDll
.hFile
);
1573 if (! child_initialization_done
)
1577 ourstatus
->kind
= TARGET_WAITKIND_LOADED
;
1578 ourstatus
->value
.sig
= GDB_SIGNAL_TRAP
;
1581 case UNLOAD_DLL_DEBUG_EVENT
:
1582 OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT "
1583 "for pid=%u tid=%x\n",
1584 (unsigned) current_event
.dwProcessId
,
1585 (unsigned) current_event
.dwThreadId
));
1586 if (! child_initialization_done
)
1588 handle_unload_dll ();
1589 ourstatus
->kind
= TARGET_WAITKIND_LOADED
;
1590 ourstatus
->value
.sig
= GDB_SIGNAL_TRAP
;
1593 case EXCEPTION_DEBUG_EVENT
:
1594 OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT "
1595 "for pid=%u tid=%x\n",
1596 (unsigned) current_event
.dwProcessId
,
1597 (unsigned) current_event
.dwThreadId
));
1598 if (handle_exception (ourstatus
, debug_threads
)
1599 == HANDLE_EXCEPTION_UNHANDLED
)
1600 *continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1603 case OUTPUT_DEBUG_STRING_EVENT
:
1604 /* A message from the kernel (or Cygwin). */
1605 OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT "
1606 "for pid=%u tid=%x\n",
1607 (unsigned) current_event
.dwProcessId
,
1608 (unsigned) current_event
.dwThreadId
));
1609 handle_output_debug_string (nullptr);
1613 OUTMSG2 (("gdbserver: kernel event unknown "
1614 "for pid=%u tid=%x code=%x\n",
1615 (unsigned) current_event
.dwProcessId
,
1616 (unsigned) current_event
.dwThreadId
,
1617 (unsigned) current_event
.dwDebugEventCode
));
1621 ptid
= debug_event_ptid (¤t_event
);
1623 if (desired_stop_thread_id
!= -1 && desired_stop_thread_id
!= ptid
.lwp ())
1625 /* Pending stop. See the comment by the definition of
1626 "pending_stops" for details on why this is needed. */
1627 OUTMSG2 (("get_windows_debug_event - "
1628 "unexpected stop in 0x%lx (expecting 0x%x)\n",
1629 ptid
.lwp (), desired_stop_thread_id
));
1631 pending_stops
.push_back ({(DWORD
) ptid
.lwp (), *ourstatus
, current_event
});
1632 ourstatus
->kind
= TARGET_WAITKIND_SPURIOUS
;
1635 current_thread
= find_thread_ptid (ptid
);
1640 /* Wait for the inferior process to change state.
1641 STATUS will be filled in with a response code to send to GDB.
1642 Returns the signal which caused the process to stop. */
1644 win32_process_target::wait (ptid_t ptid
, target_waitstatus
*ourstatus
,
1647 if (cached_status
.kind
!= TARGET_WAITKIND_IGNORE
)
1649 /* The core always does a wait after creating the inferior, and
1650 do_initial_child_stuff already ran the inferior to the
1651 initial breakpoint (or an exit, if creating the process
1652 fails). Report it now. */
1653 *ourstatus
= cached_status
;
1654 cached_status
.kind
= TARGET_WAITKIND_IGNORE
;
1655 return debug_event_ptid (¤t_event
);
1660 DWORD continue_status
;
1661 if (!get_child_debug_event (&continue_status
, ourstatus
))
1664 switch (ourstatus
->kind
)
1666 case TARGET_WAITKIND_EXITED
:
1667 OUTMSG2 (("Child exited with retcode = %x\n",
1668 ourstatus
->value
.integer
));
1669 win32_clear_inferiors ();
1670 return ptid_t (current_event
.dwProcessId
);
1671 case TARGET_WAITKIND_STOPPED
:
1672 case TARGET_WAITKIND_SIGNALLED
:
1673 case TARGET_WAITKIND_LOADED
:
1675 OUTMSG2 (("Child Stopped with signal = %d \n",
1676 ourstatus
->value
.sig
));
1678 return debug_event_ptid (¤t_event
);
1681 OUTMSG (("Ignoring unknown internal event, %d\n", ourstatus
->kind
));
1683 case TARGET_WAITKIND_SPURIOUS
:
1684 /* do nothing, just continue */
1685 child_continue (continue_status
, desired_stop_thread_id
);
1691 /* Fetch registers from the inferior process.
1692 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */
1694 win32_process_target::fetch_registers (regcache
*regcache
, int regno
)
1696 child_fetch_inferior_registers (regcache
, regno
);
1699 /* Store registers to the inferior process.
1700 If REGNO is -1, store all registers; otherwise, store at least REGNO. */
1702 win32_process_target::store_registers (regcache
*regcache
, int regno
)
1704 child_store_inferior_registers (regcache
, regno
);
1707 /* Read memory from the inferior process. This should generally be
1708 called through read_inferior_memory, which handles breakpoint shadowing.
1709 Read LEN bytes at MEMADDR into a buffer at MYADDR. */
1711 win32_process_target::read_memory (CORE_ADDR memaddr
, unsigned char *myaddr
,
1714 return child_xfer_memory (memaddr
, (char *) myaddr
, len
, 0, 0) != len
;
1717 /* Write memory to the inferior process. This should generally be
1718 called through write_inferior_memory, which handles breakpoint shadowing.
1719 Write LEN bytes from the buffer at MYADDR to MEMADDR.
1720 Returns 0 on success and errno on failure. */
1722 win32_process_target::write_memory (CORE_ADDR memaddr
,
1723 const unsigned char *myaddr
, int len
)
1725 return child_xfer_memory (memaddr
, (char *) myaddr
, len
, 1, 0) != len
;
1728 /* Send an interrupt request to the inferior process. */
1730 win32_process_target::request_interrupt ()
1732 winapi_DebugBreakProcess DebugBreakProcess
;
1733 winapi_GenerateConsoleCtrlEvent GenerateConsoleCtrlEvent
;
1736 HMODULE dll
= GetModuleHandle (_T("COREDLL.DLL"));
1738 HMODULE dll
= GetModuleHandle (_T("KERNEL32.DLL"));
1741 GenerateConsoleCtrlEvent
= GETPROCADDRESS (dll
, GenerateConsoleCtrlEvent
);
1743 if (GenerateConsoleCtrlEvent
!= NULL
1744 && GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT
, current_process_id
))
1747 /* GenerateConsoleCtrlEvent can fail if process id being debugged is
1748 not a process group id.
1749 Fallback to XP/Vista 'DebugBreakProcess', which generates a
1750 breakpoint exception in the interior process. */
1752 DebugBreakProcess
= GETPROCADDRESS (dll
, DebugBreakProcess
);
1754 if (DebugBreakProcess
!= NULL
1755 && DebugBreakProcess (current_process_handle
))
1758 /* Last resort, suspend all threads manually. */
1759 soft_interrupt_requested
= 1;
1763 win32_process_target::supports_hardware_single_step ()
1770 win32_error_to_fileio_error (DWORD err
)
1774 case ERROR_BAD_PATHNAME
:
1775 case ERROR_FILE_NOT_FOUND
:
1776 case ERROR_INVALID_NAME
:
1777 case ERROR_PATH_NOT_FOUND
:
1778 return FILEIO_ENOENT
;
1780 case ERROR_IO_DEVICE
:
1781 case ERROR_OPEN_FAILED
:
1783 case ERROR_INVALID_HANDLE
:
1784 return FILEIO_EBADF
;
1785 case ERROR_ACCESS_DENIED
:
1786 case ERROR_SHARING_VIOLATION
:
1787 return FILEIO_EACCES
;
1788 case ERROR_NOACCESS
:
1789 return FILEIO_EFAULT
;
1791 return FILEIO_EBUSY
;
1792 case ERROR_ALREADY_EXISTS
:
1793 case ERROR_FILE_EXISTS
:
1794 return FILEIO_EEXIST
;
1795 case ERROR_BAD_DEVICE
:
1796 return FILEIO_ENODEV
;
1797 case ERROR_DIRECTORY
:
1798 return FILEIO_ENOTDIR
;
1799 case ERROR_FILENAME_EXCED_RANGE
:
1800 case ERROR_INVALID_DATA
:
1801 case ERROR_INVALID_PARAMETER
:
1802 case ERROR_NEGATIVE_SEEK
:
1803 return FILEIO_EINVAL
;
1804 case ERROR_TOO_MANY_OPEN_FILES
:
1805 return FILEIO_EMFILE
;
1806 case ERROR_HANDLE_DISK_FULL
:
1807 case ERROR_DISK_FULL
:
1808 return FILEIO_ENOSPC
;
1809 case ERROR_WRITE_PROTECT
:
1810 return FILEIO_EROFS
;
1811 case ERROR_NOT_SUPPORTED
:
1812 return FILEIO_ENOSYS
;
1815 return FILEIO_EUNKNOWN
;
1819 win32_process_target::hostio_last_error (char *buf
)
1821 DWORD winerr
= GetLastError ();
1822 int fileio_err
= win32_error_to_fileio_error (winerr
);
1823 sprintf (buf
, "F-1,%x", fileio_err
);
1828 win32_process_target::supports_qxfer_siginfo ()
1833 /* Write Windows signal info. */
1836 win32_process_target::qxfer_siginfo (const char *annex
,
1837 unsigned char *readbuf
,
1838 unsigned const char *writebuf
,
1839 CORE_ADDR offset
, int len
)
1841 if (siginfo_er
.ExceptionCode
== 0)
1844 if (readbuf
== nullptr)
1847 char *buf
= (char *) &siginfo_er
;
1848 size_t bufsize
= sizeof (siginfo_er
);
1851 EXCEPTION_RECORD32 er32
;
1854 buf
= (char *) &er32
;
1855 bufsize
= sizeof (er32
);
1857 er32
.ExceptionCode
= siginfo_er
.ExceptionCode
;
1858 er32
.ExceptionFlags
= siginfo_er
.ExceptionFlags
;
1859 er32
.ExceptionRecord
= (uintptr_t) siginfo_er
.ExceptionRecord
;
1860 er32
.ExceptionAddress
= (uintptr_t) siginfo_er
.ExceptionAddress
;
1861 er32
.NumberParameters
= siginfo_er
.NumberParameters
;
1863 for (i
= 0; i
< EXCEPTION_MAXIMUM_PARAMETERS
; i
++)
1864 er32
.ExceptionInformation
[i
] = siginfo_er
.ExceptionInformation
[i
];
1868 if (offset
> bufsize
)
1871 if (offset
+ len
> bufsize
)
1872 len
= bufsize
- offset
;
1874 memcpy (readbuf
, buf
+ offset
, len
);
1880 win32_process_target::supports_get_tib_address ()
1885 /* Write Windows OS Thread Information Block address. */
1888 win32_process_target::get_tib_address (ptid_t ptid
, CORE_ADDR
*addr
)
1890 windows_thread_info
*th
;
1891 th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
);
1895 *addr
= th
->thread_local_base
;
1899 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */
1902 win32_process_target::sw_breakpoint_from_kind (int kind
, int *size
)
1904 *size
= the_low_target
.breakpoint_len
;
1905 return the_low_target
.breakpoint
;
1909 win32_process_target::stopped_by_sw_breakpoint ()
1911 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
1912 DONT_INVALIDATE_CONTEXT
);
1913 return th
== nullptr ? false : th
->stopped_at_software_breakpoint
;
1917 win32_process_target::supports_stopped_by_sw_breakpoint ()
1923 win32_process_target::read_pc (struct regcache
*regcache
)
1925 return (*the_low_target
.get_pc
) (regcache
);
1929 win32_process_target::write_pc (struct regcache
*regcache
, CORE_ADDR pc
)
1931 return (*the_low_target
.set_pc
) (regcache
, pc
);
1934 /* The win32 target ops object. */
1936 static win32_process_target the_win32_target
;
1938 /* Initialize the Win32 backend. */
1940 initialize_low (void)
1942 set_target_ops (&the_win32_target
);
1943 the_low_target
.arch_setup ();
1946 /* These functions are loaded dynamically, because they are not available
1948 HMODULE dll
= GetModuleHandle (_T("KERNEL32.DLL"));
1949 win32_Wow64GetThreadContext
= GETPROCADDRESS (dll
, Wow64GetThreadContext
);
1950 win32_Wow64SetThreadContext
= GETPROCADDRESS (dll
, Wow64SetThreadContext
);