Jacek Caban : kernel32: Reimplement DebugBreakProcess on top of DbgUiIssueRemoteBreakin.

Alexandre Julliard julliard at winehq.org
Fri Jul 5 14:49:18 CDT 2019


Module: wine
Branch: master
Commit: a679f965c8154c46338bbef9a3a0ab3ec7e785a4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a679f965c8154c46338bbef9a3a0ab3ec7e785a4

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jul  5 13:21:37 2019 +0200

kernel32: Reimplement DebugBreakProcess on top of DbgUiIssueRemoteBreakin.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/debugger.c       | 18 ++++++------------
 dlls/kernel32/tests/debugger.c |  3 +--
 include/wine/server_protocol.h | 19 +------------------
 server/debugger.c              | 14 --------------
 server/protocol.def            |  8 --------
 server/request.h               |  6 ------
 server/trace.c                 | 13 -------------
 7 files changed, 8 insertions(+), 73 deletions(-)

diff --git a/dlls/kernel32/debugger.c b/dlls/kernel32/debugger.c
index e2ee1fd..d439475 100644
--- a/dlls/kernel32/debugger.c
+++ b/dlls/kernel32/debugger.c
@@ -407,21 +407,15 @@ void WINAPI DebugBreak(void)
  *
  *  True if successful.
  */
-BOOL WINAPI DebugBreakProcess(HANDLE hProc)
+BOOL WINAPI DebugBreakProcess(HANDLE process)
 {
-    BOOL ret, self;
+    NTSTATUS status;
 
-    TRACE("(%p)\n", hProc);
+    TRACE("(%p)\n", process);
 
-    SERVER_START_REQ( debug_break )
-    {
-        req->handle = wine_server_obj_handle( hProc );
-        ret = !wine_server_call_err( req );
-        self = ret && reply->self;
-    }
-    SERVER_END_REQ;
-    if (self) DbgBreakPoint();
-    return ret;
+    status = DbgUiIssueRemoteBreakin(process);
+    if (status) SetLastError(RtlNtStatusToDosError(status));
+    return !status;
 }
 
 
diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c
index 3f73f2e..691e1c0 100644
--- a/dlls/kernel32/tests/debugger.c
+++ b/dlls/kernel32/tests/debugger.c
@@ -988,7 +988,6 @@ static void test_debug_children(char *name, DWORD flag, BOOL debug_child)
 
         /* a new thread, which executes DbgDebugBreak, is created */
         next_event(&ctx, 2000);
-        todo_wine
         ok(ctx.ev.dwDebugEventCode == CREATE_THREAD_DEBUG_EVENT, "dwDebugEventCode = %d\n", ctx.ev.dwDebugEventCode);
         last_thread = ctx.ev.dwThreadId;
 
@@ -999,7 +998,7 @@ static void test_debug_children(char *name, DWORD flag, BOOL debug_child)
         ok(ctx.ev.dwThreadId == last_thread, "unexpected thread\n");
         ok(ctx.ev.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT, "ExceptionCode = %x\n",
            ctx.ev.u.Exception.ExceptionRecord.ExceptionCode);
-        todo_wine
+        todo_wine_if(sizeof(void*) == 4)
         ok(ctx.ev.u.Exception.ExceptionRecord.ExceptionAddress == pDbgBreakPoint, "ExceptionAddres != DbgBreakPoint\n");
 
         ret = SetEvent(event_attach);
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index f67b09a..d26f27c 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -2552,20 +2552,6 @@ struct debug_process_reply
 
 
 
-struct debug_break_request
-{
-    struct request_header __header;
-    obj_handle_t handle;
-};
-struct debug_break_reply
-{
-    struct reply_header __header;
-    int          self;
-    char __pad_12[4];
-};
-
-
-
 struct set_debugger_kill_on_exit_request
 {
     struct request_header __header;
@@ -5901,7 +5887,6 @@ enum request
     REQ_get_exception_status,
     REQ_continue_debug_event,
     REQ_debug_process,
-    REQ_debug_break,
     REQ_set_debugger_kill_on_exit,
     REQ_read_process_memory,
     REQ_write_process_memory,
@@ -6206,7 +6191,6 @@ union generic_request
     struct get_exception_status_request get_exception_status_request;
     struct continue_debug_event_request continue_debug_event_request;
     struct debug_process_request debug_process_request;
-    struct debug_break_request debug_break_request;
     struct set_debugger_kill_on_exit_request set_debugger_kill_on_exit_request;
     struct read_process_memory_request read_process_memory_request;
     struct write_process_memory_request write_process_memory_request;
@@ -6509,7 +6493,6 @@ union generic_reply
     struct get_exception_status_reply get_exception_status_reply;
     struct continue_debug_event_reply continue_debug_event_reply;
     struct debug_process_reply debug_process_reply;
-    struct debug_break_reply debug_break_reply;
     struct set_debugger_kill_on_exit_reply set_debugger_kill_on_exit_reply;
     struct read_process_memory_reply read_process_memory_reply;
     struct write_process_memory_reply write_process_memory_reply;
@@ -6708,6 +6691,6 @@ union generic_reply
     struct resume_process_reply resume_process_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 586
+#define SERVER_PROTOCOL_VERSION 587
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/debugger.c b/server/debugger.c
index 38fe788..7c64cbb 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -714,20 +714,6 @@ DECL_HANDLER(get_exception_status)
     }
 }
 
-/* simulate a breakpoint in a process */
-DECL_HANDLER(debug_break)
-{
-    struct process *process;
-
-    reply->self = 0;
-    if ((process = get_process_from_handle( req->handle, PROCESS_SET_INFORMATION /*FIXME*/ )))
-    {
-        if (process != current->process) break_process( process );
-        else reply->self = 1;
-        release_object( process );
-    }
-}
-
 /* set debugger kill on exit flag */
 DECL_HANDLER(set_debugger_kill_on_exit)
 {
diff --git a/server/protocol.def b/server/protocol.def
index 58a7545..b80a6d6 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1940,14 +1940,6 @@ enum char_info_mode
 @END
 
 
-/* Simulate a breakpoint in a process */
- at REQ(debug_break)
-    obj_handle_t handle;       /* process handle */
- at REPLY
-    int          self;         /* was it the caller itself? */
- at END
-
-
 /* Set debugger kill on exit flag */
 @REQ(set_debugger_kill_on_exit)
     int          kill_on_exit;  /* 0=detach/1=kill debuggee when debugger dies */
diff --git a/server/request.h b/server/request.h
index 1858b41..57f8937 100644
--- a/server/request.h
+++ b/server/request.h
@@ -213,7 +213,6 @@ DECL_HANDLER(queue_exception_event);
 DECL_HANDLER(get_exception_status);
 DECL_HANDLER(continue_debug_event);
 DECL_HANDLER(debug_process);
-DECL_HANDLER(debug_break);
 DECL_HANDLER(set_debugger_kill_on_exit);
 DECL_HANDLER(read_process_memory);
 DECL_HANDLER(write_process_memory);
@@ -517,7 +516,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_get_exception_status,
     (req_handler)req_continue_debug_event,
     (req_handler)req_debug_process,
-    (req_handler)req_debug_break,
     (req_handler)req_set_debugger_kill_on_exit,
     (req_handler)req_read_process_memory,
     (req_handler)req_write_process_memory,
@@ -1376,10 +1374,6 @@ C_ASSERT( sizeof(struct continue_debug_event_request) == 24 );
 C_ASSERT( FIELD_OFFSET(struct debug_process_request, pid) == 12 );
 C_ASSERT( FIELD_OFFSET(struct debug_process_request, attach) == 16 );
 C_ASSERT( sizeof(struct debug_process_request) == 24 );
-C_ASSERT( FIELD_OFFSET(struct debug_break_request, handle) == 12 );
-C_ASSERT( sizeof(struct debug_break_request) == 16 );
-C_ASSERT( FIELD_OFFSET(struct debug_break_reply, self) == 8 );
-C_ASSERT( sizeof(struct debug_break_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct set_debugger_kill_on_exit_request, kill_on_exit) == 12 );
 C_ASSERT( sizeof(struct set_debugger_kill_on_exit_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct read_process_memory_request, handle) == 12 );
diff --git a/server/trace.c b/server/trace.c
index d4a35e4..af87a5d 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2447,16 +2447,6 @@ static void dump_debug_process_request( const struct debug_process_request *req
     fprintf( stderr, ", attach=%d", req->attach );
 }
 
-static void dump_debug_break_request( const struct debug_break_request *req )
-{
-    fprintf( stderr, " handle=%04x", req->handle );
-}
-
-static void dump_debug_break_reply( const struct debug_break_reply *req )
-{
-    fprintf( stderr, " self=%d", req->self );
-}
-
 static void dump_set_debugger_kill_on_exit_request( const struct set_debugger_kill_on_exit_request *req )
 {
     fprintf( stderr, " kill_on_exit=%d", req->kill_on_exit );
@@ -4708,7 +4698,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_exception_status_request,
     (dump_func)dump_continue_debug_event_request,
     (dump_func)dump_debug_process_request,
-    (dump_func)dump_debug_break_request,
     (dump_func)dump_set_debugger_kill_on_exit_request,
     (dump_func)dump_read_process_memory_request,
     (dump_func)dump_write_process_memory_request,
@@ -5009,7 +4998,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_exception_status_reply,
     NULL,
     NULL,
-    (dump_func)dump_debug_break_reply,
     NULL,
     (dump_func)dump_read_process_memory_reply,
     NULL,
@@ -5310,7 +5298,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "get_exception_status",
     "continue_debug_event",
     "debug_process",
-    "debug_break",
     "set_debugger_kill_on_exit",
     "read_process_memory",
     "write_process_memory",




More information about the wine-cvs mailing list