diff --git a/loader/main.c b/loader/main.c index 7b1e84630be..1c76b0715cb 100644 --- a/loader/main.c +++ b/loader/main.c @@ -26,6 +26,8 @@ #include "gdi.h" #include "heap.h" #include "keyboard.h" +#include "mouse.h" +#include "input.h" #include "miscemu.h" #include "options.h" #include "process.h" @@ -89,23 +91,11 @@ BOOL32 WINAPI MAIN_KernelInit(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvR { static BOOL32 initDone = FALSE; - NE_MODULE *pModule; HMODULE16 hModule; if ( initDone ) return TRUE; initDone = TRUE; - /* Create and switch to initial task */ - pModule = NE_GetPtr( GetModuleHandle16( "KERNEL32" ) ); - if ( pModule ) - { - THDB *thdb = THREAD_Current(); - HINSTANCE16 hInstance = NE_CreateInstance( pModule, NULL, TRUE ); - thdb->process->task = TASK_Create( thdb, pModule, hInstance, 0, FALSE ); - - TASK_StartTask( thdb->process->task ); - } - /* Initialize special KERNEL entry points */ hModule = GetModuleHandle16( "KERNEL" ); if ( hModule ) @@ -211,9 +201,6 @@ BOOL32 WINAPI MAIN_UserInit(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRes /* Create the DCEs */ DCE_Init(); - /* Initialize keyboard */ - if (!KEYBOARD_Init()) return FALSE; - /* Initialize window procedures */ if (!WINPROC_Init()) return FALSE; @@ -252,6 +239,12 @@ BOOL32 WINAPI MAIN_UserInit(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRes if (!SetMessageQueue32( queueSize )) return FALSE; } + /* Initialize keyboard driver */ + KEYBOARD_Enable( keybd_event, InputKeyStateTable ); + + /* Initialize mouse driver */ + MOUSE_Enable( mouse_event ); + return TRUE; } diff --git a/loader/task.c b/loader/task.c index 1bdca436685..20b430ef714 100644 --- a/loader/task.c +++ b/loader/task.c @@ -642,7 +642,6 @@ void TASK_Reschedule(void) newframe32->ebp = oldframe32->ebp; newframe32->restore_addr = oldframe32->restore_addr; newframe32->codeselector = oldframe32->codeselector; - newframe32->retaddr = oldframe32->retaddr; /* don't call TASK_CallToStart */ THREAD_Current()->cur_stack = oldframe32->frame16; } diff --git a/miscemu/main.c b/miscemu/main.c index e28d8e8e8af..750c1cc40b3 100644 --- a/miscemu/main.c +++ b/miscemu/main.c @@ -15,8 +15,12 @@ #include "win16drv.h" #include "psdrv.h" #include "thread.h" +#include "task.h" +#include "stackframe.h" #include "windows.h" +static int MAIN_argc; +static char **MAIN_argv; /*********************************************************************** * Emulator initialisation @@ -38,31 +42,77 @@ BOOL32 MAIN_EmulatorInit(void) /* Create the Postscript printer driver (FIXME: should be in Winelib) */ if (!PSDRV_Init()) return FALSE; - /* Load system DLLs into the initial process (and initialize them) */ - if (!LoadLibrary16( "KERNEL" )) return FALSE; /* always built-in */ - if (!LoadLibrary32A( "KERNEL32" )) return FALSE; /* always built-in */ - - if (!LoadLibrary16( "GDI.EXE" )) return FALSE; - if (!LoadLibrary32A( "GDI32.DLL" )) return FALSE; - - if (!LoadLibrary16( "USER.EXE" )) return FALSE; - if (!LoadLibrary32A( "USER32.DLL" )) return FALSE; - return TRUE; } - /*********************************************************************** * Main loop of initial task */ void MAIN_EmulatorRun( void ) { + char startProg[256], defProg[256]; + int i,loaded; + HINSTANCE32 handle; + BOOL32 (*WINAPI pGetMessage)(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max); BOOL32 (*WINAPI pTranslateMessage)( const MSG32* msg ); LONG (*WINAPI pDispatchMessage)( const MSG32* msg ); + HMODULE32 hModule; MSG32 msg; - HMODULE32 hModule = GetModuleHandle32A( "USER32" ); + /* Load system DLLs into the initial process (and initialize them) */ + if ( !LoadLibrary16("GDI.EXE" ) || !LoadLibrary32A("GDI32.DLL" ) + || !LoadLibrary16("USER.EXE") || !LoadLibrary32A("USER32.DLL")) + ExitProcess( 1 ); + + /* Add the Default Program if no program on the command line */ + if (!MAIN_argv[1]) + { + PROFILE_GetWineIniString( "programs", "Default", "", + defProg, sizeof(defProg) ); + if (defProg[0]) MAIN_argv[MAIN_argc++] = defProg; + } + + /* Add the Startup Program to the run list */ + PROFILE_GetWineIniString( "programs", "Startup", "", + startProg, sizeof(startProg) ); + if (startProg[0]) MAIN_argv[MAIN_argc++] = startProg; + + loaded=0; + for (i = 1; i < MAIN_argc; i++) + { + if ((handle = WinExec32( MAIN_argv[i], SW_SHOWNORMAL )) < 32) + { + MSG("wine: can't exec '%s': ", MAIN_argv[i]); + switch (handle) + { + case 2: MSG("file not found\n" ); break; + case 11: MSG("invalid exe file\n" ); break; + case 21: MSG("win32 executable\n" ); break; /* FIXME: Obsolete? */ + default: MSG("error=%d\n", handle ); break; + } + ExitProcess( 1 ); + } + loaded++; + } + + if (!loaded) { /* nothing loaded */ + MAIN_Usage(MAIN_argv[0]); + ExitProcess( 1 ); + } + + if (GetNumTasks() <= 1) + { + MSG("wine: no executable file found.\n" ); + ExitProcess( 0 ); + } + + if (Options.debug) DEBUG_AddModuleBreakpoints(); + + + /* Start message loop for desktop window */ + + hModule = GetModuleHandle32A( "USER32" ); pGetMessage = GetProcAddress32( hModule, "GetMessageA" ); pTranslateMessage = GetProcAddress32( hModule, "TranslateMessage" ); pDispatchMessage = GetProcAddress32( hModule, "DispatchMessageA" ); @@ -86,12 +136,12 @@ void MAIN_EmulatorRun( void ) */ int main( int argc, char *argv[] ) { + NE_MODULE *pModule; + HINSTANCE16 hInstance; extern char * DEBUG_argv0; - char startProg[256], defProg[256]; - int i,loaded; - HINSTANCE32 handle; __winelib = 0; /* First of all, clear the Winelib flag */ + ctx_debug_call = ctx_debug; /* * Save this so that the internal debugger can get a hold of it if @@ -104,9 +154,9 @@ int main( int argc, char *argv[] ) /* Parse command-line */ if (!MAIN_WineInit( &argc, argv )) return 1; + MAIN_argc = argc; MAIN_argv = argv; /* Handle -dll option (hack) */ - if (Options.dllFlags) { if (!BUILTIN_ParseDLLOptions( Options.dllFlags )) @@ -119,62 +169,25 @@ int main( int argc, char *argv[] ) } /* Initialize everything */ - if (!MAIN_EmulatorInit()) return 1; + /* Load kernel modules */ + if (!LoadLibrary16( "KERNEL" )) return 1; + if (!LoadLibrary32A( "KERNEL32" )) return 1; + + /* Create initial task */ + if ( !(pModule = NE_GetPtr( GetModuleHandle16( "KERNEL32" ) )) ) return 1; + hInstance = NE_CreateInstance( pModule, NULL, TRUE ); + PROCESS_Current()->task = TASK_Create( THREAD_Current(), pModule, hInstance, 0, FALSE ); + /* Initialize CALL32 routines */ - /* This needs to be done just before task-switching starts */ - - loaded=0; - - /* Add the Default Program if no program on the command line */ - if (!argv[1]) - { - PROFILE_GetWineIniString( "programs", "Default", "", - defProg, sizeof(defProg) ); - if (defProg[0]) argv[argc++] = defProg; - } - - /* Add the Startup Program to the run list */ - PROFILE_GetWineIniString( "programs", "Startup", "", - startProg, sizeof(startProg) ); - if (startProg[0]) argv[argc++] = startProg; - - for (i = 1; i < argc; i++) - { - if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32) - { - MSG("wine: can't exec '%s': ", argv[i]); - switch (handle) - { - case 2: MSG("file not found\n" ); break; - case 11: MSG("invalid exe file\n" ); break; - case 21: MSG("win32 executable\n" ); break; /* FIXME: Obsolete? */ - default: MSG("error=%d\n", handle ); break; - } - return 1; - } - loaded++; - } - - if (!loaded) { /* nothing loaded */ - MAIN_Usage(argv[0]); - return 1; - } - - if (!GetNumTasks()) - { - MSG("wine: no executable file found.\n" ); - return 0; - } - - if (Options.debug) DEBUG_AddModuleBreakpoints(); - - ctx_debug_call = ctx_debug; -#if 0 /* FIXME!! */ + /* This needs to be done just before switching stacks */ IF1632_CallLargeStack = (int (*)(int (*func)(), void *arg))CALL32_Init(); -#endif - MAIN_EmulatorRun(); - MSG("WinMain: Should never happen: returned from Yield16()\n" ); + + /* Switch to initial task */ + CURRENT_STACK16->frame32->retaddr = (DWORD)MAIN_EmulatorRun; + TASK_StartTask( PROCESS_Current()->task ); + MSG( "main: Should never happen: returned from TASK_StartTask()\n" ); return 0; } +