Force loadorder of 16-bit dlls to builtin if their 32-bit counterpart

has already been loaded as builtin.
This commit is contained in:
Alexandre Julliard 2002-08-16 20:02:54 +00:00
parent 40043ed26f
commit 0eec45a97b
4 changed files with 35 additions and 3 deletions

View File

@ -154,6 +154,25 @@ static const BUILTIN16_DESCRIPTOR *find_dll_descr( const char *dllname )
}
/***********************************************************************
* BUILTIN_IsPresent
*
* Check if a builtin dll descriptor is present (because we loaded its 32-bit counterpart).
*/
BOOL BUILTIN_IsPresent( LPCSTR name )
{
char dllname[20], *p;
if (strlen(name) >= sizeof(dllname)-4) return FALSE;
strcpy( dllname, name );
p = strrchr( dllname, '.' );
if (!p) strcat( dllname, ".dll" );
for (p = dllname; *p; p++) *p = FILE_tolower(*p);
return (find_dll_descr( dllname ) != NULL);
}
/***********************************************************************
* BUILTIN_LoadModule
*

View File

@ -88,8 +88,6 @@ enum arg_types
#define ARG_RET16 0x80000000 /* function returns 16-bit value */
#define ARG_REGISTER 0x40000000 /* function is register */
extern HMODULE16 BUILTIN_LoadModule( LPCSTR name );
extern WORD __wine_call_from_16_word();
extern LONG __wine_call_from_16_long();
extern void __wine_call_from_16_regs();

View File

@ -272,6 +272,10 @@ extern HMODULE BUILTIN32_LoadExeModule( HMODULE main );
extern void *BUILTIN32_dlopen( const char *name );
extern int BUILTIN32_dlclose( void *handle );
/* if1632/builtin.c */
extern HMODULE16 BUILTIN_LoadModule( LPCSTR name );
extern BOOL BUILTIN_IsPresent( LPCSTR name );
/* USER signal proc flags and codes */
/* See PROCESS_CallUserSignalProc for comments */
#define USIG_FLAGS_WIN32 0x0001

View File

@ -494,7 +494,18 @@ void MODULE_GetLoadOrder( enum loadorder_type loadorder[], const char *path, BOO
/* Strip path information for 16 bit modules or if the module
* resides in the system directory */
if (!win32) path = get_basename( path );
if (!win32)
{
path = get_basename( path );
if (BUILTIN_IsPresent(path))
{
TRACE( "forcing loadorder to builtin for %s\n", debugstr_a(path) );
/* force builtin loadorder since the dll is already in memory */
loadorder[0] = LOADORDER_BI;
loadorder[1] = LOADORDER_INVALID;
return;
}
}
else
{
char sysdir[MAX_PATH+1];