[PATCH RFC] winedbg: Allow attaching to process by name.

Derek Lesho dlesho at codeweavers.com
Tue May 5 10:16:46 CDT 2020


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
I've found this useful for situations where you can't use winedbg to launch the app (steam games), and the apps fail too quickly for you to manually retrieve their PID.
---
 programs/winedbg/dbg.y      |  1 +
 programs/winedbg/debugger.h |  1 +
 programs/winedbg/winedbg.c  | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git a/programs/winedbg/dbg.y b/programs/winedbg/dbg.y
index ac76b5baf8a..205ea167b67 100644
--- a/programs/winedbg/dbg.y
+++ b/programs/winedbg/dbg.y
@@ -138,6 +138,7 @@ command:
     | tSYMBOLFILE pathname expr_rvalue { symbol_read_symtable($2, $3); }
     | tWHATIS expr_lvalue       { dbg_printf("type = "); types_print_type(&$2.type, FALSE); dbg_printf("\n"); }
     | tATTACH tNUM     		{ dbg_attach_debuggee($2); dbg_active_wait_for_first_exception(); }
+    | tATTACH tSTRING           { dbg_attach_debuggee(dbg_find_process($2)); dbg_active_wait_for_first_exception(); }
     | tDETACH                   { dbg_curr_process->process_io->close_process(dbg_curr_process, FALSE); }
     | tTHREAD tNUM              { dbg_set_curr_thread($2); }
     | tKILL                     { dbg_curr_process->process_io->close_process(dbg_curr_process, TRUE); }
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index ddac129bab5..754e7d5b22f 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -473,6 +473,7 @@ extern void             dbg_set_process_name(struct dbg_process* p, const WCHAR*
 extern struct dbg_process* dbg_get_process(DWORD pid);
 extern struct dbg_process* dbg_get_process_h(HANDLE handle);
 extern void             dbg_del_process(struct dbg_process* p);
+extern DWORD            dbg_find_process(const char *filename);
 struct dbg_thread*	dbg_add_thread(struct dbg_process* p, DWORD tid, HANDLE h, void* teb);
 extern struct dbg_thread* dbg_get_thread(struct dbg_process* p, DWORD tid);
 extern void             dbg_del_thread(struct dbg_thread* t);
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 19f30f04e5d..27ce57607a0 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include "debugger.h"
 
+#include "tlhelp32.h"
 #include "winternl.h"
 #include "wine/exception.h"
 #include "wine/library.h"
@@ -377,6 +378,42 @@ void dbg_del_process(struct dbg_process* p)
     HeapFree(GetProcessHeap(), 0, p);
 }
 
+DWORD dbg_find_process(const char *search)
+{
+    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+    const char *process_name;
+    PROCESSENTRY32 cur_proc;
+    DWORD ret = -1;
+
+    if (snap == INVALID_HANDLE_VALUE)
+        return ret;
+
+    cur_proc.dwSize = sizeof(cur_proc);
+    if (!(Process32First(snap, &cur_proc)))
+        goto done;
+
+    do
+    {
+        if (cur_proc.th32ProcessID == GetCurrentProcessId())
+            continue;
+
+        if (!(strcasecmp(search, cur_proc.szExeFile)))
+        {
+            ret = cur_proc.th32ProcessID;
+            break;
+        }
+
+        cur_proc.dwSize = sizeof(cur_proc);
+    }
+    while ((Process32Next(snap, &cur_proc)));
+
+    done:
+    if (ret == -1)
+        dbg_printf("Could not find running process with name \"%s\"\n", search);
+    CloseHandle(snap);
+    return ret;
+}
+
 /******************************************************************
  *		dbg_init
  *
-- 
2.26.2




More information about the wine-devel mailing list