Alexandre Julliard : server: Don't generate dll load event for native binaries on Wow64.

Alexandre Julliard julliard at winehq.org
Fri Jul 9 16:45:34 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul  9 22:13:57 2021 +0200

server: Don't generate dll load event for native binaries on Wow64.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/debugger.c | 36 +++++++++++++++++++++++++++++++++++-
 server/mapping.c               | 23 ++++++++++++++++-------
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c
index fc541e0c69f..1a258ad69a6 100644
--- a/dlls/kernel32/tests/debugger.c
+++ b/dlls/kernel32/tests/debugger.c
@@ -38,6 +38,7 @@
 
 static int    myARGC;
 static char** myARGV;
+static BOOL is_wow64;
 
 static BOOL (WINAPI *pCheckRemoteDebuggerPresent)(HANDLE,PBOOL);
 
@@ -51,6 +52,7 @@ static NTSTATUS  (WINAPI *pDbgUiConnectToDbg)(void);
 static HANDLE    (WINAPI *pDbgUiGetThreadDebugObject)(void);
 static void      (WINAPI *pDbgUiSetThreadDebugObject)(HANDLE);
 static DWORD     (WINAPI *pGetMappedFileNameW)(HANDLE,void*,WCHAR*,DWORD);
+static BOOL      (WINAPI *pIsWow64Process)(HANDLE,PBOOL);
 
 static LONG child_failures;
 
@@ -905,11 +907,33 @@ static void doChild(int argc, char **argv)
     CloseHandle( map );
     UnmapViewOfFile( mod );
 
+    if (sizeof(void *) > sizeof(int))
+    {
+        GetSystemWow64DirectoryW( path, MAX_PATH );
+        wcscat( path, L"\\oleacc.dll" );
+    }
+    else if (is_wow64)
+    {
+        wcscpy( path, L"c:\\windows\\sysnative\\oleacc.dll" );
+    }
+    else goto done;
+
+    file = CreateFileW( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
+    child_ok( file != INVALID_HANDLE_VALUE, "failed to open %s: %u\n", debugstr_w(path), GetLastError());
+    map = CreateFileMappingW( file, NULL, SEC_IMAGE | PAGE_READONLY, 0, 0, NULL );
+    child_ok( map != NULL, "failed to create mapping %s: %u\n", debugstr_w(path), GetLastError() );
+    mod = MapViewOfFile( map, FILE_MAP_READ, 0, 0, 0 );
+    child_ok( mod != NULL, "failed to map %s: %u\n", debugstr_w(path), GetLastError() );
+    CloseHandle( file );
+    CloseHandle( map );
+    UnmapViewOfFile( mod );
+
+done:
     blackbox.failures = child_failures;
     save_blackbox(blackbox_file, &blackbox, sizeof(blackbox), NULL);
 }
 
-static HMODULE ole32_mod, oleaut32_mod;
+static HMODULE ole32_mod, oleaut32_mod, oleacc_mod;
 
 static void check_dll_event( HANDLE process, DEBUG_EVENT *ev )
 {
@@ -925,10 +949,12 @@ static void check_dll_event( HANDLE process, DEBUG_EVENT *ev )
         else p = module;
         if (!wcsicmp( p, L"ole32.dll" )) ole32_mod = ev->u.LoadDll.lpBaseOfDll;
         else if (!wcsicmp( p, L"oleaut32.dll" )) oleaut32_mod = ev->u.LoadDll.lpBaseOfDll;
+        else if (!wcsicmp( p, L"oleacc.dll" )) oleacc_mod = ev->u.LoadDll.lpBaseOfDll;
         break;
     case UNLOAD_DLL_DEBUG_EVENT:
         if (ev->u.UnloadDll.lpBaseOfDll == ole32_mod) ole32_mod = (HMODULE)1;
         if (ev->u.UnloadDll.lpBaseOfDll == oleaut32_mod) oleaut32_mod = (HMODULE)1;
+        if (ev->u.UnloadDll.lpBaseOfDll == oleacc_mod) oleacc_mod = (HMODULE)1;
         break;
     }
 }
@@ -996,6 +1022,11 @@ static void test_debug_loop(int argc, char **argv)
 
     ok( ole32_mod == (HMODULE)1, "ole32.dll was not reported\n" );
     ok( oleaut32_mod == (HMODULE)1, "oleaut32.dll was not reported\n" );
+#ifdef _WIN64
+    ok( oleacc_mod == (HMODULE)1, "oleacc.dll was not reported\n" );
+#else
+    ok( oleacc_mod == NULL, "oleacc.dll was reported\n" );
+#endif
 
     ret = CloseHandle(pi.hThread);
     ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError());
@@ -2120,6 +2151,7 @@ START_TEST(debugger)
 
     hdll=GetModuleHandleA("kernel32.dll");
     pCheckRemoteDebuggerPresent=(void*)GetProcAddress(hdll, "CheckRemoteDebuggerPresent");
+    pIsWow64Process=(void*)GetProcAddress(hdll, "IsWow64Process");
     pGetMappedFileNameW = (void*)GetProcAddress(hdll, "GetMappedFileNameW");
     if (!pGetMappedFileNameW) pGetMappedFileNameW = (void*)GetProcAddress(LoadLibraryA("psapi.dll"),
                                                                           "GetMappedFileNameW");
@@ -2133,6 +2165,8 @@ START_TEST(debugger)
     pDbgUiGetThreadDebugObject = (void*)GetProcAddress(ntdll, "DbgUiGetThreadDebugObject");
     pDbgUiSetThreadDebugObject = (void*)GetProcAddress(ntdll, "DbgUiSetThreadDebugObject");
 
+    if (pIsWow64Process) pIsWow64Process( GetCurrentProcess(), &is_wow64 );
+
     myARGC=winetest_get_mainargs(&myARGV);
     if (myARGC >= 3 && strcmp(myARGV[2], "crash") == 0)
     {
diff --git a/server/mapping.c b/server/mapping.c
index 2df337a172c..a4bb000268a 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -361,6 +361,16 @@ static void set_process_machine( struct process *process, struct memory_view *vi
     process->machine = machine;
 }
 
+static int generate_dll_event( struct thread *thread, int code, struct memory_view *view )
+{
+    unsigned short process_machine = thread->process->machine;
+
+    if (!(view->flags & SEC_IMAGE)) return 0;
+    if (process_machine != native_machine && process_machine != view->image.machine) return 0;
+    generate_debug_event( thread, code, view );
+    return 1;
+}
+
 /* add a view to the process list */
 static void add_process_view( struct thread *thread, struct memory_view *view )
 {
@@ -370,7 +380,9 @@ static void add_process_view( struct thread *thread, struct memory_view *view )
     if (view->flags & SEC_IMAGE)
     {
         if (is_process_init_done( process ))
-            generate_debug_event( thread, DbgLoadDllStateChange, view );
+        {
+            generate_dll_event( thread, DbgLoadDllStateChange, view );
+        }
         else if (!(view->image.image_charact & IMAGE_FILE_DLL))
         {
             /* main exe */
@@ -1016,9 +1028,7 @@ void generate_startup_debug_events( struct process *process )
     while (ptr && (ptr = list_next( &process->views, ptr )))
     {
         view = LIST_ENTRY( ptr, struct memory_view, entry );
-        if (!(view->flags & SEC_IMAGE)) continue;
-        generate_debug_event( first_thread, DbgLoadDllStateChange, view );
-        break;
+        if (generate_dll_event( first_thread, DbgLoadDllStateChange, view )) break;
     }
 
     /* generate creation events */
@@ -1032,8 +1042,7 @@ void generate_startup_debug_events( struct process *process )
     while (ptr && (ptr = list_next( &process->views, ptr )))
     {
         view = LIST_ENTRY( ptr, struct memory_view, entry );
-        if (!(view->flags & SEC_IMAGE)) continue;
-        generate_debug_event( first_thread, DbgLoadDllStateChange, view );
+        generate_dll_event( first_thread, DbgLoadDllStateChange, view );
     }
 }
 
@@ -1244,7 +1253,7 @@ DECL_HANDLER(unmap_view)
     struct memory_view *view = find_mapped_view( current->process, req->base );
 
     if (!view) return;
-    if (view->flags & SEC_IMAGE) generate_debug_event( current, DbgUnloadDllStateChange, view );
+    generate_dll_event( current, DbgUnloadDllStateChange, view );
     free_memory_view( view );
 }
 




More information about the wine-cvs mailing list