Alexandre Julliard : ntdll:
Support loading a builtin under a different name.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 21 13:13:03 CST 2006
Module: wine
Branch: refs/heads/master
Commit: ca311b3f4c77564883132350d17274171dee5a20
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ca311b3f4c77564883132350d17274171dee5a20
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Feb 21 19:43:22 2006 +0100
ntdll: Support loading a builtin under a different name.
Find the proper modref in that case based on the dlopen handle.
---
dlls/ntdll/loader.c | 38 +++++++++++++++++++++-----------------
1 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index b0e1f1f..2607b17 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1519,28 +1519,31 @@ static NTSTATUS load_builtin_dll( LPCWST
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 @@ static NTSTATUS load_dll( LPCWSTR load_p
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 );
More information about the wine-cvs
mailing list