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.
This commit is contained in:
Alexandre Julliard 2001-03-28 01:47:28 +00:00
parent 4d73ba6e21
commit 04689b26f0
5 changed files with 38 additions and 46 deletions

View File

@ -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

View File

@ -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,10 +94,41 @@ 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
* *
@ -107,9 +136,9 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
*/ */
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 )
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 );
} }

View File

@ -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 */

View File

@ -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" );

View File

@ -234,30 +234,6 @@ WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID,
return 0; return 0;
} }
/***********************************************************************
* 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)
*/ */