Alexandre Julliard : kernel32: Make the load order for a 16-bit stand-alone dll match its 32-bit owner.

Alexandre Julliard julliard at winehq.org
Thu Mar 12 09:54:12 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 11 16:16:41 2009 +0100

kernel32: Make the load order for a 16-bit stand-alone dll match its 32-bit owner.

---

 dlls/kernel32/ne_module.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/ne_module.c b/dlls/kernel32/ne_module.c
index 046f7e3..47c3f4d 100644
--- a/dlls/kernel32/ne_module.c
+++ b/dlls/kernel32/ne_module.c
@@ -1046,7 +1046,7 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_
     const IMAGE_DOS_HEADER *descr = NULL;
     const char *file_name = NULL;
     char dllname[32], owner[20], *p;
-    const char *basename;
+    const char *basename, *main_module;
     int owner_exists = FALSE;
 
     /* strip path information */
@@ -1075,11 +1075,33 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_
             {
                 TRACE( "found %s with embedded 16-bit module\n", debugstr_a(dllname) );
                 file_name = basename;
+
+                /* if module has a 32-bit owner, match the load order of the owner */
+                if ((main_module = (void *)GetProcAddress( mod32, "__wine_spec_main_module" )))
+                {
+                    LDR_MODULE *ldr;
+                    HMODULE main_owner = LoadLibraryA( main_module );
+
+                    if (!main_owner)
+                    {
+                        WARN( "couldn't load owner %s for 16-bit dll %s\n", main_module, dllname );
+                        FreeLibrary( mod32 );
+                        return ERROR_FILE_NOT_FOUND;
+                    }
+                    /* check if module was loaded native */
+                    if (LdrFindEntryForAddress( main_owner, &ldr ) || !(ldr->Flags & LDR_WINE_INTERNAL))
+                    {
+                        FreeLibrary( mod32 );
+                        descr = NULL;
+                    }
+                    FreeLibrary( main_owner );
+                }
             }
         }
         *p = 0;
 
-        if (!descr && wine_dll_get_owner( dllname, owner, sizeof(owner), &owner_exists ) != -1)
+        /* old-style 16-bit placeholders support, to be removed at some point */
+        if (!mod32 && wine_dll_get_owner( dllname, owner, sizeof(owner), &owner_exists ) != -1)
         {
             mod32 = LoadLibraryA( owner );
             if (mod32)




More information about the wine-cvs mailing list