Nikolay Sivov : ntdll: Fix trace pointer returned from RtlGetUnloadEventTraceEx().

Alexandre Julliard julliard at winehq.org
Thu Apr 2 14:27:36 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr  2 11:40:45 2020 +0300

ntdll: Fix trace pointer returned from RtlGetUnloadEventTraceEx().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/loader.c          |  4 +++-
 dlls/ntdll/tests/exception.c | 26 +++++++++++++++++++++-----
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index b946416734..23fde1f516 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -197,6 +197,7 @@ typedef struct _RTL_UNLOAD_EVENT_TRACE
 } RTL_UNLOAD_EVENT_TRACE, *PRTL_UNLOAD_EVENT_TRACE;
 
 static RTL_UNLOAD_EVENT_TRACE unload_traces[RTL_UNLOAD_EVENT_TRACE_NUMBER];
+static RTL_UNLOAD_EVENT_TRACE *unload_trace_ptr;
 static unsigned int unload_trace_seq;
 
 static void module_push_unload_trace( const LDR_MODULE *ldr )
@@ -213,6 +214,7 @@ static void module_push_unload_trace( const LDR_MODULE *ldr )
     ptr->ImageName[len / sizeof(*ptr->ImageName)] = 0;
 
     unload_trace_seq = (unload_trace_seq + 1) % ARRAY_SIZE(unload_traces);
+    unload_trace_ptr = unload_traces;
 }
 
 /*********************************************************************
@@ -233,7 +235,7 @@ void WINAPI RtlGetUnloadEventTraceEx(ULONG **size, ULONG **count, void **trace)
 
     *size = &element_size;
     *count = &element_count;
-    *trace = unload_traces;
+    *trace = &unload_trace_ptr;
 }
 
 /*************************************************************************
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 249ba9d7c3..72afb0a376 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -3410,21 +3410,20 @@ static void test_suspend_process(void)
 static void test_unload_trace(void)
 {
     static const WCHAR imageW[] = {'m','s','x','m','l','3','.','d','l','l',0};
-    RTL_UNLOAD_EVENT_TRACE *unload_trace, *ptr;
+    RTL_UNLOAD_EVENT_TRACE *unload_trace, **unload_trace_ex = NULL, *ptr;
     ULONG *element_size, *element_count, size;
-    BOOL found = FALSE;
     HMODULE hmod;
+    BOOL found;
 
     unload_trace = pRtlGetUnloadEventTrace();
     ok(unload_trace != NULL, "Failed to get unload events pointer.\n");
 
     if (pRtlGetUnloadEventTraceEx)
     {
-        ptr = NULL;
-        pRtlGetUnloadEventTraceEx(&element_size, &element_count, (void **)&ptr);
+        pRtlGetUnloadEventTraceEx(&element_size, &element_count, (void **)&unload_trace_ex);
         ok(*element_size >= sizeof(*ptr), "Unexpected element size.\n");
         ok(*element_count == RTL_UNLOAD_EVENT_TRACE_NUMBER, "Unexpected trace element count %u.\n", *element_count);
-        ok(ptr != NULL, "Unexpected pointer %p.\n", ptr);
+        ok(unload_trace_ex != NULL, "Unexpected pointer %p.\n", unload_trace_ex);
         size = *element_size;
     }
     else
@@ -3434,6 +3433,7 @@ static void test_unload_trace(void)
     ok(hmod != NULL, "Failed to load library.\n");
     FreeLibrary(hmod);
 
+    found = FALSE;
     ptr = unload_trace;
     while (ptr->BaseAddress != NULL)
     {
@@ -3445,6 +3445,22 @@ static void test_unload_trace(void)
         ptr = (RTL_UNLOAD_EVENT_TRACE *)((char *)ptr + size);
     }
     ok(found, "Unloaded module wasn't found.\n");
+
+    if (unload_trace_ex)
+    {
+        found = FALSE;
+        ptr = *unload_trace_ex;
+        while (ptr->BaseAddress != NULL)
+        {
+            if (!lstrcmpW(imageW, ptr->ImageName))
+            {
+                found = TRUE;
+                break;
+            }
+            ptr = (RTL_UNLOAD_EVENT_TRACE *)((char *)ptr + size);
+        }
+        ok(found, "Unloaded module wasn't found.\n");
+    }
 }
 
 START_TEST(exception)




More information about the wine-cvs mailing list