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 )