Jacek Caban : server: Fix debug event order in generate_startup_debug_events.

Alexandre Julliard julliard at winehq.org
Thu Jul 4 15:53:46 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul  4 13:37:38 2019 +0200

server: Fix debug event order in generate_startup_debug_events.

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

---

 dlls/kernel32/tests/debugger.c |  2 --
 server/debugger.c              | 20 +++++++++++++-------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c
index 227949e..361513e 100644
--- a/dlls/kernel32/tests/debugger.c
+++ b/dlls/kernel32/tests/debugger.c
@@ -290,7 +290,6 @@ static void process_attach_events(struct debugger_context *ctx)
     if (ctx->ev.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT) /* Vista+ reports ntdll.dll before reporting threads */
     {
         ok(ctx->ev.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT, "dwDebugEventCode = %d\n", ctx->ev.dwDebugEventCode);
-        todo_wine
         ok(ctx->ev.u.LoadDll.lpBaseOfDll == ntdll, "The first reported DLL is not ntdll.dll\n");
         next_event(ctx, 0);
     }
@@ -302,7 +301,6 @@ static void process_attach_events(struct debugger_context *ctx)
     {
         next_event(ctx, 2000);
         if (ctx->ev.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT)
-            todo_wine_if(ctx->ev.u.LoadDll.lpBaseOfDll == ntdll)
             ok(ctx->ev.u.LoadDll.lpBaseOfDll != ntdll, "ntdll.dll reported out of order\n");
     } while (ctx->ev.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT || ctx->ev.dwDebugEventCode == UNLOAD_DLL_DEBUG_EVENT);
     ok(ctx->dll_cnt > 2, "dll_cnt = %d\n", ctx->dll_cnt);
diff --git a/server/debugger.c b/server/debugger.c
index bff813a..38fe788 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -516,22 +516,28 @@ void generate_startup_debug_events( struct process *process, client_ptr_t entry
     struct list *ptr;
     struct thread *thread, *first_thread = get_process_first_thread( process );
 
+    generate_debug_event( first_thread, CREATE_PROCESS_DEBUG_EVENT, &entry );
+    ptr = list_head( &process->dlls ); /* skip main module reported in create process event */
+
+    /* generate ntdll.dll load event */
+    if (ptr && (ptr = list_next( &process->dlls, ptr )))
+    {
+        struct process_dll *dll = LIST_ENTRY( ptr, struct process_dll, entry );
+        generate_debug_event( first_thread, LOAD_DLL_DEBUG_EVENT, dll );
+    }
+
     /* generate creation events */
     LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry )
     {
-        if (thread == first_thread)
-            generate_debug_event( thread, CREATE_PROCESS_DEBUG_EVENT, &entry );
-        else
+        if (thread != first_thread)
             generate_debug_event( thread, CREATE_THREAD_DEBUG_EVENT, NULL );
     }
 
-    /* generate dll events (in loading order, i.e. reverse list order) */
-    ptr = list_tail( &process->dlls );
-    while (ptr != list_head( &process->dlls ))
+    /* generate dll events (in loading order) */
+    while (ptr && (ptr = list_next( &process->dlls, ptr )))
     {
         struct process_dll *dll = LIST_ENTRY( ptr, struct process_dll, entry );
         generate_debug_event( first_thread, LOAD_DLL_DEBUG_EVENT, dll );
-        ptr = list_prev( &process->dlls, ptr );
     }
 }
 




More information about the wine-cvs mailing list