Bugfix: really *do* switch to the initial task's stack.

CallLargeStack mechanism re-enabled.
This commit is contained in:
Ulrich Weigand 1998-11-08 12:07:36 +00:00 committed by Alexandre Julliard
parent 3a230263ac
commit e8b02745e3
3 changed files with 90 additions and 85 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}