Sebastian Lackner : ntdll: ProcessDebugFlags should return debug_children flag instead of !debugger_present.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 21 15:10:32 CST 2015


Module: wine
Branch: master
Commit: 1980834c7d7ee3eb32fa9ece20673d9c39a74b0c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1980834c7d7ee3eb32fa9ece20673d9c39a74b0c

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Dec 21 05:18:50 2015 +0100

ntdll: ProcessDebugFlags should return debug_children flag instead of !debugger_present.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/process.c           |  2 +-
 dlls/ntdll/tests/info.c        | 12 ++----------
 include/wine/server_protocol.h |  5 +++--
 server/debugger.c              |  2 +-
 server/process.c               |  5 +++--
 server/protocol.def            |  3 ++-
 server/request.h               |  1 +
 server/trace.c                 |  1 +
 8 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index ca9462a..5a5c3ef 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -339,7 +339,7 @@ NTSTATUS WINAPI NtQueryInformationProcess(
                     req->handle = wine_server_obj_handle( ProcessHandle );
                     if ((ret = wine_server_call( req )) == STATUS_SUCCESS)
                     {
-                        *(DWORD *)ProcessInformation = !reply->debugger_present;
+                        *(DWORD *)ProcessInformation = reply->debug_children;
                     }
                 }
                 SERVER_END_REQ;
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 88d0417..a521447 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -1345,11 +1345,7 @@ static void test_query_process_debug_flags(int argc, char **argv)
         status = pNtQueryInformationProcess(pi.hProcess, ProcessDebugFlags,
                 &debug_flags, sizeof(debug_flags), NULL);
         ok(!status, "NtQueryInformationProcess failed, status %#x.\n", status);
-        if (!expected_flags)
-            ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
-        else
-            todo_wine
-            ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
+        ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
 
         if (!(test_flags[i] & CREATE_SUSPENDED))
         {
@@ -1379,11 +1375,7 @@ static void test_query_process_debug_flags(int argc, char **argv)
         status = pNtQueryInformationProcess(pi.hProcess, ProcessDebugFlags,
                 &debug_flags, sizeof(debug_flags), NULL);
         ok(!status, "NtQueryInformationProcess failed, status %#x.\n", status);
-        if (expected_flags)
-            ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
-        else
-            todo_wine
-            ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
+        ok(debug_flags == expected_flags, "Expected flag %x, got %x.\n", expected_flags, debug_flags);
 
         ret = DebugActiveProcess(pi.dwProcessId);
         ok(ret, "DebugActiveProcess failed, last error %#x.\n", GetLastError());
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 4e33260..f0dc65a 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -857,7 +857,8 @@ struct get_process_info_reply
     int          exit_code;
     int          priority;
     cpu_type_t   cpu;
-    int          debugger_present;
+    short int    debugger_present;
+    short int    debug_children;
 };
 
 
@@ -6153,6 +6154,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 490
+#define SERVER_PROTOCOL_VERSION 491
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/debugger.c b/server/debugger.c
index 374f2ad..810e8d3 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -443,6 +443,7 @@ static int debugger_attach( struct process *process, struct thread *debugger )
         resume_process( process );
         return 0;
     }
+    process->debug_children = 0;
     return 1;
 
  error:
@@ -483,7 +484,6 @@ int debugger_detach( struct process *process, struct thread *debugger )
 
     /* remove relationships between process and its debugger */
     process->debugger = NULL;
-    process->debug_children = 0;
     if (!set_process_debug_flag( process, 0 )) clear_error();  /* ignore error */
 
     /* from this function */
diff --git a/server/process.c b/server/process.c
index e00b429..8433002 100644
--- a/server/process.c
+++ b/server/process.c
@@ -513,7 +513,7 @@ struct thread *create_process( int fd, struct thread *parent_thread, int inherit
     process->priority        = PROCESS_PRIOCLASS_NORMAL;
     process->suspend         = 0;
     process->is_system       = 0;
-    process->debug_children  = 0;
+    process->debug_children  = 1;
     process->is_terminating  = 0;
     process->job             = NULL;
     process->console         = NULL;
@@ -1228,7 +1228,7 @@ DECL_HANDLER(new_process)
     else if (parent->debugger && parent->debug_children)
     {
         set_process_debugger( process, parent->debugger );
-        process->debug_children = 1;
+        /* debug_children is set to 1 by default */
     }
 
     if (!(req->create_flags & CREATE_NEW_PROCESS_GROUP))
@@ -1359,6 +1359,7 @@ DECL_HANDLER(get_process_info)
         reply->end_time         = process->end_time;
         reply->cpu              = process->cpu;
         reply->debugger_present = !!process->debugger;
+        reply->debug_children   = process->debug_children;
         release_object( process );
     }
 }
diff --git a/server/protocol.def b/server/protocol.def
index 04814c9..bfb9089 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -818,7 +818,8 @@ struct rawinput_device
     int          exit_code;        /* process exit code */
     int          priority;         /* priority class */
     cpu_type_t   cpu;              /* CPU that this process is running on */
-    int          debugger_present; /* process is being debugged */
+    short int    debugger_present; /* process is being debugged */
+    short int    debug_children;   /* inherit debugger to child processes */
 @END
 
 
diff --git a/server/request.h b/server/request.h
index 48f4d46..9653f0c 100644
--- a/server/request.h
+++ b/server/request.h
@@ -760,6 +760,7 @@ C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, exit_code) == 48 );
 C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, priority) == 52 );
 C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, cpu) == 56 );
 C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, debugger_present) == 60 );
+C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, debug_children) == 62 );
 C_ASSERT( sizeof(struct get_process_info_reply) == 64 );
 C_ASSERT( FIELD_OFFSET(struct set_process_info_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct set_process_info_request, mask) == 16 );
diff --git a/server/trace.c b/server/trace.c
index 4ec7aad..405a1c9 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1279,6 +1279,7 @@ static void dump_get_process_info_reply( const struct get_process_info_reply *re
     fprintf( stderr, ", priority=%d", req->priority );
     dump_cpu_type( ", cpu=", &req->cpu );
     fprintf( stderr, ", debugger_present=%d", req->debugger_present );
+    fprintf( stderr, ", debug_children=%d", req->debug_children );
 }
 
 static void dump_set_process_info_request( const struct set_process_info_request *req )




More information about the wine-cvs mailing list