Perform NE_InitProcess in the context of the new task.

This commit is contained in:
Alexandre Julliard 2000-07-25 12:11:53 +00:00
parent 37b51f4acc
commit b18dbd26c5
4 changed files with 68 additions and 79 deletions

View File

@ -25,7 +25,6 @@
#include "wingdi.h"
#include "wine/winuser16.h"
#include "winerror.h"
#include "process.h"
#include "drive.h"
#include "file.h"
#include "heap.h"
@ -509,17 +508,16 @@ done:
*
* Helper function for DIR_SearchPath.
*/
static BOOL DIR_TryModulePath( LPCSTR name, DOS_FULL_NAME *full_name )
static BOOL DIR_TryModulePath( LPCSTR name, DOS_FULL_NAME *full_name, BOOL win32 )
{
PDB *pdb = PROCESS_Current();
/* FIXME: for now, GetModuleFileNameA can't return more */
/* than OFS_MAXPATHNAME. This may change with Win32. */
char buffer[OFS_MAXPATHNAME];
LPSTR p;
if (pdb->flags & PDB32_WIN16_PROC) {
if (!win32)
{
if (!GetCurrentTask()) return FALSE;
if (!GetModuleFileName16( GetCurrentTask(), buffer, sizeof(buffer) ))
buffer[0]='\0';
@ -595,7 +593,7 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
/* Try the path of the current executable (for Win32 search order) */
if (win32 && DIR_TryModulePath( name, full_name )) goto done;
if (win32 && DIR_TryModulePath( name, full_name, win32 )) goto done;
/* Try the current directory */
@ -613,7 +611,7 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
/* Try the path of the current executable (for Win16 search order) */
if (!win32 && DIR_TryModulePath( name, full_name )) goto done;
if (!win32 && DIR_TryModulePath( name, full_name, win32 )) goto done;
/* Try all directories in path */

View File

@ -149,7 +149,6 @@ extern BOOL TASK_Create( struct _NE_MODULE *pModule, UINT16 cmdShow,
extern void TASK_KillTask( HTASK16 hTask );
extern HTASK16 TASK_GetNextTask( HTASK16 hTask );
extern void TASK_Reschedule(void);
extern void TASK_CallToStart(void);
extern void TASK_InstallTHHook( THHOOK *pNewThook );
extern void TASK_CallTaskSignalProc( UINT16 uCode, HANDLE16 hTaskOrModule );

View File

@ -39,7 +39,7 @@ static NE_MODULE *pCachedModule = 0; /* Module cached by NE_OpenFile */
static HINSTANCE16 NE_LoadModule( LPCSTR name, BOOL lib_only );
static BOOL16 NE_FreeModule( HMODULE16 hModule, BOOL call_wep );
static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask );
static void NE_InitProcess(void) WINE_NORETURN;
static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_only );
@ -997,9 +997,11 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
TEB *teb = NULL;
BOOL lib_only = !paramBlock || (paramBlock == (LPVOID)-1);
LOADPARAMS16 *params;
HINSTANCE16 instance;
HINSTANCE16 instance = 0;
HMODULE16 hModule;
NE_MODULE *pModule;
HTASK hTask;
TDB *pTask;
LPSTR cmdline;
WORD cmdShow;
int socket;
@ -1050,7 +1052,7 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
CloseHandle( req->handle );
if (!(teb = THREAD_Create( socket, 0, FALSE ))) goto error;
teb->startup = TASK_CallToStart;
teb->startup = NE_InitProcess;
/* Create a task for this process */
@ -1059,13 +1061,22 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
cmdline = PTR_SEG_TO_LIN( params->cmdLine );
if (!TASK_Create( pModule, cmdShow, teb, cmdline + 1, *cmdline )) goto error;
if ((instance = NE_InitProcess( pModule, teb->htask16 )) < 32) goto error;
hTask = teb->htask16;
if (SYSDEPS_SpawnThread( teb ) == -1) goto error;
/* Post event to start the task */
PostEvent16( teb->htask16 );
OldYield16();
PostEvent16( hTask );
/* Wait until we get the instance handle */
do
{
DirectedYield16( hTask );
if (!IsTask16( hTask )) break;
if (!(pTask = (TDB *)GlobalLock16( hTask ))) break;
instance = pTask->hInstance;
GlobalUnlock16( hTask );
} while (!instance);
return instance;
@ -1079,11 +1090,11 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
/**********************************************************************
* NE_InitProcess
*/
static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask )
static void NE_InitProcess(void)
{
TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
NE_MODULE *pModule = NE_GetPtr( pTask->hModule );
HINSTANCE16 hInstance, hPrevInstance;
TDB *pTask;
SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
WORD sp;
@ -1116,9 +1127,10 @@ static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask )
if ( hInstance >= 32 )
{
CONTEXT86 context;
/* Enter instance handles into task struct */
pTask = (TDB *)GlobalLock16( hTask );
pTask->hInstance = hInstance;
pTask->hPrevInstance = hPrevInstance;
@ -1129,10 +1141,41 @@ static HINSTANCE16 NE_InitProcess( NE_MODULE *pModule, HTASK hTask )
sp &= ~1;
sp -= sizeof(STACK16FRAME);
pTask->teb->cur_stack = PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel16(hInstance), sp );
/* Registers at initialization must be:
* ax zero
* bx stack size in bytes
* cx heap size in bytes
* si previous app instance
* di current app instance
* bp zero
* es selector to the PSP
* ds dgroup of the application
* ss stack selector
* sp top of the stack
*/
memset( &context, 0, sizeof(context) );
CS_reg(&context) = GlobalHandleToSel16(pSegTable[pModule->cs - 1].hSeg);
DS_reg(&context) = GlobalHandleToSel16(pTask->hInstance);
ES_reg(&context) = pTask->hPDB;
EIP_reg(&context) = pModule->ip;
EBX_reg(&context) = pModule->stack_size;
ECX_reg(&context) = pModule->heap_size;
EDI_reg(&context) = pTask->hInstance;
ESI_reg(&context) = pTask->hPrevInstance;
/* Now call 16-bit entry point */
TRACE("Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x\n",
CS_reg(&context), EIP_reg(&context), DS_reg(&context),
SELECTOROF(pTask->teb->cur_stack),
OFFSETOF(pTask->teb->cur_stack) );
ExitThread( Callbacks->CallRegisterShortProc( &context, 0 ) );
}
SYSLEVEL_LeaveWin16Lock();
return hInstance;
ExitThread( hInstance );
}
/***********************************************************************

View File

@ -212,57 +212,6 @@ static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
}
/***********************************************************************
* TASK_CallToStart
*
* 32-bit entry point for a new task. This function is responsible for
* setting up the registers and jumping to the 16-bit entry point.
*/
void TASK_CallToStart(void)
{
TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
NE_MODULE *pModule = NE_GetPtr( pTask->hModule );
SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
CONTEXT86 context;
SYSLEVEL_EnterWin16Lock();
/* Add task to 16-bit scheduler pool if necessary */
if ( hCurrentTask != GetCurrentTask() )
TASK_Reschedule();
/* Registers at initialization must be:
* ax zero
* bx stack size in bytes
* cx heap size in bytes
* si previous app instance
* di current app instance
* bp zero
* es selector to the PSP
* ds dgroup of the application
* ss stack selector
* sp top of the stack
*/
memset( &context, 0, sizeof(context) );
CS_reg(&context) = GlobalHandleToSel16(pSegTable[pModule->cs - 1].hSeg);
DS_reg(&context) = GlobalHandleToSel16(pTask->hInstance);
ES_reg(&context) = pTask->hPDB;
EIP_reg(&context) = pModule->ip;
EBX_reg(&context) = pModule->stack_size;
ECX_reg(&context) = pModule->heap_size;
EDI_reg(&context) = pTask->hInstance;
ESI_reg(&context) = pTask->hPrevInstance;
TRACE("Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x\n",
CS_reg(&context), EIP_reg(&context), DS_reg(&context),
SELECTOROF(pTask->teb->cur_stack),
OFFSETOF(pTask->teb->cur_stack) );
Callbacks->CallRegisterShortProc( &context, 0 );
}
/***********************************************************************
* TASK_Create
*
@ -287,18 +236,18 @@ BOOL TASK_Create( NE_MODULE *pModule, UINT16 cmdShow, TEB *teb, LPCSTR cmdline,
/* Fill the task structure */
pTask->nEvents = 0;
pTask->hSelf = hTask;
pTask->flags = 0;
pTask->hSelf = hTask;
if (teb->tibflags & TEBF_WIN32) pTask->flags |= TDBF_WIN32;
if (teb->tibflags & TEBF_WIN32)
{
pTask->flags |= TDBF_WIN32;
pTask->hInstance = pModule->self;
pTask->hPrevInstance = 0;
/* NOTE: for 16-bit tasks, the instance handles are updated later on
in NE_InitProcess */
}
if (pModule->lpDosTask) pTask->flags |= TDBF_WINOLDAP;
pTask->hInstance = pModule->self;
pTask->hPrevInstance = 0;
/* NOTE: for 16-bit tasks, the instance handles are updated later on
in NE_InitProcess */
pTask->version = pModule->expected_version;
pTask->hModule = pModule->self;
pTask->hParent = GetCurrentTask();