diff --git a/dlls/user/user.spec b/dlls/user/user.spec index 2a685543c37..f9203d0ad94 100644 --- a/dlls/user/user.spec +++ b/dlls/user/user.spec @@ -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 diff --git a/if1632/builtin.c b/if1632/builtin.c index 374593bca30..ff9fddaeaf2 100644 --- a/if1632/builtin.c +++ b/if1632/builtin.c @@ -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 ); } diff --git a/include/builtin16.h b/include/builtin16.h index 5825388e528..390ee0dfc4f 100644 --- a/include/builtin16.h +++ b/include/builtin16.h @@ -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 */ diff --git a/tools/winebuild/spec16.c b/tools/winebuild/spec16.c index bdf6d44ed1e..2187beb9ad6 100644 --- a/tools/winebuild/spec16.c +++ b/tools/winebuild/spec16.c @@ -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" ); diff --git a/windows/user.c b/windows/user.c index 053eb161659..47a0d77adc5 100644 --- a/windows/user.c +++ b/windows/user.c @@ -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) */