1 /* Low level interface to Windows debugging, for gdbserver. 2 Copyright (C) 2006-2020 Free Software Foundation, Inc. 3 4 Contributed by Leo Zayas. Based on "win32-nat.c" from GDB. 5 6 This file is part of GDB. 7 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. 12 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. 17 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/>. */ 20 21 #include "server.h" 22 #include "regcache.h" 23 #include "gdb/fileio.h" 24 #include "mem-break.h" 25 #include "win32-low.h" 26 #include "gdbthread.h" 27 #include "dll.h" 28 #include "hostio.h" 29 #include <windows.h> 30 #include <winnt.h> 31 #include <imagehlp.h> 32 #include <tlhelp32.h> 33 #include <psapi.h> 34 #include <process.h> 35 #include "gdbsupport/gdb_tilde_expand.h" 36 #include "gdbsupport/common-inferior.h" 37 #include "gdbsupport/gdb_wait.h" 38 39 using namespace windows_nat; 40 41 #ifndef USE_WIN32API 42 #include <sys/cygwin.h> 43 #endif 44 45 #define OUTMSG(X) do { printf X; fflush (stderr); } while (0) 46 47 #define OUTMSG2(X) \ 48 do \ 49 { \ 50 if (debug_threads) \ 51 { \ 52 printf X; \ 53 fflush (stderr); \ 54 } \ 55 } while (0) 56 57 #ifndef _T 58 #define _T(x) TEXT (x) 59 #endif 60 61 #ifndef COUNTOF 62 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0])) 63 #endif 64 65 #ifdef _WIN32_WCE 66 # define GETPROCADDRESS(DLL, PROC) \ 67 ((winapi_ ## PROC) GetProcAddress (DLL, TEXT (#PROC))) 68 #else 69 # define GETPROCADDRESS(DLL, PROC) \ 70 ((winapi_ ## PROC) GetProcAddress (DLL, #PROC)) 71 #endif 72 73 int using_threads = 1; 74 75 /* Globals. */ 76 static int attaching = 0; 77 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; 82 83 /* Non zero if an interrupt request is to be satisfied by suspending 84 all threads. */ 85 static int soft_interrupt_requested = 0; 86 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; 90 91 /* True if current_process_handle needs to be closed. */ 92 static bool open_process_used = false; 93 94 #ifdef __x86_64__ 95 bool wow64_process = false; 96 #endif 97 98 const struct target_desc *win32_tdesc; 99 #ifdef __x86_64__ 100 const struct target_desc *wow64_win32_tdesc; 101 #endif 102 103 #define NUM_REGS (the_low_target.num_regs ()) 104 105 typedef BOOL (WINAPI *winapi_DebugActiveProcessStop) (DWORD dwProcessId); 106 typedef BOOL (WINAPI *winapi_DebugSetProcessKillOnExit) (BOOL KillOnExit); 107 typedef BOOL (WINAPI *winapi_DebugBreakProcess) (HANDLE); 108 typedef BOOL (WINAPI *winapi_GenerateConsoleCtrlEvent) (DWORD, DWORD); 109 110 #ifdef __x86_64__ 111 typedef BOOL (WINAPI *winapi_Wow64SetThreadContext) (HANDLE, 112 const WOW64_CONTEXT *); 113 114 winapi_Wow64GetThreadContext win32_Wow64GetThreadContext; 115 static winapi_Wow64SetThreadContext win32_Wow64SetThreadContext; 116 #endif 117 118 #ifndef _WIN32_WCE 119 static void win32_add_all_dlls (void); 120 #endif 121 122 /* Get the thread ID from the current selected inferior (the current 123 thread). */ 124 static ptid_t 125 current_thread_ptid (void) 126 { 127 return current_ptid; 128 } 129 130 /* The current debug event from WaitForDebugEvent. */ 131 static ptid_t 132 debug_event_ptid (DEBUG_EVENT *event) 133 { 134 return ptid_t (event->dwProcessId, event->dwThreadId, 0); 135 } 136 137 /* Get the thread context of the thread associated with TH. */ 138 139 static void 140 win32_get_thread_context (windows_thread_info *th) 141 { 142 #ifdef __x86_64__ 143 if (wow64_process) 144 memset (&th->wow64_context, 0, sizeof (WOW64_CONTEXT)); 145 else 146 #endif 147 memset (&th->context, 0, sizeof (CONTEXT)); 148 (*the_low_target.get_thread_context) (th); 149 #ifdef _WIN32_WCE 150 memcpy (&th->base_context, &th->context, sizeof (CONTEXT)); 151 #endif 152 } 153 154 /* Set the thread context of the thread associated with TH. */ 155 156 static void 157 win32_set_thread_context (windows_thread_info *th) 158 { 159 #ifdef _WIN32_WCE 160 /* Calling SuspendThread on a thread that is running kernel code 161 will report that the suspending was successful, but in fact, that 162 will often not be true. In those cases, the context returned by 163 GetThreadContext will not be correct by the time the thread 164 stops, hence we can't set that context back into the thread when 165 resuming - it will most likely crash the inferior. 166 Unfortunately, there is no way to know when the thread will 167 really stop. To work around it, we'll only write the context 168 back to the thread when either the user or GDB explicitly change 169 it between stopping and resuming. */ 170 if (memcmp (&th->context, &th->base_context, sizeof (CONTEXT)) != 0) 171 #endif 172 { 173 #ifdef __x86_64__ 174 if (wow64_process) 175 win32_Wow64SetThreadContext (th->h, &th->wow64_context); 176 else 177 #endif 178 SetThreadContext (th->h, &th->context); 179 } 180 } 181 182 /* Set the thread context of the thread associated with TH. */ 183 184 static void 185 win32_prepare_to_resume (windows_thread_info *th) 186 { 187 if (the_low_target.prepare_to_resume != NULL) 188 (*the_low_target.prepare_to_resume) (th); 189 } 190 191 /* See win32-low.h. */ 192 193 void 194 win32_require_context (windows_thread_info *th) 195 { 196 DWORD context_flags; 197 #ifdef __x86_64__ 198 if (wow64_process) 199 context_flags = th->wow64_context.ContextFlags; 200 else 201 #endif 202 context_flags = th->context.ContextFlags; 203 if (context_flags == 0) 204 { 205 th->suspend (); 206 win32_get_thread_context (th); 207 } 208 } 209 210 /* See nat/windows-nat.h. */ 211 212 windows_thread_info * 213 windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition) 214 { 215 thread_info *thread = find_thread_ptid (ptid); 216 if (thread == NULL) 217 return NULL; 218 219 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread); 220 if (disposition != DONT_INVALIDATE_CONTEXT) 221 win32_require_context (th); 222 return th; 223 } 224 225 /* Add a thread to the thread list. */ 226 static windows_thread_info * 227 child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb) 228 { 229 windows_thread_info *th; 230 ptid_t ptid = ptid_t (pid, tid, 0); 231 232 if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) 233 return th; 234 235 CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb; 236 #ifdef __x86_64__ 237 /* For WOW64 processes, this is actually the pointer to the 64bit TIB, 238 and the 32bit TIB is exactly 2 pages after it. */ 239 if (wow64_process) 240 base += 2 * 4096; /* page size = 4096 */ 241 #endif 242 th = new windows_thread_info (tid, h, base); 243 244 add_thread (ptid, th); 245 246 if (the_low_target.thread_added != NULL) 247 (*the_low_target.thread_added) (th); 248 249 return th; 250 } 251 252 /* Delete a thread from the list of threads. */ 253 static void 254 delete_thread_info (thread_info *thread) 255 { 256 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread); 257 258 remove_thread (thread); 259 delete th; 260 } 261 262 /* Delete a thread from the list of threads. */ 263 static void 264 child_delete_thread (DWORD pid, DWORD tid) 265 { 266 /* If the last thread is exiting, just return. */ 267 if (all_threads.size () == 1) 268 return; 269 270 thread_info *thread = find_thread_ptid (ptid_t (pid, tid)); 271 if (thread == NULL) 272 return; 273 274 delete_thread_info (thread); 275 } 276 277 /* These watchpoint related wrapper functions simply pass on the function call 278 if the low target has registered a corresponding function. */ 279 280 bool 281 win32_process_target::supports_z_point_type (char z_type) 282 { 283 return (z_type == Z_PACKET_SW_BP 284 || (the_low_target.supports_z_point_type != NULL 285 && the_low_target.supports_z_point_type (z_type))); 286 } 287 288 int 289 win32_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr, 290 int size, raw_breakpoint *bp) 291 { 292 if (type == raw_bkpt_type_sw) 293 return insert_memory_breakpoint (bp); 294 else if (the_low_target.insert_point != NULL) 295 return the_low_target.insert_point (type, addr, size, bp); 296 else 297 /* Unsupported (see target.h). */ 298 return 1; 299 } 300 301 int 302 win32_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr, 303 int size, raw_breakpoint *bp) 304 { 305 if (type == raw_bkpt_type_sw) 306 return remove_memory_breakpoint (bp); 307 else if (the_low_target.remove_point != NULL) 308 return the_low_target.remove_point (type, addr, size, bp); 309 else 310 /* Unsupported (see target.h). */ 311 return 1; 312 } 313 314 bool 315 win32_process_target::stopped_by_watchpoint () 316 { 317 if (the_low_target.stopped_by_watchpoint != NULL) 318 return the_low_target.stopped_by_watchpoint (); 319 else 320 return false; 321 } 322 323 CORE_ADDR 324 win32_process_target::stopped_data_address () 325 { 326 if (the_low_target.stopped_data_address != NULL) 327 return the_low_target.stopped_data_address (); 328 else 329 return 0; 330 } 331 332 333 /* Transfer memory from/to the debugged process. */ 334 static int 335 child_xfer_memory (CORE_ADDR memaddr, char *our, int len, 336 int write, process_stratum_target *target) 337 { 338 BOOL success; 339 SIZE_T done = 0; 340 DWORD lasterror = 0; 341 uintptr_t addr = (uintptr_t) memaddr; 342 343 if (write) 344 { 345 success = WriteProcessMemory (current_process_handle, (LPVOID) addr, 346 (LPCVOID) our, len, &done); 347 if (!success) 348 lasterror = GetLastError (); 349 FlushInstructionCache (current_process_handle, (LPCVOID) addr, len); 350 } 351 else 352 { 353 success = ReadProcessMemory (current_process_handle, (LPCVOID) addr, 354 (LPVOID) our, len, &done); 355 if (!success) 356 lasterror = GetLastError (); 357 } 358 if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0) 359 return done; 360 else 361 return success ? done : -1; 362 } 363 364 /* Clear out any old thread list and reinitialize it to a pristine 365 state. */ 366 static void 367 child_init_thread_list (void) 368 { 369 for_each_thread (delete_thread_info); 370 } 371 372 /* Zero during the child initialization phase, and nonzero otherwise. */ 373 374 static int child_initialization_done = 0; 375 376 static void 377 do_initial_child_stuff (HANDLE proch, DWORD pid, int attached) 378 { 379 struct process_info *proc; 380 381 last_sig = GDB_SIGNAL_0; 382 383 current_process_handle = proch; 384 current_process_id = pid; 385 main_thread_id = 0; 386 387 soft_interrupt_requested = 0; 388 faked_breakpoint = 0; 389 open_process_used = true; 390 391 memset (¤t_event, 0, sizeof (current_event)); 392 393 #ifdef __x86_64__ 394 BOOL wow64; 395 if (!IsWow64Process (proch, &wow64)) 396 { 397 DWORD err = GetLastError (); 398 error ("Check if WOW64 process failed (error %d): %s\n", 399 (int) err, strwinerror (err)); 400 } 401 wow64_process = wow64; 402 403 if (wow64_process 404 && (win32_Wow64GetThreadContext == nullptr 405 || win32_Wow64SetThreadContext == nullptr)) 406 error ("WOW64 debugging is not supported on this system.\n"); 407 408 ignore_first_breakpoint = !attached && wow64_process; 409 #endif 410 411 proc = add_process (pid, attached); 412 #ifdef __x86_64__ 413 if (wow64_process) 414 proc->tdesc = wow64_win32_tdesc; 415 else 416 #endif 417 proc->tdesc = win32_tdesc; 418 child_init_thread_list (); 419 child_initialization_done = 0; 420 421 if (the_low_target.initial_stuff != NULL) 422 (*the_low_target.initial_stuff) (); 423 424 cached_status.kind = TARGET_WAITKIND_IGNORE; 425 426 /* Flush all currently pending debug events (thread and dll list) up 427 to the initial breakpoint. */ 428 while (1) 429 { 430 struct target_waitstatus status; 431 432 the_target->wait (minus_one_ptid, &status, 0); 433 434 /* Note win32_wait doesn't return thread events. */ 435 if (status.kind != TARGET_WAITKIND_LOADED) 436 { 437 cached_status = status; 438 break; 439 } 440 441 { 442 struct thread_resume resume; 443 444 resume.thread = minus_one_ptid; 445 resume.kind = resume_continue; 446 resume.sig = 0; 447 448 the_target->resume (&resume, 1); 449 } 450 } 451 452 #ifndef _WIN32_WCE 453 /* Now that the inferior has been started and all DLLs have been mapped, 454 we can iterate over all DLLs and load them in. 455 456 We avoid doing it any earlier because, on certain versions of Windows, 457 LOAD_DLL_DEBUG_EVENTs are sometimes not complete. In particular, 458 we have seen on Windows 8.1 that the ntdll.dll load event does not 459 include the DLL name, preventing us from creating an associated SO. 460 A possible explanation is that ntdll.dll might be mapped before 461 the SO info gets created by the Windows system -- ntdll.dll is 462 the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs 463 do not seem to suffer from that problem. 464 465 Rather than try to work around this sort of issue, it is much 466 simpler to just ignore DLL load/unload events during the startup 467 phase, and then process them all in one batch now. */ 468 win32_add_all_dlls (); 469 #endif 470 471 child_initialization_done = 1; 472 } 473 474 /* Resume all artificially suspended threads if we are continuing 475 execution. */ 476 static void 477 continue_one_thread (thread_info *thread, int thread_id) 478 { 479 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread); 480 481 if (thread_id == -1 || thread_id == th->tid) 482 { 483 win32_prepare_to_resume (th); 484 485 if (th->suspended) 486 { 487 DWORD *context_flags; 488 #ifdef __x86_64__ 489 if (wow64_process) 490 context_flags = &th->wow64_context.ContextFlags; 491 else 492 #endif 493 context_flags = &th->context.ContextFlags; 494 if (*context_flags) 495 { 496 win32_set_thread_context (th); 497 *context_flags = 0; 498 } 499 500 th->resume (); 501 } 502 } 503 } 504 505 static BOOL 506 child_continue (DWORD continue_status, int thread_id) 507 { 508 desired_stop_thread_id = thread_id; 509 if (matching_pending_stop (debug_threads)) 510 return TRUE; 511 512 /* The inferior will only continue after the ContinueDebugEvent 513 call. */ 514 for_each_thread ([&] (thread_info *thread) 515 { 516 continue_one_thread (thread, thread_id); 517 }); 518 faked_breakpoint = 0; 519 520 return continue_last_debug_event (continue_status, debug_threads); 521 } 522 523 /* Fetch register(s) from the current thread context. */ 524 static void 525 child_fetch_inferior_registers (struct regcache *regcache, int r) 526 { 527 int regno; 528 windows_thread_info *th = thread_rec (current_thread_ptid (), 529 INVALIDATE_CONTEXT); 530 if (r == -1 || r > NUM_REGS) 531 child_fetch_inferior_registers (regcache, NUM_REGS); 532 else 533 for (regno = 0; regno < r; regno++) 534 (*the_low_target.fetch_inferior_register) (regcache, th, regno); 535 } 536 537 /* Store a new register value into the current thread context. We don't 538 change the program's context until later, when we resume it. */ 539 static void 540 child_store_inferior_registers (struct regcache *regcache, int r) 541 { 542 int regno; 543 windows_thread_info *th = thread_rec (current_thread_ptid (), 544 INVALIDATE_CONTEXT); 545 if (r == -1 || r == 0 || r > NUM_REGS) 546 child_store_inferior_registers (regcache, NUM_REGS); 547 else 548 for (regno = 0; regno < r; regno++) 549 (*the_low_target.store_inferior_register) (regcache, th, regno); 550 } 551 552 /* Map the Windows error number in ERROR to a locale-dependent error 553 message string and return a pointer to it. Typically, the values 554 for ERROR come from GetLastError. 555 556 The string pointed to shall not be modified by the application, 557 but may be overwritten by a subsequent call to strwinerror 558 559 The strwinerror function does not change the current setting 560 of GetLastError. */ 561 562 char * 563 strwinerror (DWORD error) 564 { 565 static char buf[1024]; 566 TCHAR *msgbuf; 567 DWORD lasterr = GetLastError (); 568 DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM 569 | FORMAT_MESSAGE_ALLOCATE_BUFFER, 570 NULL, 571 error, 572 0, /* Default language */ 573 (LPTSTR) &msgbuf, 574 0, 575 NULL); 576 if (chars != 0) 577 { 578 /* If there is an \r\n appended, zap it. */ 579 if (chars >= 2 580 && msgbuf[chars - 2] == '\r' 581 && msgbuf[chars - 1] == '\n') 582 { 583 chars -= 2; 584 msgbuf[chars] = 0; 585 } 586 587 if (chars > ((COUNTOF (buf)) - 1)) 588 { 589 chars = COUNTOF (buf) - 1; 590 msgbuf [chars] = 0; 591 } 592 593 #ifdef UNICODE 594 wcstombs (buf, msgbuf, chars + 1); 595 #else 596 strncpy (buf, msgbuf, chars + 1); 597 #endif 598 LocalFree (msgbuf); 599 } 600 else 601 sprintf (buf, "unknown win32 error (%u)", (unsigned) error); 602 603 SetLastError (lasterr); 604 return buf; 605 } 606 607 static BOOL 608 create_process (const char *program, char *args, 609 DWORD flags, PROCESS_INFORMATION *pi) 610 { 611 const char *inferior_cwd = get_inferior_cwd (); 612 BOOL ret; 613 size_t argslen, proglen; 614 615 proglen = strlen (program) + 1; 616 argslen = strlen (args) + proglen; 617 618 #ifdef _WIN32_WCE 619 wchar_t *p, *wprogram, *wargs, *wcwd = NULL; 620 621 wprogram = (wchar_t *) alloca (proglen * sizeof (wchar_t)); 622 mbstowcs (wprogram, program, proglen); 623 624 for (p = wprogram; *p; ++p) 625 if (L'/' == *p) 626 *p = L'\\'; 627 628 wargs = alloca ((argslen + 1) * sizeof (wchar_t)); 629 wcscpy (wargs, wprogram); 630 wcscat (wargs, L" "); 631 mbstowcs (wargs + proglen, args, argslen + 1 - proglen); 632 633 if (inferior_cwd != NULL) 634 { 635 std::string expanded_infcwd = gdb_tilde_expand (inferior_cwd); 636 std::replace (expanded_infcwd.begin (), expanded_infcwd.end (), 637 '/', '\\'); 638 wcwd = alloca ((expanded_infcwd.size () + 1) * sizeof (wchar_t)); 639 if (mbstowcs (wcwd, expanded_infcwd.c_str (), 640 expanded_infcwd.size () + 1) == NULL) 641 { 642 error (_("\ 643 Could not convert the expanded inferior cwd to wide-char.")); 644 } 645 } 646 647 ret = CreateProcessW (wprogram, /* image name */ 648 wargs, /* command line */ 649 NULL, /* security, not supported */ 650 NULL, /* thread, not supported */ 651 FALSE, /* inherit handles, not supported */ 652 flags, /* start flags */ 653 NULL, /* environment, not supported */ 654 wcwd, /* current directory */ 655 NULL, /* start info, not supported */ 656 pi); /* proc info */ 657 #else 658 STARTUPINFOA si = { sizeof (STARTUPINFOA) }; 659 char *program_and_args = (char *) alloca (argslen + 1); 660 661 strcpy (program_and_args, program); 662 strcat (program_and_args, " "); 663 strcat (program_and_args, args); 664 ret = CreateProcessA (program, /* image name */ 665 program_and_args, /* command line */ 666 NULL, /* security */ 667 NULL, /* thread */ 668 TRUE, /* inherit handles */ 669 flags, /* start flags */ 670 NULL, /* environment */ 671 /* current directory */ 672 (inferior_cwd == NULL 673 ? NULL 674 : gdb_tilde_expand (inferior_cwd).c_str()), 675 &si, /* start info */ 676 pi); /* proc info */ 677 #endif 678 679 return ret; 680 } 681 682 /* Start a new process. 683 PROGRAM is the program name. 684 PROGRAM_ARGS is the vector containing the inferior's args. 685 Returns the new PID on success, -1 on failure. Registers the new 686 process with the process list. */ 687 int 688 win32_process_target::create_inferior (const char *program, 689 const std::vector<char *> &program_args) 690 { 691 client_state &cs = get_client_state (); 692 #ifndef USE_WIN32API 693 char real_path[PATH_MAX]; 694 char *orig_path, *new_path, *path_ptr; 695 #endif 696 BOOL ret; 697 DWORD flags; 698 PROCESS_INFORMATION pi; 699 DWORD err; 700 std::string str_program_args = construct_inferior_arguments (program_args); 701 char *args = (char *) str_program_args.c_str (); 702 703 /* win32_wait needs to know we're not attaching. */ 704 attaching = 0; 705 706 if (!program) 707 error ("No executable specified, specify executable to debug.\n"); 708 709 flags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS; 710 711 #ifndef USE_WIN32API 712 orig_path = NULL; 713 path_ptr = getenv ("PATH"); 714 if (path_ptr) 715 { 716 int size = cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, NULL, 0); 717 orig_path = (char *) alloca (strlen (path_ptr) + 1); 718 new_path = (char *) alloca (size); 719 strcpy (orig_path, path_ptr); 720 cygwin_conv_path_list (CCP_POSIX_TO_WIN_A, path_ptr, new_path, size); 721 setenv ("PATH", new_path, 1); 722 } 723 cygwin_conv_path (CCP_POSIX_TO_WIN_A, program, real_path, PATH_MAX); 724 program = real_path; 725 #endif 726 727 OUTMSG2 (("Command line is \"%s %s\"\n", program, args)); 728 729 #ifdef CREATE_NEW_PROCESS_GROUP 730 flags |= CREATE_NEW_PROCESS_GROUP; 731 #endif 732 733 ret = create_process (program, args, flags, &pi); 734 err = GetLastError (); 735 if (!ret && err == ERROR_FILE_NOT_FOUND) 736 { 737 char *exename = (char *) alloca (strlen (program) + 5); 738 strcat (strcpy (exename, program), ".exe"); 739 ret = create_process (exename, args, flags, &pi); 740 err = GetLastError (); 741 } 742 743 #ifndef USE_WIN32API 744 if (orig_path) 745 setenv ("PATH", orig_path, 1); 746 #endif 747 748 if (!ret) 749 { 750 error ("Error creating process \"%s %s\", (error %d): %s\n", 751 program, args, (int) err, strwinerror (err)); 752 } 753 else 754 { 755 OUTMSG2 (("Process created: %s %s\n", program, (char *) args)); 756 } 757 758 #ifndef _WIN32_WCE 759 /* On Windows CE this handle can't be closed. The OS reuses 760 it in the debug events, while the 9x/NT versions of Windows 761 probably use a DuplicateHandle'd one. */ 762 CloseHandle (pi.hThread); 763 #endif 764 765 do_initial_child_stuff (pi.hProcess, pi.dwProcessId, 0); 766 767 /* Wait till we are at 1st instruction in program, return new pid 768 (assuming success). */ 769 cs.last_ptid = wait (ptid_t (current_process_id), &cs.last_status, 0); 770 771 /* Necessary for handle_v_kill. */ 772 signal_pid = current_process_id; 773 774 return current_process_id; 775 } 776 777 /* Attach to a running process. 778 PID is the process ID to attach to, specified by the user 779 or a higher layer. */ 780 int 781 win32_process_target::attach (unsigned long pid) 782 { 783 HANDLE h; 784 winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL; 785 DWORD err; 786 #ifdef _WIN32_WCE 787 HMODULE dll = GetModuleHandle (_T("COREDLL.DLL")); 788 #else 789 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL")); 790 #endif 791 DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit); 792 793 h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); 794 if (h != NULL) 795 { 796 if (DebugActiveProcess (pid)) 797 { 798 if (DebugSetProcessKillOnExit != NULL) 799 DebugSetProcessKillOnExit (FALSE); 800 801 /* win32_wait needs to know we're attaching. */ 802 attaching = 1; 803 do_initial_child_stuff (h, pid, 1); 804 return 0; 805 } 806 807 CloseHandle (h); 808 } 809 810 err = GetLastError (); 811 error ("Attach to process failed (error %d): %s\n", 812 (int) err, strwinerror (err)); 813 } 814 815 /* See nat/windows-nat.h. */ 816 817 int 818 windows_nat::handle_output_debug_string (struct target_waitstatus *ourstatus) 819 { 820 #define READ_BUFFER_LEN 1024 821 CORE_ADDR addr; 822 char s[READ_BUFFER_LEN + 1] = { 0 }; 823 DWORD nbytes = current_event.u.DebugString.nDebugStringLength; 824 825 if (nbytes == 0) 826 return 0; 827 828 if (nbytes > READ_BUFFER_LEN) 829 nbytes = READ_BUFFER_LEN; 830 831 addr = (CORE_ADDR) (size_t) current_event.u.DebugString.lpDebugStringData; 832 833 if (current_event.u.DebugString.fUnicode) 834 { 835 /* The event tells us how many bytes, not chars, even 836 in Unicode. */ 837 WCHAR buffer[(READ_BUFFER_LEN + 1) / sizeof (WCHAR)] = { 0 }; 838 if (read_inferior_memory (addr, (unsigned char *) buffer, nbytes) != 0) 839 return 0; 840 wcstombs (s, buffer, (nbytes + 1) / sizeof (WCHAR)); 841 } 842 else 843 { 844 if (read_inferior_memory (addr, (unsigned char *) s, nbytes) != 0) 845 return 0; 846 } 847 848 if (!startswith (s, "cYg")) 849 { 850 if (!server_waiting) 851 { 852 OUTMSG2(("%s", s)); 853 return 0; 854 } 855 856 monitor_output (s); 857 } 858 #undef READ_BUFFER_LEN 859 860 return 0; 861 } 862 863 static void 864 win32_clear_inferiors (void) 865 { 866 if (open_process_used) 867 { 868 CloseHandle (current_process_handle); 869 open_process_used = false; 870 } 871 872 for_each_thread (delete_thread_info); 873 siginfo_er.ExceptionCode = 0; 874 clear_inferiors (); 875 } 876 877 /* Implementation of target_ops::kill. */ 878 879 int 880 win32_process_target::kill (process_info *process) 881 { 882 TerminateProcess (current_process_handle, 0); 883 for (;;) 884 { 885 if (!child_continue (DBG_CONTINUE, -1)) 886 break; 887 if (!wait_for_debug_event (¤t_event, INFINITE)) 888 break; 889 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) 890 break; 891 else if (current_event.dwDebugEventCode == OUTPUT_DEBUG_STRING_EVENT) 892 handle_output_debug_string (nullptr); 893 } 894 895 win32_clear_inferiors (); 896 897 remove_process (process); 898 return 0; 899 } 900 901 /* Implementation of target_ops::detach. */ 902 903 int 904 win32_process_target::detach (process_info *process) 905 { 906 winapi_DebugActiveProcessStop DebugActiveProcessStop = NULL; 907 winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL; 908 #ifdef _WIN32_WCE 909 HMODULE dll = GetModuleHandle (_T("COREDLL.DLL")); 910 #else 911 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL")); 912 #endif 913 DebugActiveProcessStop = GETPROCADDRESS (dll, DebugActiveProcessStop); 914 DebugSetProcessKillOnExit = GETPROCADDRESS (dll, DebugSetProcessKillOnExit); 915 916 if (DebugSetProcessKillOnExit == NULL 917 || DebugActiveProcessStop == NULL) 918 return -1; 919 920 { 921 struct thread_resume resume; 922 resume.thread = minus_one_ptid; 923 resume.kind = resume_continue; 924 resume.sig = 0; 925 this->resume (&resume, 1); 926 } 927 928 if (!DebugActiveProcessStop (current_process_id)) 929 return -1; 930 931 DebugSetProcessKillOnExit (FALSE); 932 remove_process (process); 933 934 win32_clear_inferiors (); 935 return 0; 936 } 937 938 void 939 win32_process_target::mourn (struct process_info *process) 940 { 941 remove_process (process); 942 } 943 944 /* Implementation of target_ops::join. */ 945 946 void 947 win32_process_target::join (int pid) 948 { 949 HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); 950 if (h != NULL) 951 { 952 WaitForSingleObject (h, INFINITE); 953 CloseHandle (h); 954 } 955 } 956 957 /* Return true iff the thread with thread ID TID is alive. */ 958 bool 959 win32_process_target::thread_alive (ptid_t ptid) 960 { 961 /* Our thread list is reliable; don't bother to poll target 962 threads. */ 963 return find_thread_ptid (ptid) != NULL; 964 } 965 966 /* Resume the inferior process. RESUME_INFO describes how we want 967 to resume. */ 968 void 969 win32_process_target::resume (thread_resume *resume_info, size_t n) 970 { 971 DWORD tid; 972 enum gdb_signal sig; 973 int step; 974 windows_thread_info *th; 975 DWORD continue_status = DBG_CONTINUE; 976 ptid_t ptid; 977 978 /* This handles the very limited set of resume packets that GDB can 979 currently produce. */ 980 981 if (n == 1 && resume_info[0].thread == minus_one_ptid) 982 tid = -1; 983 else if (n > 1) 984 tid = -1; 985 else 986 /* Yes, we're ignoring resume_info[0].thread. It'd be tricky to make 987 the Windows resume code do the right thing for thread switching. */ 988 tid = current_event.dwThreadId; 989 990 if (resume_info[0].thread != minus_one_ptid) 991 { 992 sig = gdb_signal_from_host (resume_info[0].sig); 993 step = resume_info[0].kind == resume_step; 994 } 995 else 996 { 997 sig = GDB_SIGNAL_0; 998 step = 0; 999 } 1000 1001 if (sig != GDB_SIGNAL_0) 1002 { 1003 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT) 1004 { 1005 OUTMSG (("Cannot continue with signal %s here.\n", 1006 gdb_signal_to_string (sig))); 1007 } 1008 else if (sig == last_sig) 1009 continue_status = DBG_EXCEPTION_NOT_HANDLED; 1010 else 1011 OUTMSG (("Can only continue with received signal %s.\n", 1012 gdb_signal_to_string (last_sig))); 1013 } 1014 1015 last_sig = GDB_SIGNAL_0; 1016 1017 /* Get context for the currently selected thread. */ 1018 ptid = debug_event_ptid (¤t_event); 1019 th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT); 1020 if (th) 1021 { 1022 win32_prepare_to_resume (th); 1023 1024 DWORD *context_flags; 1025 #ifdef __x86_64__ 1026 if (wow64_process) 1027 context_flags = &th->wow64_context.ContextFlags; 1028 else 1029 #endif 1030 context_flags = &th->context.ContextFlags; 1031 if (*context_flags) 1032 { 1033 /* Move register values from the inferior into the thread 1034 context structure. */ 1035 regcache_invalidate (); 1036 1037 if (step) 1038 { 1039 if (the_low_target.single_step != NULL) 1040 (*the_low_target.single_step) (th); 1041 else 1042 error ("Single stepping is not supported " 1043 "in this configuration.\n"); 1044 } 1045 1046 win32_set_thread_context (th); 1047 *context_flags = 0; 1048 } 1049 } 1050 1051 /* Allow continuing with the same signal that interrupted us. 1052 Otherwise complain. */ 1053 1054 child_continue (continue_status, tid); 1055 } 1056 1057 static void 1058 win32_add_one_solib (const char *name, CORE_ADDR load_addr) 1059 { 1060 char buf[MAX_PATH + 1]; 1061 char buf2[MAX_PATH + 1]; 1062 1063 #ifdef _WIN32_WCE 1064 WIN32_FIND_DATA w32_fd; 1065 WCHAR wname[MAX_PATH + 1]; 1066 mbstowcs (wname, name, MAX_PATH); 1067 HANDLE h = FindFirstFile (wname, &w32_fd); 1068 #else 1069 WIN32_FIND_DATAA w32_fd; 1070 HANDLE h = FindFirstFileA (name, &w32_fd); 1071 #endif 1072 1073 /* The symbols in a dll are offset by 0x1000, which is the 1074 offset from 0 of the first byte in an image - because 1075 of the file header and the section alignment. */ 1076 load_addr += 0x1000; 1077 1078 if (h == INVALID_HANDLE_VALUE) 1079 strcpy (buf, name); 1080 else 1081 { 1082 FindClose (h); 1083 strcpy (buf, name); 1084 #ifndef _WIN32_WCE 1085 { 1086 char cwd[MAX_PATH + 1]; 1087 char *p; 1088 if (GetCurrentDirectoryA (MAX_PATH + 1, cwd)) 1089 { 1090 p = strrchr (buf, '\\'); 1091 if (p) 1092 p[1] = '\0'; 1093 SetCurrentDirectoryA (buf); 1094 GetFullPathNameA (w32_fd.cFileName, MAX_PATH, buf, &p); 1095 SetCurrentDirectoryA (cwd); 1096 } 1097 } 1098 #endif 1099 } 1100 1101 #ifndef _WIN32_WCE 1102 if (strcasecmp (buf, "ntdll.dll") == 0) 1103 { 1104 GetSystemDirectoryA (buf, sizeof (buf)); 1105 strcat (buf, "\\ntdll.dll"); 1106 } 1107 #endif 1108 1109 #ifdef __CYGWIN__ 1110 cygwin_conv_path (CCP_WIN_A_TO_POSIX, buf, buf2, sizeof (buf2)); 1111 #else 1112 strcpy (buf2, buf); 1113 #endif 1114 1115 loaded_dll (buf2, load_addr); 1116 } 1117 1118 typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *, 1119 DWORD, LPDWORD); 1120 #ifdef __x86_64__ 1121 typedef BOOL (WINAPI *winapi_EnumProcessModulesEx) (HANDLE, HMODULE *, DWORD, 1122 LPDWORD, DWORD); 1123 #endif 1124 typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE, 1125 LPMODULEINFO, DWORD); 1126 typedef DWORD (WINAPI *winapi_GetModuleFileNameExA) (HANDLE, HMODULE, 1127 LPSTR, DWORD); 1128 1129 static winapi_EnumProcessModules win32_EnumProcessModules; 1130 #ifdef __x86_64__ 1131 static winapi_EnumProcessModulesEx win32_EnumProcessModulesEx; 1132 #endif 1133 static winapi_GetModuleInformation win32_GetModuleInformation; 1134 static winapi_GetModuleFileNameExA win32_GetModuleFileNameExA; 1135 1136 static BOOL 1137 load_psapi (void) 1138 { 1139 static int psapi_loaded = 0; 1140 static HMODULE dll = NULL; 1141 1142 if (!psapi_loaded) 1143 { 1144 psapi_loaded = 1; 1145 dll = LoadLibrary (TEXT("psapi.dll")); 1146 if (!dll) 1147 return FALSE; 1148 win32_EnumProcessModules = 1149 GETPROCADDRESS (dll, EnumProcessModules); 1150 #ifdef __x86_64__ 1151 win32_EnumProcessModulesEx = 1152 GETPROCADDRESS (dll, EnumProcessModulesEx); 1153 #endif 1154 win32_GetModuleInformation = 1155 GETPROCADDRESS (dll, GetModuleInformation); 1156 win32_GetModuleFileNameExA = 1157 GETPROCADDRESS (dll, GetModuleFileNameExA); 1158 } 1159 1160 #ifdef __x86_64__ 1161 if (wow64_process && win32_EnumProcessModulesEx == nullptr) 1162 return FALSE; 1163 #endif 1164 1165 return (win32_EnumProcessModules != NULL 1166 && win32_GetModuleInformation != NULL 1167 && win32_GetModuleFileNameExA != NULL); 1168 } 1169 1170 #ifndef _WIN32_WCE 1171 1172 /* Iterate over all DLLs currently mapped by our inferior, and 1173 add them to our list of solibs. */ 1174 1175 static void 1176 win32_add_all_dlls (void) 1177 { 1178 size_t i; 1179 HMODULE dh_buf[1]; 1180 HMODULE *DllHandle = dh_buf; 1181 DWORD cbNeeded; 1182 BOOL ok; 1183 1184 if (!load_psapi ()) 1185 return; 1186 1187 cbNeeded = 0; 1188 #ifdef __x86_64__ 1189 if (wow64_process) 1190 ok = (*win32_EnumProcessModulesEx) (current_process_handle, 1191 DllHandle, 1192 sizeof (HMODULE), 1193 &cbNeeded, 1194 LIST_MODULES_32BIT); 1195 else 1196 #endif 1197 ok = (*win32_EnumProcessModules) (current_process_handle, 1198 DllHandle, 1199 sizeof (HMODULE), 1200 &cbNeeded); 1201 1202 if (!ok || !cbNeeded) 1203 return; 1204 1205 DllHandle = (HMODULE *) alloca (cbNeeded); 1206 if (!DllHandle) 1207 return; 1208 1209 #ifdef __x86_64__ 1210 if (wow64_process) 1211 ok = (*win32_EnumProcessModulesEx) (current_process_handle, 1212 DllHandle, 1213 cbNeeded, 1214 &cbNeeded, 1215 LIST_MODULES_32BIT); 1216 else 1217 #endif 1218 ok = (*win32_EnumProcessModules) (current_process_handle, 1219 DllHandle, 1220 cbNeeded, 1221 &cbNeeded); 1222 if (!ok) 1223 return; 1224 1225 char system_dir[MAX_PATH]; 1226 char syswow_dir[MAX_PATH]; 1227 size_t system_dir_len = 0; 1228 bool convert_syswow_dir = false; 1229 #ifdef __x86_64__ 1230 if (wow64_process) 1231 #endif 1232 { 1233 /* This fails on 32bit Windows because it has no SysWOW64 directory, 1234 and in this case a path conversion isn't necessary. */ 1235 UINT len = GetSystemWow64DirectoryA (syswow_dir, sizeof (syswow_dir)); 1236 if (len > 0) 1237 { 1238 /* Check that we have passed a large enough buffer. */ 1239 gdb_assert (len < sizeof (syswow_dir)); 1240 1241 len = GetSystemDirectoryA (system_dir, sizeof (system_dir)); 1242 /* Error check. */ 1243 gdb_assert (len != 0); 1244 /* Check that we have passed a large enough buffer. */ 1245 gdb_assert (len < sizeof (system_dir)); 1246 1247 strcat (system_dir, "\\"); 1248 strcat (syswow_dir, "\\"); 1249 system_dir_len = strlen (system_dir); 1250 1251 convert_syswow_dir = true; 1252 } 1253 1254 } 1255 1256 for (i = 1; i < ((size_t) cbNeeded / sizeof (HMODULE)); i++) 1257 { 1258 MODULEINFO mi; 1259 char dll_name[MAX_PATH]; 1260 1261 if (!(*win32_GetModuleInformation) (current_process_handle, 1262 DllHandle[i], 1263 &mi, 1264 sizeof (mi))) 1265 continue; 1266 if ((*win32_GetModuleFileNameExA) (current_process_handle, 1267 DllHandle[i], 1268 dll_name, 1269 MAX_PATH) == 0) 1270 continue; 1271 1272 const char *name = dll_name; 1273 /* Convert the DLL path of 32bit processes returned by 1274 GetModuleFileNameEx from the 64bit system directory to the 1275 32bit syswow64 directory if necessary. */ 1276 std::string syswow_dll_path; 1277 if (convert_syswow_dir 1278 && strncasecmp (dll_name, system_dir, system_dir_len) == 0 1279 && strchr (dll_name + system_dir_len, '\\') == nullptr) 1280 { 1281 syswow_dll_path = syswow_dir; 1282 syswow_dll_path += dll_name + system_dir_len; 1283 name = syswow_dll_path.c_str(); 1284 } 1285 1286 win32_add_one_solib (name, (CORE_ADDR) (uintptr_t) mi.lpBaseOfDll); 1287 } 1288 } 1289 #endif 1290 1291 typedef HANDLE (WINAPI *winapi_CreateToolhelp32Snapshot) (DWORD, DWORD); 1292 typedef BOOL (WINAPI *winapi_Module32First) (HANDLE, LPMODULEENTRY32); 1293 typedef BOOL (WINAPI *winapi_Module32Next) (HANDLE, LPMODULEENTRY32); 1294 1295 /* See nat/windows-nat.h. */ 1296 1297 void 1298 windows_nat::handle_load_dll () 1299 { 1300 LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll; 1301 const char *dll_name; 1302 1303 dll_name = get_image_name (current_process_handle, 1304 event->lpImageName, event->fUnicode); 1305 if (!dll_name) 1306 return; 1307 1308 win32_add_one_solib (dll_name, (CORE_ADDR) (uintptr_t) event->lpBaseOfDll); 1309 } 1310 1311 /* See nat/windows-nat.h. */ 1312 1313 void 1314 windows_nat::handle_unload_dll () 1315 { 1316 CORE_ADDR load_addr = 1317 (CORE_ADDR) (uintptr_t) current_event.u.UnloadDll.lpBaseOfDll; 1318 1319 /* The symbols in a dll are offset by 0x1000, which is the 1320 offset from 0 of the first byte in an image - because 1321 of the file header and the section alignment. */ 1322 load_addr += 0x1000; 1323 unloaded_dll (NULL, load_addr); 1324 } 1325 1326 static void 1327 suspend_one_thread (thread_info *thread) 1328 { 1329 windows_thread_info *th = (windows_thread_info *) thread_target_data (thread); 1330 1331 th->suspend (); 1332 } 1333 1334 static void 1335 fake_breakpoint_event (void) 1336 { 1337 OUTMSG2(("fake_breakpoint_event\n")); 1338 1339 faked_breakpoint = 1; 1340 1341 memset (¤t_event, 0, sizeof (current_event)); 1342 current_event.dwThreadId = main_thread_id; 1343 current_event.dwDebugEventCode = EXCEPTION_DEBUG_EVENT; 1344 current_event.u.Exception.ExceptionRecord.ExceptionCode 1345 = EXCEPTION_BREAKPOINT; 1346 1347 for_each_thread (suspend_one_thread); 1348 } 1349 1350 #ifdef _WIN32_WCE 1351 static int 1352 auto_delete_breakpoint (CORE_ADDR stop_pc) 1353 { 1354 return 1; 1355 } 1356 #endif 1357 1358 /* See nat/windows-nat.h. */ 1359 1360 bool 1361 windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) 1362 { 1363 return false; 1364 } 1365 1366 /* See nat/windows-nat.h. */ 1367 1368 bool 1369 windows_nat::handle_access_violation (const EXCEPTION_RECORD *rec) 1370 { 1371 return false; 1372 } 1373 1374 /* A helper function that will, if needed, set 1375 'stopped_at_software_breakpoint' on the thread and adjust the 1376 PC. */ 1377 1378 static void 1379 maybe_adjust_pc () 1380 { 1381 struct regcache *regcache = get_thread_regcache (current_thread, 1); 1382 child_fetch_inferior_registers (regcache, -1); 1383 1384 windows_thread_info *th = thread_rec (current_thread_ptid (), 1385 DONT_INVALIDATE_CONTEXT); 1386 th->stopped_at_software_breakpoint = false; 1387 1388 if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT 1389 && ((current_event.u.Exception.ExceptionRecord.ExceptionCode 1390 == EXCEPTION_BREAKPOINT) 1391 || (current_event.u.Exception.ExceptionRecord.ExceptionCode 1392 == STATUS_WX86_BREAKPOINT)) 1393 && child_initialization_done) 1394 { 1395 th->stopped_at_software_breakpoint = true; 1396 CORE_ADDR pc = regcache_read_pc (regcache); 1397 CORE_ADDR sw_breakpoint_pc = pc - the_low_target.decr_pc_after_break; 1398 regcache_write_pc (regcache, sw_breakpoint_pc); 1399 } 1400 } 1401 1402 /* Get the next event from the child. */ 1403 1404 static int 1405 get_child_debug_event (DWORD *continue_status, 1406 struct target_waitstatus *ourstatus) 1407 { 1408 ptid_t ptid; 1409 1410 last_sig = GDB_SIGNAL_0; 1411 ourstatus->kind = TARGET_WAITKIND_SPURIOUS; 1412 *continue_status = DBG_CONTINUE; 1413 1414 /* Check if GDB sent us an interrupt request. */ 1415 check_remote_input_interrupt_request (); 1416 1417 if (soft_interrupt_requested) 1418 { 1419 soft_interrupt_requested = 0; 1420 fake_breakpoint_event (); 1421 goto gotevent; 1422 } 1423 1424 attaching = 0; 1425 { 1426 gdb::optional<pending_stop> stop = fetch_pending_stop (debug_threads); 1427 if (stop.has_value ()) 1428 { 1429 *ourstatus = stop->status; 1430 current_event = stop->event; 1431 ptid = debug_event_ptid (¤t_event); 1432 current_thread = find_thread_ptid (ptid); 1433 return 1; 1434 } 1435 1436 /* Keep the wait time low enough for comfortable remote 1437 interruption, but high enough so gdbserver doesn't become a 1438 bottleneck. */ 1439 if (!wait_for_debug_event (¤t_event, 250)) 1440 { 1441 DWORD e = GetLastError(); 1442 1443 if (e == ERROR_PIPE_NOT_CONNECTED) 1444 { 1445 /* This will happen if the loader fails to succesfully 1446 load the application, e.g., if the main executable 1447 tries to pull in a non-existing export from a 1448 DLL. */ 1449 ourstatus->kind = TARGET_WAITKIND_EXITED; 1450 ourstatus->value.integer = 1; 1451 return 1; 1452 } 1453 1454 return 0; 1455 } 1456 } 1457 1458 gotevent: 1459 1460 switch (current_event.dwDebugEventCode) 1461 { 1462 case CREATE_THREAD_DEBUG_EVENT: 1463 OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT " 1464 "for pid=%u tid=%x)\n", 1465 (unsigned) current_event.dwProcessId, 1466 (unsigned) current_event.dwThreadId)); 1467 1468 /* Record the existence of this thread. */ 1469 child_add_thread (current_event.dwProcessId, 1470 current_event.dwThreadId, 1471 current_event.u.CreateThread.hThread, 1472 current_event.u.CreateThread.lpThreadLocalBase); 1473 break; 1474 1475 case EXIT_THREAD_DEBUG_EVENT: 1476 OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT " 1477 "for pid=%u tid=%x\n", 1478 (unsigned) current_event.dwProcessId, 1479 (unsigned) current_event.dwThreadId)); 1480 child_delete_thread (current_event.dwProcessId, 1481 current_event.dwThreadId); 1482 1483 current_thread = get_first_thread (); 1484 return 1; 1485 1486 case CREATE_PROCESS_DEBUG_EVENT: 1487 OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT " 1488 "for pid=%u tid=%x\n", 1489 (unsigned) current_event.dwProcessId, 1490 (unsigned) current_event.dwThreadId)); 1491 CloseHandle (current_event.u.CreateProcessInfo.hFile); 1492 1493 if (open_process_used) 1494 { 1495 CloseHandle (current_process_handle); 1496 open_process_used = false; 1497 } 1498 1499 current_process_handle = current_event.u.CreateProcessInfo.hProcess; 1500 main_thread_id = current_event.dwThreadId; 1501 1502 /* Add the main thread. */ 1503 child_add_thread (current_event.dwProcessId, 1504 main_thread_id, 1505 current_event.u.CreateProcessInfo.hThread, 1506 current_event.u.CreateProcessInfo.lpThreadLocalBase); 1507 break; 1508 1509 case EXIT_PROCESS_DEBUG_EVENT: 1510 OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT " 1511 "for pid=%u tid=%x\n", 1512 (unsigned) current_event.dwProcessId, 1513 (unsigned) current_event.dwThreadId)); 1514 { 1515 DWORD exit_status = current_event.u.ExitProcess.dwExitCode; 1516 /* If the exit status looks like a fatal exception, but we 1517 don't recognize the exception's code, make the original 1518 exit status value available, to avoid losing information. */ 1519 int exit_signal 1520 = WIFSIGNALED (exit_status) ? WTERMSIG (exit_status) : -1; 1521 if (exit_signal == -1) 1522 { 1523 ourstatus->kind = TARGET_WAITKIND_EXITED; 1524 ourstatus->value.integer = exit_status; 1525 } 1526 else 1527 { 1528 ourstatus->kind = TARGET_WAITKIND_SIGNALLED; 1529 ourstatus->value.sig = gdb_signal_from_host (exit_signal); 1530 } 1531 } 1532 child_continue (DBG_CONTINUE, desired_stop_thread_id); 1533 break; 1534 1535 case LOAD_DLL_DEBUG_EVENT: 1536 OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT " 1537 "for pid=%u tid=%x\n", 1538 (unsigned) current_event.dwProcessId, 1539 (unsigned) current_event.dwThreadId)); 1540 CloseHandle (current_event.u.LoadDll.hFile); 1541 if (! child_initialization_done) 1542 break; 1543 handle_load_dll (); 1544 1545 ourstatus->kind = TARGET_WAITKIND_LOADED; 1546 ourstatus->value.sig = GDB_SIGNAL_TRAP; 1547 break; 1548 1549 case UNLOAD_DLL_DEBUG_EVENT: 1550 OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT " 1551 "for pid=%u tid=%x\n", 1552 (unsigned) current_event.dwProcessId, 1553 (unsigned) current_event.dwThreadId)); 1554 if (! child_initialization_done) 1555 break; 1556 handle_unload_dll (); 1557 ourstatus->kind = TARGET_WAITKIND_LOADED; 1558 ourstatus->value.sig = GDB_SIGNAL_TRAP; 1559 break; 1560 1561 case EXCEPTION_DEBUG_EVENT: 1562 OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT " 1563 "for pid=%u tid=%x\n", 1564 (unsigned) current_event.dwProcessId, 1565 (unsigned) current_event.dwThreadId)); 1566 if (handle_exception (ourstatus, debug_threads) 1567 == HANDLE_EXCEPTION_UNHANDLED) 1568 *continue_status = DBG_EXCEPTION_NOT_HANDLED; 1569 break; 1570 1571 case OUTPUT_DEBUG_STRING_EVENT: 1572 /* A message from the kernel (or Cygwin). */ 1573 OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT " 1574 "for pid=%u tid=%x\n", 1575 (unsigned) current_event.dwProcessId, 1576 (unsigned) current_event.dwThreadId)); 1577 handle_output_debug_string (nullptr); 1578 break; 1579 1580 default: 1581 OUTMSG2 (("gdbserver: kernel event unknown " 1582 "for pid=%u tid=%x code=%x\n", 1583 (unsigned) current_event.dwProcessId, 1584 (unsigned) current_event.dwThreadId, 1585 (unsigned) current_event.dwDebugEventCode)); 1586 break; 1587 } 1588 1589 ptid = debug_event_ptid (¤t_event); 1590 1591 if (desired_stop_thread_id != -1 && desired_stop_thread_id != ptid.lwp ()) 1592 { 1593 /* Pending stop. See the comment by the definition of 1594 "pending_stops" for details on why this is needed. */ 1595 OUTMSG2 (("get_windows_debug_event - " 1596 "unexpected stop in 0x%lx (expecting 0x%x)\n", 1597 ptid.lwp (), desired_stop_thread_id)); 1598 maybe_adjust_pc (); 1599 pending_stops.push_back ({(DWORD) ptid.lwp (), *ourstatus, current_event}); 1600 ourstatus->kind = TARGET_WAITKIND_SPURIOUS; 1601 } 1602 else 1603 current_thread = find_thread_ptid (ptid); 1604 1605 return 1; 1606 } 1607 1608 /* Wait for the inferior process to change state. 1609 STATUS will be filled in with a response code to send to GDB. 1610 Returns the signal which caused the process to stop. */ 1611 ptid_t 1612 win32_process_target::wait (ptid_t ptid, target_waitstatus *ourstatus, 1613 int options) 1614 { 1615 if (cached_status.kind != TARGET_WAITKIND_IGNORE) 1616 { 1617 /* The core always does a wait after creating the inferior, and 1618 do_initial_child_stuff already ran the inferior to the 1619 initial breakpoint (or an exit, if creating the process 1620 fails). Report it now. */ 1621 *ourstatus = cached_status; 1622 cached_status.kind = TARGET_WAITKIND_IGNORE; 1623 return debug_event_ptid (¤t_event); 1624 } 1625 1626 while (1) 1627 { 1628 DWORD continue_status; 1629 if (!get_child_debug_event (&continue_status, ourstatus)) 1630 continue; 1631 1632 switch (ourstatus->kind) 1633 { 1634 case TARGET_WAITKIND_EXITED: 1635 OUTMSG2 (("Child exited with retcode = %x\n", 1636 ourstatus->value.integer)); 1637 win32_clear_inferiors (); 1638 return ptid_t (current_event.dwProcessId); 1639 case TARGET_WAITKIND_STOPPED: 1640 case TARGET_WAITKIND_SIGNALLED: 1641 case TARGET_WAITKIND_LOADED: 1642 { 1643 OUTMSG2 (("Child Stopped with signal = %d \n", 1644 ourstatus->value.sig)); 1645 maybe_adjust_pc (); 1646 return debug_event_ptid (¤t_event); 1647 } 1648 default: 1649 OUTMSG (("Ignoring unknown internal event, %d\n", ourstatus->kind)); 1650 /* fall-through */ 1651 case TARGET_WAITKIND_SPURIOUS: 1652 /* do nothing, just continue */ 1653 child_continue (continue_status, desired_stop_thread_id); 1654 break; 1655 } 1656 } 1657 } 1658 1659 /* Fetch registers from the inferior process. 1660 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */ 1661 void 1662 win32_process_target::fetch_registers (regcache *regcache, int regno) 1663 { 1664 child_fetch_inferior_registers (regcache, regno); 1665 } 1666 1667 /* Store registers to the inferior process. 1668 If REGNO is -1, store all registers; otherwise, store at least REGNO. */ 1669 void 1670 win32_process_target::store_registers (regcache *regcache, int regno) 1671 { 1672 child_store_inferior_registers (regcache, regno); 1673 } 1674 1675 /* Read memory from the inferior process. This should generally be 1676 called through read_inferior_memory, which handles breakpoint shadowing. 1677 Read LEN bytes at MEMADDR into a buffer at MYADDR. */ 1678 int 1679 win32_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr, 1680 int len) 1681 { 1682 return child_xfer_memory (memaddr, (char *) myaddr, len, 0, 0) != len; 1683 } 1684 1685 /* Write memory to the inferior process. This should generally be 1686 called through write_inferior_memory, which handles breakpoint shadowing. 1687 Write LEN bytes from the buffer at MYADDR to MEMADDR. 1688 Returns 0 on success and errno on failure. */ 1689 int 1690 win32_process_target::write_memory (CORE_ADDR memaddr, 1691 const unsigned char *myaddr, int len) 1692 { 1693 return child_xfer_memory (memaddr, (char *) myaddr, len, 1, 0) != len; 1694 } 1695 1696 /* Send an interrupt request to the inferior process. */ 1697 void 1698 win32_process_target::request_interrupt () 1699 { 1700 winapi_DebugBreakProcess DebugBreakProcess; 1701 winapi_GenerateConsoleCtrlEvent GenerateConsoleCtrlEvent; 1702 1703 #ifdef _WIN32_WCE 1704 HMODULE dll = GetModuleHandle (_T("COREDLL.DLL")); 1705 #else 1706 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL")); 1707 #endif 1708 1709 GenerateConsoleCtrlEvent = GETPROCADDRESS (dll, GenerateConsoleCtrlEvent); 1710 1711 if (GenerateConsoleCtrlEvent != NULL 1712 && GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, current_process_id)) 1713 return; 1714 1715 /* GenerateConsoleCtrlEvent can fail if process id being debugged is 1716 not a process group id. 1717 Fallback to XP/Vista 'DebugBreakProcess', which generates a 1718 breakpoint exception in the interior process. */ 1719 1720 DebugBreakProcess = GETPROCADDRESS (dll, DebugBreakProcess); 1721 1722 if (DebugBreakProcess != NULL 1723 && DebugBreakProcess (current_process_handle)) 1724 return; 1725 1726 /* Last resort, suspend all threads manually. */ 1727 soft_interrupt_requested = 1; 1728 } 1729 1730 bool 1731 win32_process_target::supports_hardware_single_step () 1732 { 1733 return true; 1734 } 1735 1736 #ifdef _WIN32_WCE 1737 int 1738 win32_error_to_fileio_error (DWORD err) 1739 { 1740 switch (err) 1741 { 1742 case ERROR_BAD_PATHNAME: 1743 case ERROR_FILE_NOT_FOUND: 1744 case ERROR_INVALID_NAME: 1745 case ERROR_PATH_NOT_FOUND: 1746 return FILEIO_ENOENT; 1747 case ERROR_CRC: 1748 case ERROR_IO_DEVICE: 1749 case ERROR_OPEN_FAILED: 1750 return FILEIO_EIO; 1751 case ERROR_INVALID_HANDLE: 1752 return FILEIO_EBADF; 1753 case ERROR_ACCESS_DENIED: 1754 case ERROR_SHARING_VIOLATION: 1755 return FILEIO_EACCES; 1756 case ERROR_NOACCESS: 1757 return FILEIO_EFAULT; 1758 case ERROR_BUSY: 1759 return FILEIO_EBUSY; 1760 case ERROR_ALREADY_EXISTS: 1761 case ERROR_FILE_EXISTS: 1762 return FILEIO_EEXIST; 1763 case ERROR_BAD_DEVICE: 1764 return FILEIO_ENODEV; 1765 case ERROR_DIRECTORY: 1766 return FILEIO_ENOTDIR; 1767 case ERROR_FILENAME_EXCED_RANGE: 1768 case ERROR_INVALID_DATA: 1769 case ERROR_INVALID_PARAMETER: 1770 case ERROR_NEGATIVE_SEEK: 1771 return FILEIO_EINVAL; 1772 case ERROR_TOO_MANY_OPEN_FILES: 1773 return FILEIO_EMFILE; 1774 case ERROR_HANDLE_DISK_FULL: 1775 case ERROR_DISK_FULL: 1776 return FILEIO_ENOSPC; 1777 case ERROR_WRITE_PROTECT: 1778 return FILEIO_EROFS; 1779 case ERROR_NOT_SUPPORTED: 1780 return FILEIO_ENOSYS; 1781 } 1782 1783 return FILEIO_EUNKNOWN; 1784 } 1785 1786 void 1787 win32_process_target::hostio_last_error (char *buf) 1788 { 1789 DWORD winerr = GetLastError (); 1790 int fileio_err = win32_error_to_fileio_error (winerr); 1791 sprintf (buf, "F-1,%x", fileio_err); 1792 } 1793 #endif 1794 1795 bool 1796 win32_process_target::supports_qxfer_siginfo () 1797 { 1798 return true; 1799 } 1800 1801 /* Write Windows signal info. */ 1802 1803 int 1804 win32_process_target::qxfer_siginfo (const char *annex, 1805 unsigned char *readbuf, 1806 unsigned const char *writebuf, 1807 CORE_ADDR offset, int len) 1808 { 1809 if (siginfo_er.ExceptionCode == 0) 1810 return -1; 1811 1812 if (readbuf == nullptr) 1813 return -1; 1814 1815 char *buf = (char *) &siginfo_er; 1816 size_t bufsize = sizeof (siginfo_er); 1817 1818 #ifdef __x86_64__ 1819 EXCEPTION_RECORD32 er32; 1820 if (wow64_process) 1821 { 1822 buf = (char *) &er32; 1823 bufsize = sizeof (er32); 1824 1825 er32.ExceptionCode = siginfo_er.ExceptionCode; 1826 er32.ExceptionFlags = siginfo_er.ExceptionFlags; 1827 er32.ExceptionRecord = (uintptr_t) siginfo_er.ExceptionRecord; 1828 er32.ExceptionAddress = (uintptr_t) siginfo_er.ExceptionAddress; 1829 er32.NumberParameters = siginfo_er.NumberParameters; 1830 int i; 1831 for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++) 1832 er32.ExceptionInformation[i] = siginfo_er.ExceptionInformation[i]; 1833 } 1834 #endif 1835 1836 if (offset > bufsize) 1837 return -1; 1838 1839 if (offset + len > bufsize) 1840 len = bufsize - offset; 1841 1842 memcpy (readbuf, buf + offset, len); 1843 1844 return len; 1845 } 1846 1847 bool 1848 win32_process_target::supports_get_tib_address () 1849 { 1850 return true; 1851 } 1852 1853 /* Write Windows OS Thread Information Block address. */ 1854 1855 int 1856 win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) 1857 { 1858 windows_thread_info *th; 1859 th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT); 1860 if (th == NULL) 1861 return 0; 1862 if (addr != NULL) 1863 *addr = th->thread_local_base; 1864 return 1; 1865 } 1866 1867 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */ 1868 1869 const gdb_byte * 1870 win32_process_target::sw_breakpoint_from_kind (int kind, int *size) 1871 { 1872 *size = the_low_target.breakpoint_len; 1873 return the_low_target.breakpoint; 1874 } 1875 1876 bool 1877 win32_process_target::stopped_by_sw_breakpoint () 1878 { 1879 windows_thread_info *th = thread_rec (current_thread_ptid (), 1880 DONT_INVALIDATE_CONTEXT); 1881 return th == nullptr ? false : th->stopped_at_software_breakpoint; 1882 } 1883 1884 bool 1885 win32_process_target::supports_stopped_by_sw_breakpoint () 1886 { 1887 return true; 1888 } 1889 1890 CORE_ADDR 1891 win32_process_target::read_pc (struct regcache *regcache) 1892 { 1893 return (*the_low_target.get_pc) (regcache); 1894 } 1895 1896 void 1897 win32_process_target::write_pc (struct regcache *regcache, CORE_ADDR pc) 1898 { 1899 return (*the_low_target.set_pc) (regcache, pc); 1900 } 1901 1902 /* The win32 target ops object. */ 1903 1904 static win32_process_target the_win32_target; 1905 1906 /* Initialize the Win32 backend. */ 1907 void 1908 initialize_low (void) 1909 { 1910 set_target_ops (&the_win32_target); 1911 the_low_target.arch_setup (); 1912 1913 #ifdef __x86_64__ 1914 /* These functions are loaded dynamically, because they are not available 1915 on Windows XP. */ 1916 HMODULE dll = GetModuleHandle (_T("KERNEL32.DLL")); 1917 win32_Wow64GetThreadContext = GETPROCADDRESS (dll, Wow64GetThreadContext); 1918 win32_Wow64SetThreadContext = GETPROCADDRESS (dll, Wow64SetThreadContext); 1919 #endif 1920 } 1921