[Bug 4891] New: Regression ntdll/loader.c

Wine Bugs wine-bugs at winehq.org
Sun Mar 19 20:27:54 CST 2006


http://bugs.winehq.org/show_bug.cgi?id=4891

           Summary: Regression ntdll/loader.c
           Product: Wine
           Version: 0.9.9.
          Platform: PC-x86-64
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: wine-loader
        AssignedTo: wine-bugs at winehq.org
        ReportedBy: nonno.cicala at libero.it


Since WINE 0.9.9 Civilization3:Conquests crashes immediately (unhandled
exception) on my AMD64 system.
With CVS I tracked the problem to this change (2006-02-21 14:14:17 CDT):
==============================================================================
--- loader.c    2006-03-20 02:59:01.000000000 +0100
+++ wine.new/dlls/ntdll/loader.c        2006-03-20 01:36:28.000000000 +0100
@@ -1519,28 +1519,31 @@

     if (!info.wm)
     {
-        /* The constructor wasn't called, this means the .so is already
-         * loaded under a different name. We can't support multiple names
-         * for the same module, so return an error. */
-        return STATUS_INVALID_IMAGE_FORMAT;
-    }
+        PLIST_ENTRY mark, entry;

-    TRACE_(loaddll)( "Loaded module %s : builtin\n",
debugstr_w(info.wm->ldr.FullDllName.Buffer) );
+        /* The constructor wasn't called, this means the .so is already
+         * loaded under a different name. Try to find the wm for it. */

-    info.wm->ldr.SectionHandle = handle;
-    if (strcmpiW( info.wm->ldr.BaseDllName.Buffer, name ))
-    {
-        /* check without .so extension */
-        static const WCHAR soW[] = {'.','s','o',0};
-        DWORD len = info.wm->ldr.BaseDllName.Length / sizeof(WCHAR);
-        if (strncmpiW( info.wm->ldr.BaseDllName.Buffer, name, len ) ||
strcmpiW( name + len, soW ))
+        mark = &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList;
+        for (entry = mark->Flink; entry != mark; entry = entry->Flink)
         {
-            ERR( "loaded .so for %s but got %s instead - probably 16-bit dll\n",
-                 debugstr_w(name), debugstr_w(info.wm->ldr.BaseDllName.Buffer) );
-            /* wine_dll_unload( handle );*/
-            return STATUS_INVALID_IMAGE_FORMAT;
+            LDR_MODULE *mod = CONTAINING_RECORD(entry, LDR_MODULE,
InLoadOrderModuleList);
+            if (mod->Flags & LDR_WINE_INTERNAL && mod->SectionHandle == handle)
+            {
+                info.wm = CONTAINING_RECORD(mod, WINE_MODREF, ldr);
+                TRACE( "Found already loaded module %s for builtin %s\n",
+                       debugstr_w(info.wm->ldr.FullDllName.Buffer),
debugstr_w(path) );
+                break;
+            }
         }
+        if (!info.wm) return STATUS_INVALID_IMAGE_FORMAT;
+    }
+    else
+    {
+        TRACE_(loaddll)( "Loaded module %s : builtin\n",
debugstr_w(info.wm->ldr.FullDllName.Buffer) );
+        info.wm->ldr.SectionHandle = handle;
     }
+
     *pwm = info.wm;
     return STATUS_SUCCESS;
 }
@@ -1712,6 +1715,7 @@
         break;
     case LOADORDER_BI:
         nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
+        if (nts == STATUS_SUCCESS) break;
         if (!handle) break;  /* nothing else we can try */
         /* file is not a builtin library, try without using the specified file */
         nts = load_builtin_dll( load_path, filename, 0, flags, pwm );
==============================================================================

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.



More information about the wine-bugs mailing list