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.
diff --git a/dlls/user/user.spec b/dlls/user/user.spec
index 2a68554..f9203d0 100644
--- a/dlls/user/user.spec
+++ b/dlls/user/user.spec
@@ -362,7 +362,7 @@
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 374593b..ff9fdda 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -67,8 +67,6 @@
/* 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,20 +94,51 @@
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
*
* Load a built-in module.
*/
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 @@
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 5825388..390ee0d 100644
--- a/include/builtin16.h
+++ b/include/builtin16.h
@@ -56,7 +56,6 @@
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 bdf6d44..2187beb 100644
--- a/tools/winebuild/spec16.c
+++ b/tools/winebuild/spec16.c
@@ -776,7 +776,6 @@
/* 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 053eb16..47a0d77 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -235,30 +235,6 @@
}
/***********************************************************************
- * 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)
*/
BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )