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:
parent
4d73ba6e21
commit
04689b26f0
|
@ -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,10 +94,41 @@ 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
|
||||
*
|
||||
|
@ -107,9 +136,9 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
|
|||
*/
|
||||
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 ))
|
||||
return BUILTIN_DoLoadModule16( descr );
|
||||
}
|
||||
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 ))
|
||||
return BUILTIN_DoLoadModule16( descr );
|
||||
}
|
||||
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" );
|
||||
|
|
|
@ -234,30 +234,6 @@ WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID,
|
|||
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)
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue