[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