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