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 ...@@ -362,7 +362,7 @@ rsrc resources/version16.res
371 pascal16 SetWindowPlacement(word ptr) SetWindowPlacement16 371 pascal16 SetWindowPlacement(word ptr) SetWindowPlacement16
372 stub GetInternalIconHeader 372 stub GetInternalIconHeader
373 pascal16 SubtractRect(ptr ptr ptr) SubtractRect16 373 pascal16 SubtractRect(ptr ptr ptr) SubtractRect16
374 pascal DllEntryPoint(long word word word long word) USER_DllEntryPoint #374 DllEntryPoint
375 stub DrawTextEx 375 stub DrawTextEx
376 stub SetMessageExtraInfo 376 stub SetMessageExtraInfo
378 stub SetPropEx 378 stub SetPropEx
......
...@@ -67,8 +67,6 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr ) ...@@ -67,8 +67,6 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
/* NOTE: (Ab)use the hRsrcMap parameter for resource data pointer */ /* NOTE: (Ab)use the hRsrcMap parameter for resource data pointer */
pModule->hRsrcMap = (void *)descr->rsrc; pModule->hRsrcMap = (void *)descr->rsrc;
TRACE( "Built-in %s: hmodule=%04x\n", descr->name, hModule );
/* Allocate the code segment */ /* Allocate the code segment */
pSegTable = NE_SEG_TABLE( pModule ); pSegTable = NE_SEG_TABLE( pModule );
...@@ -96,20 +94,51 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr ) ...@@ -96,20 +94,51 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
if (descr->rsrc) NE_InitResourceHandler(hModule); if (descr->rsrc) NE_InitResourceHandler(hModule);
NE_RegisterModule( pModule ); NE_RegisterModule( pModule );
/* make sure the 32-bit library containing this one is loaded too */
LoadLibraryA( descr->owner );
return hModule; 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 * BUILTIN_LoadModule
* *
* Load a built-in module. * Load a built-in module.
*/ */
HMODULE16 BUILTIN_LoadModule( LPCSTR name ) HMODULE16 BUILTIN_LoadModule( LPCSTR name )
{ {
const BUILTIN16_DESCRIPTOR *descr;
char dllname[20], *p; char dllname[20], *p;
void *handle; void *handle;
int i;
/* Fix the name in case we have a full path and extension */ /* Fix the name in case we have a full path and extension */
...@@ -123,25 +152,14 @@ HMODULE16 BUILTIN_LoadModule( LPCSTR name ) ...@@ -123,25 +152,14 @@ HMODULE16 BUILTIN_LoadModule( LPCSTR name )
if (!p) strcat( dllname, ".dll" ); if (!p) strcat( dllname, ".dll" );
for (p = dllname; *p; p++) *p = FILE_tolower(*p); for (p = dllname; *p; p++) *p = FILE_tolower(*p);
for (i = 0; i < nb_dlls; i++) if ((descr = find_dll_descr( dllname )))
{ return BUILTIN_DoLoadModule16( descr );
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 ))
return BUILTIN_DoLoadModule16( descr );
}
if ((handle = BUILTIN32_dlopen( dllname ))) if ((handle = BUILTIN32_dlopen( dllname )))
{ {
for (i = 0; i < nb_dlls; i++) if ((descr = find_dll_descr( dllname )))
{ return BUILTIN_DoLoadModule16( descr );
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 ))
return BUILTIN_DoLoadModule16( descr );
}
ERR( "loaded .so but dll %s still not found\n", dllname ); ERR( "loaded .so but dll %s still not found\n", dllname );
BUILTIN32_dlclose( handle ); BUILTIN32_dlclose( handle );
} }
......
...@@ -56,7 +56,6 @@ typedef struct ...@@ -56,7 +56,6 @@ typedef struct
typedef struct typedef struct
{ {
const char *name; /* DLL name */
void *module_start; /* 32-bit address of the module data */ void *module_start; /* 32-bit address of the module data */
int module_size; /* Size of the module data */ int module_size; /* Size of the module data */
void *code_start; /* 32-bit address of DLL code */ void *code_start; /* 32-bit address of DLL code */
......
...@@ -776,7 +776,6 @@ void BuildSpec16File( FILE *outfile ) ...@@ -776,7 +776,6 @@ void BuildSpec16File( FILE *outfile )
/* Output the DLL descriptor */ /* Output the DLL descriptor */
fprintf( outfile, "\nstatic const BUILTIN16_DESCRIPTOR descriptor = \n{\n" ); fprintf( outfile, "\nstatic const BUILTIN16_DESCRIPTOR descriptor = \n{\n" );
fprintf( outfile, " \"%s\",\n", DLLName );
fprintf( outfile, " Module,\n" ); fprintf( outfile, " Module,\n" );
fprintf( outfile, " sizeof(Module),\n" ); fprintf( outfile, " sizeof(Module),\n" );
fprintf( outfile, " &Code_Segment,\n" ); fprintf( outfile, " &Code_Segment,\n" );
......
...@@ -235,30 +235,6 @@ WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID, ...@@ -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) * ExitWindows (USER.7)
*/ */
BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved ) 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