Bugfix: really *do* switch to the initial task's stack.
CallLargeStack mechanism re-enabled.
This commit is contained in:
parent
3a230263ac
commit
e8b02745e3
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
151
miscemu/main.c
151
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue