Added automatic registration of built-in DLLs.
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 93de025..03408c4 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -34,100 +34,12 @@
} BUILTIN16_RESOURCE;
-/* 16-bit DLLs */
-
-extern const WIN16_DESCRIPTOR AVIFILE_Descriptor;
-extern const WIN16_DESCRIPTOR COMM_Descriptor;
-extern const WIN16_DESCRIPTOR COMMDLG_Descriptor;
-extern const WIN16_DESCRIPTOR COMPOBJ_Descriptor;
-extern const WIN16_DESCRIPTOR DDEML_Descriptor;
-extern const WIN16_DESCRIPTOR DISPDIB_Descriptor;
-extern const WIN16_DESCRIPTOR DISPLAY_Descriptor;
-extern const WIN16_DESCRIPTOR GDI_Descriptor;
-extern const WIN16_DESCRIPTOR KERNEL_Descriptor;
-extern const WIN16_DESCRIPTOR KEYBOARD_Descriptor;
-extern const WIN16_DESCRIPTOR LZEXPAND_Descriptor;
-extern const WIN16_DESCRIPTOR MMSYSTEM_Descriptor;
-extern const WIN16_DESCRIPTOR MOUSE_Descriptor;
-extern const WIN16_DESCRIPTOR MSACM_Descriptor;
-extern const WIN16_DESCRIPTOR MSVIDEO_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2CONV_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2DISP_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2NLS_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2PROX_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2THK_Descriptor;
-extern const WIN16_DESCRIPTOR OLE2_Descriptor;
-extern const WIN16_DESCRIPTOR OLECLI_Descriptor;
-extern const WIN16_DESCRIPTOR OLESVR_Descriptor;
-extern const WIN16_DESCRIPTOR RASAPI16_Descriptor;
-extern const WIN16_DESCRIPTOR SHELL_Descriptor;
-extern const WIN16_DESCRIPTOR SOUND_Descriptor;
-extern const WIN16_DESCRIPTOR STORAGE_Descriptor;
-extern const WIN16_DESCRIPTOR STRESS_Descriptor;
-extern const WIN16_DESCRIPTOR SYSTEM_Descriptor;
-extern const WIN16_DESCRIPTOR TOOLHELP_Descriptor;
-extern const WIN16_DESCRIPTOR TYPELIB_Descriptor;
-extern const WIN16_DESCRIPTOR USER_Descriptor;
-extern const WIN16_DESCRIPTOR VER_Descriptor;
-extern const WIN16_DESCRIPTOR W32SYS_Descriptor;
-extern const WIN16_DESCRIPTOR WIN32S16_Descriptor;
-extern const WIN16_DESCRIPTOR WIN87EM_Descriptor;
-extern const WIN16_DESCRIPTOR WINASPI_Descriptor;
-extern const WIN16_DESCRIPTOR WINDEBUG_Descriptor;
-extern const WIN16_DESCRIPTOR WINEPS_Descriptor;
-extern const WIN16_DESCRIPTOR WING_Descriptor;
-extern const WIN16_DESCRIPTOR WINSOCK_Descriptor;
-extern const WIN16_DESCRIPTOR WPROCS_Descriptor;
-
/* Table of all built-in DLLs */
-static const WIN16_DESCRIPTOR *BuiltinDLLs[] =
-{
- &KERNEL_Descriptor,
- &USER_Descriptor,
- &GDI_Descriptor,
- &SYSTEM_Descriptor,
- &DISPLAY_Descriptor,
- &WPROCS_Descriptor,
- &WINDEBUG_Descriptor,
- &AVIFILE_Descriptor,
- &COMMDLG_Descriptor,
- &COMPOBJ_Descriptor,
- &DDEML_Descriptor,
- &DISPDIB_Descriptor,
- &KEYBOARD_Descriptor,
- &COMM_Descriptor,
- &LZEXPAND_Descriptor,
- &MMSYSTEM_Descriptor,
- &MOUSE_Descriptor,
- &MSACM_Descriptor,
- &MSVIDEO_Descriptor,
- &OLE2CONV_Descriptor,
- &OLE2DISP_Descriptor,
- &OLE2NLS_Descriptor,
- &OLE2PROX_Descriptor,
- &OLE2THK_Descriptor,
- &OLE2_Descriptor,
- &OLECLI_Descriptor,
- &OLESVR_Descriptor,
- &RASAPI16_Descriptor,
- &SHELL_Descriptor,
- &SOUND_Descriptor,
- &STORAGE_Descriptor,
- &STRESS_Descriptor,
- &TOOLHELP_Descriptor,
- &TYPELIB_Descriptor,
- &VER_Descriptor,
- &W32SYS_Descriptor,
- &WIN32S16_Descriptor,
- &WIN87EM_Descriptor,
- &WINASPI_Descriptor,
- &WINEPS_Descriptor,
- &WING_Descriptor,
- &WINSOCK_Descriptor,
- /* Last entry */
- NULL
-};
+#define MAX_DLLS 50
+
+static const BUILTIN16_DESCRIPTOR *builtin_dlls[MAX_DLLS];
+static int nb_dlls;
/* list of DLLs that should always be loaded at startup */
static const char * const always_load[] =
@@ -145,7 +57,7 @@
* Load a built-in Win16 module. Helper function for BUILTIN_LoadModule
* and BUILTIN_Init.
*/
-static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr )
+static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DESCRIPTOR *descr )
{
NE_MODULE *pModule;
int minsize, res_off;
@@ -269,8 +181,8 @@
*/
HMODULE16 BUILTIN_LoadModule( LPCSTR name )
{
- const WIN16_DESCRIPTOR **table;
char dllname[16], *p;
+ int i;
/* Fix the name in case we have a full path and extension */
@@ -280,15 +192,15 @@
if (!p) strcat( dllname, ".dll" );
- for (table = BuiltinDLLs; *table; table++)
+ for (i = 0; i < nb_dlls; i++)
{
- NE_MODULE *pModule = (NE_MODULE *)(*table)->module_start;
- OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
- if (!lstrcmpiA( pOfs->szPathName, dllname )) break;
+ const BUILTIN16_DESCRIPTOR *descr = builtin_dlls[i];
+ NE_MODULE *pModule = (NE_MODULE *)descr->module_start;
+ OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
+ if (!lstrcmpiA( pOfs->szPathName, dllname ))
+ return BUILTIN_DoLoadModule16( descr );
}
-
- if (!*table) return (HMODULE16)2;
- return BUILTIN_DoLoadModule16( *table );
+ return (HMODULE16)2;
}
@@ -349,6 +261,18 @@
}
+/***********************************************************************
+ * BUILTIN_RegisterDLL
+ *
+ * Register a built-in DLL descriptor.
+ */
+void BUILTIN_RegisterDLL( const BUILTIN16_DESCRIPTOR *descr )
+{
+ assert( nb_dlls < MAX_DLLS );
+ builtin_dlls[nb_dlls++] = descr;
+}
+
+
/**********************************************************************
* BUILTIN_DefaultIntHandler
*
@@ -361,4 +285,3 @@
BUILTIN_GetEntryPoint16( CURRENT_STACK16, name, &ordinal );
INT_BARF( context, ordinal - FIRST_INTERRUPT_ORDINAL );
}
-