Commit 04689b26 authored by Alexandre Julliard's avatar Alexandre Julliard

Always load the 32-bit dll containing a given 16-bit builtin.

Check the module name in addition to the file name when loading a 16-bit builtin dll.
parent 4d73ba6e
......@@ -362,7 +362,7 @@ rsrc resources/version16.res
371 pascal16 SetWindowPlacement(word ptr) SetWindowPlacement16
372 stub GetInternalIconHeader
373 pascal16 SubtractRect(ptr ptr ptr) SubtractRect16
374 pascal DllEntryPoint(long word word word long word) USER_DllEntryPoint
#374 DllEntryPoint
375 stub DrawTextEx
376 stub SetMessageExtraInfo
378 stub SetPropEx
......
......@@ -67,8 +67,6 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
/* NOTE: (Ab)use the hRsrcMap parameter for resource data pointer */
pModule->hRsrcMap = (void *)descr->rsrc;
TRACE( "Built-in %s: hmodule=%04x\n", descr->name, hModule );
/* Allocate the code segment */
pSegTable = NE_SEG_TABLE( pModule );
......@@ -96,20 +94,51 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
if (descr->rsrc) NE_InitResourceHandler(hModule);
NE_RegisterModule( pModule );
/* make sure the 32-bit library containing this one is loaded too */
LoadLibraryA( descr->owner );
return hModule;
}
/***********************************************************************
* find_dll_descr
*
* Find a descriptor in the list
*/
static const BUILTIN16_DESCRIPTOR *find_dll_descr( const char *dllname )
{
int i;
for (i = 0; i < nb_dlls; i++)
{
const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
BYTE *name_table = (BYTE *)pModule + pModule->name_table;
/* check the dll file name */
if (!FILE_strcasecmp( pOfs->szPathName, dllname ))
return descr;
/* check the dll module name (without extension) */
if (!FILE_strncasecmp( dllname, name_table+1, *name_table ) &&
!strcmp( dllname + *name_table, ".dll" ))
return descr;
}
return NULL;
}
/***********************************************************************
* BUILTIN_LoadModule
*
* Load a built-in module.
*/
HMODULE16 BUILTIN_LoadModule( LPCSTR name )
{
const BUILTIN16_DESCRIPTOR *descr;
char dllname[20], *p;
void *handle;
int i;
/* Fix the name in case we have a full path and extension */
......@@ -123,25 +152,14 @@ HMODULE16 BUILTIN_LoadModule( LPCSTR name )
if (!p) strcat( dllname, ".dll" );
for (p = dllname; *p; p++) *p = FILE_tolower(*p);
for (i = 0; i < nb_dlls; i++)
{
const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
if (!FILE_strcasecmp( pOfs->szPathName, dllname ))
if ((descr = find_dll_descr( dllname )))
return BUILTIN_DoLoadModule16( descr );
}
if ((handle = BUILTIN32_dlopen( dllname )))
{
for (i = 0; i < nb_dlls; i++)
{
const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
if (!FILE_strcasecmp( pOfs->szPathName, dllname ))
if ((descr = find_dll_descr( dllname )))
return BUILTIN_DoLoadModule16( descr );
}
ERR( "loaded .so but dll %s still not found\n", dllname );
BUILTIN32_dlclose( handle );
}
......
......@@ -56,7 +56,6 @@ typedef struct
typedef struct
{
const char *name; /* DLL name */
void *module_start; /* 32-bit address of the module data */
int module_size; /* Size of the module data */
void *code_start; /* 32-bit address of DLL code */
......
......@@ -776,7 +776,6 @@ void BuildSpec16File( FILE *outfile )
/* Output the DLL descriptor */
fprintf( outfile, "\nstatic const BUILTIN16_DESCRIPTOR descriptor = \n{\n" );
fprintf( outfile, " \"%s\",\n", DLLName );
fprintf( outfile, " Module,\n" );
fprintf( outfile, " sizeof(Module),\n" );
fprintf( outfile, " &Code_Segment,\n" );
......
......@@ -235,30 +235,6 @@ WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID,
}
/***********************************************************************
* DllEntryPoint (USER.374)
*/
BOOL WINAPI USER_DllEntryPoint( DWORD dwReason, HINSTANCE hInstDLL, WORD ds,
WORD wHeapSize, DWORD dwReserved1, WORD wReserved2 )
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
/*
* We need to load the 32-bit library so as to be able
* to access the system resources stored there!
*/
if ( !LoadLibraryA("USER32.DLL") )
{
ERR_(win)( "Could not load USER32.DLL\n" );
return FALSE;
}
}
return TRUE;
}
/***********************************************************************
* ExitWindows (USER.7)
*/
BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment