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
|
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 )
|
||||||
/* 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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 )
|
||||||
/* 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" );
|
||||||
|
|
|
@ -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)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue