From 2f4bd6617fdd0457429260a05d9a2774ea31a6c0 Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <weigand@informatik.uni-erlangen.de>
Date: Sat, 24 Jul 1999 12:20:24 +0000
Subject: [PATCH] Unify startup sequence for Wine and WineLib.

---
 if1632/thunk.c   |   6 +-
 include/main.h   |   1 +
 loader/main.c    |  23 +++--
 misc/Makefile.in |   1 -
 misc/callback.c  | 257 -----------------------------------------------
 miscemu/main.c   |  22 +---
 6 files changed, 23 insertions(+), 287 deletions(-)
 delete mode 100644 misc/callback.c

diff --git a/if1632/thunk.c b/if1632/thunk.c
index 64e15859dc3..c7eadc21e5e 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -176,14 +176,16 @@ static const CALLBACKS_TABLE CALLBACK_EmulatorTable =
     (void *)THUNK_CallTo16_word_ww               /* CallDrvAbortProc */
 };
 
+const CALLBACKS_TABLE *Callbacks = &CALLBACK_EmulatorTable;
+
+CALLOUT_TABLE Callout = { 0 };
+
 
 /***********************************************************************
  *           THUNK_Init
  */
 BOOL THUNK_Init(void)
 {
-    /* Set the window proc calling functions */
-    Callbacks = &CALLBACK_EmulatorTable;
     /* Initialize Thunklets */
     return THUNK_ThunkletInit();
 }
diff --git a/include/main.h b/include/main.h
index ed84ca782e9..4d1acf2b33b 100644
--- a/include/main.h
+++ b/include/main.h
@@ -18,6 +18,7 @@ extern void MAIN_ParseLanguageOption( char *arg );
 extern void MAIN_ParseModeOption( char *arg );
 
 extern BOOL RELAY_Init(void);
+extern void THUNK_InitCallout(void);
 extern int RELAY_ShowDebugmsgRelay(const char *func);
 extern void CALL32_Init( void *func, void *target, void *stack );
 
diff --git a/loader/main.c b/loader/main.c
index a813f248d66..695f4c4a8af 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -46,6 +46,8 @@
 #include "task.h"
 #include "debugtools.h"
 #include "psdrv.h"
+#include "win16drv.h"
+#include "callback.h"
 #include "server.h"
 #include "cursoricon.h"
 #include "loadorder.h"
@@ -101,6 +103,9 @@ BOOL MAIN_MainInit(void)
     /* Read DOS config.sys */
     if (!DOSCONF_ReadConfig()) return FALSE;
 
+    /* Initialize relay code */
+    if (!RELAY_Init()) return FALSE;
+
     return TRUE;
 }
 
@@ -182,6 +187,8 @@ BOOL WINAPI MAIN_GdiInit(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved
     /* GDI initialisation */
     if(!GDI_Init()) return FALSE;
 
+    /* Create the Win16 printer driver */
+    if (!WIN16DRV_Init()) return FALSE;
 
     /* PSDRV initialization */
     if(!PSDRV_Init()) return FALSE;
@@ -256,9 +263,8 @@ BOOL WINAPI MAIN_UserInit(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserve
     /* Set double click time */
     SetDoubleClickTime( GetProfileIntA("windows","DoubleClickSpeed",452) );
 
-    /* Create task message queue for the initial task */
-    queueSize = GetProfileIntA( "windows", "DefaultQueueSize", 8 );
-    if (!SetMessageQueue( queueSize )) return FALSE;
+    /* Create message queue of initial thread */
+    InitThreadInput16( 0, 0 );
 
     /* Create desktop window */
     if (!WIN_CreateDesktopWindow()) return FALSE;
@@ -296,6 +302,7 @@ HINSTANCE MAIN_WinelibInit( int *argc, char *argv[] )
     if (!MAIN_MainInit()) return 0;
 
     /* Initialize KERNEL */
+    if (!LoadLibrary16(  "KERNEL" )) return 0;
     if (!LoadLibraryA( "KERNEL32" )) return 0;
 
     /* Create and switch to initial task */
@@ -311,9 +318,13 @@ HINSTANCE MAIN_WinelibInit( int *argc, char *argv[] )
 
     if (!TASK_Create( pModule, FALSE )) return 0;
 
-    /* Initialize GDI and USER */
-    if (!LoadLibraryA( "GDI32.DLL" )) return 0;
-    if (!LoadLibraryA( "USER32.DLL" )) return 0;
+    /* Load system DLLs into the initial process (and initialize them) */
+    if (   !LoadLibrary16("GDI.EXE" ) || !LoadLibraryA("GDI32.DLL" )
+        || !LoadLibrary16("USER.EXE") || !LoadLibraryA("USER32.DLL"))
+        ExitProcess( 1 );
+
+    /* Get pointers to USER routines called by KERNEL */
+    THUNK_InitCallout();
 
     return wm->module;
 }
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 405fb785e63..517ed081a40 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -7,7 +7,6 @@ VPATH     = @srcdir@
 MODULE    = misc
 
 C_SRCS = \
-	callback.c \
 	cdrom.c \
 	comm.c \
 	crtdll.c \
diff --git a/misc/callback.c b/misc/callback.c
deleted file mode 100644
index 0bfbe9f58c9..00000000000
--- a/misc/callback.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Function callbacks for the library
- *
- * Copyright 1997 Alexandre Julliard
- */
-
-#include <assert.h>
-#include "winuser.h"
-#include "callback.h"
-#include "task.h"
-#include "syslevel.h"
-#include "cursoricon.h"
-#include "user.h"
-#include "queue.h"
-#include "debugtools.h"
-#include "win.h"
-
-DEFAULT_DEBUG_CHANNEL(relay)
-
-
-/**********************************************************************
- *	     CALLBACK_CallWndProc
- */
-static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd,
-                                            UINT16 msg, WPARAM16 wParam,
-                                            LPARAM lParam )
-{
-    LRESULT retvalue;
-    int iWndsLocks;
-
-    /* To avoid any deadlocks, all the locks on the windows structures
-       must be suspended before the control is passed to the application */
-    iWndsLocks = WIN_SuspendWndsLock();
-    retvalue = proc( hwnd, msg, wParam, lParam );
-    WIN_RestoreWndsLock(iWndsLocks);
-    return retvalue;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallRegisterProc
- */
-static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT86 *context, INT offset)
-{
-    ERR("Cannot call a register proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallDriverProc
- */
-static LRESULT WINAPI CALLBACK_CallDriverProc( DRIVERPROC16 proc, DWORD dwId,
-                                               HDRVR16 hdrvr, UINT16 msg,
-                                               LPARAM lp1, LPARAM lp2 )
-{
-    ERR("Cannot call a 16-bit driver proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallDriverCallback
- */
-static LRESULT WINAPI CALLBACK_CallDriverCallback( FARPROC16 proc,
-                                                   HANDLE16 hDev, UINT16 msg,
-                                                   DWORD dwUser, LPARAM lp1,
-                                                   LPARAM lp2 )
-{
-    ERR("Cannot call a 16-bit driver proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallTimeFuncProc
- */
-static LRESULT WINAPI CALLBACK_CallTimeFuncProc( FARPROC16 proc, WORD id,
-                                                 UINT16 msg, DWORD dwUser,
-                                                 LPARAM lp1, LPARAM lp2 )
-{
-    ERR("Cannot call a 16-bit multimedia timer proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallWindowsExitProc
- */
-static INT16 WINAPI CALLBACK_CallWindowsExitProc( FARPROC16 proc, INT16 type)
-{
-    ERR("Cannot call a 16-bit WEP routine in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallWordBreakProc
- */
-static INT16 WINAPI CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc,
-                                                SEGPTR text, INT16 word,
-                                                INT16 len, INT16 action )
-{
-    ERR("Cannot call a 16-bit word break proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallBootAppProc
- */
-static void WINAPI CALLBACK_CallBootAppProc( FARPROC16 proc, HANDLE16 module,
-                                             HFILE16 file )
-{
-    ERR("Cannot call a 16-bit self-load handler in Winelib\n" );
-    assert( FALSE );
-    return;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallLoadAppSegProc
- */
-static WORD WINAPI CALLBACK_CallLoadAppSegProc( FARPROC16 proc,
-                                                HANDLE16 module, HFILE16 file,
-                                                WORD seg )
-{
-    ERR("Cannot call a 16-bit self-load handler in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *           CALLBACK_CallLocalNotifyFunc
- */
-static WORD WINAPI CALLBACK_CallLocalNotifyFunc( FARPROC16 proc,
-                                                 WORD wMsg, HLOCAL16 hMem, WORD wArg )
-{
-    ERR("Cannot call a 16-bit notification handler in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallResourceHandlerProc
- */
-static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
-                                                          HGLOBAL16 hMemObj, 
-                                                          HMODULE16 hModule,
-                                                          HRSRC16 hRsrc )
-{
-    ERR("Cannot call a 16-bit resource handler in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallASPIPostProc
- */
-static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
-{
-    ERR("Cannot call a 16-bit ASPI proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallWOWCallbackProc
- */
-static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
-{
-    ERR("Cannot call a WOW thunk proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallWOWCallback16Ex
- */
-static BOOL WINAPI CALLBACK_CallWOWCallback16Ex( FARPROC16 proc, DWORD dwFlags, 
-                                                 DWORD cbArgs, LPVOID xargs, LPDWORD pdwret )
-{
-    ERR("Cannot call a WOW thunk proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_CallUTProc
- */
-static DWORD WINAPI CALLBACK_CallUTProc( FARPROC16 proc, DWORD w1, DWORD w2 )
-{
-    ERR("Cannot call a UT thunk proc in Winelib\n" );
-    assert( FALSE );
-    return 0;
-}
-
-/**********************************************************************
- *	     CALLBACK_WinelibTable
- *
- * The callbacks function table for Winelib
- */
-static const CALLBACKS_TABLE CALLBACK_WinelibTable =
-{
-    CALLBACK_CallRegisterProc,        /* CallRegisterShortProc */
-    CALLBACK_CallRegisterProc,        /* CallRegisterLongProc */
-    NULL,                             /* CallFrom16WndProc */
-    CALLBACK_CallWndProc,             /* CallWndProc */
-    CALLBACK_CallDriverProc,          /* CallDriverProc */
-    CALLBACK_CallDriverCallback,      /* CallDriverCallback */
-    CALLBACK_CallTimeFuncProc,        /* CallTimeFuncProc */
-    CALLBACK_CallWindowsExitProc,     /* CallWindowsExitProc */
-    CALLBACK_CallWordBreakProc,       /* CallWordBreakProc */
-    CALLBACK_CallBootAppProc,         /* CallBootAppProc */
-    CALLBACK_CallLoadAppSegProc,      /* CallLoadAppSegProc */
-    CALLBACK_CallLocalNotifyFunc,     /* CallLocalNotifyFunc */
-    CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
-    CALLBACK_CallWOWCallbackProc,     /* CallWOWCallbackProc */
-    CALLBACK_CallWOWCallback16Ex,     /* CallWOWCallback16Ex */
-    CALLBACK_CallUTProc,              /* CallUTProc */
-    CALLBACK_CallASPIPostProc,        /* CallASPIPostProc */
-    /* The graphics driver callbacks are never used in Winelib */
-    NULL,                             /* CallDrvControlProc */
-    NULL,                             /* CallDrvEnableProc */
-    NULL,                             /* CallDrvEnumDFontsProc */
-    NULL,                             /* CallDrvEnumObjProc */
-    NULL,                             /* CallDrvOutputProc */
-    NULL,                             /* CallDrvRealizeProc */
-    NULL,                             /* CallDrvStretchBltProc */
-    NULL,                             /* CallDrvExtTextOutProc */
-    NULL,                             /* CallDrvGetCharWidth */
-    NULL                              /* CallDrvAbortProc */
-};
-
-const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
-
-
-/**********************************************************************
- *	     CALLOUT_Table
- *
- * The callout function table for Winelib
- */
-
-CALLOUT_TABLE Callout = 
-{
-    PeekMessage16, PeekMessageA, PeekMessageW,
-    GetMessage16, GetMessageA, GetMessageW,
-    SendMessage16, SendMessageA, SendMessageW,
-    PostMessage16, PostMessageA, PostMessageW,
-    PostAppMessage16, PostThreadMessageA, PostThreadMessageW,
-    TranslateMessage16, TranslateMessage,
-    DispatchMessage16, DispatchMessageA, DispatchMessageW,
-    RedrawWindow16, RedrawWindow,
-    UserSignalProc,
-    InitApp16, InitThreadInput16,
-    UserYield16,
-    CURSORICON_Destroy
-};
-
diff --git a/miscemu/main.c b/miscemu/main.c
index 8c8ce209097..0e1ec925abe 100644
--- a/miscemu/main.c
+++ b/miscemu/main.c
@@ -10,7 +10,6 @@
 #include "debugger.h"
 #include "main.h"
 #include "miscemu.h"
-#include "win16drv.h"
 #include "module.h"
 #include "options.h"
 #include "process.h"
@@ -24,30 +23,11 @@ static int MAIN_argc;
 static char **MAIN_argv;
 
 
-/***********************************************************************
- *           Emulator initialisation
- */
-BOOL MAIN_EmulatorInit(void)
-{
-    /* Main initialization */
-    if (!MAIN_MainInit()) return FALSE;
-
-    /* Initialize relay code */
-    if (!RELAY_Init()) return FALSE;
-
-    /* Create the Win16 printer driver */
-    if (!WIN16DRV_Init()) return FALSE;
-
-    return TRUE;
-}
-
-
 /***********************************************************************
  *           Main loop of initial task
  */
 void MAIN_EmulatorRun( void )
 {
-    extern void THUNK_InitCallout( void );
     char startProg[256], defProg[256];
     HINSTANCE handle;
     int i, tasks = 0;
@@ -148,7 +128,7 @@ int main( int argc, char *argv[] )
         TASK_AddTaskEntryBreakpoint = DEBUG_AddTaskEntryBreakpoint;
 
     /* Initialize everything */
-    if (!MAIN_EmulatorInit()) return 1;
+    if (!MAIN_MainInit()) return 1;
 
     /* Load kernel modules */
     if (!LoadLibrary16(  "KERNEL" )) return 1;
-- 
GitLab