From b18dbd26c5a72b6db81e4bc76f62efc8519a1fba Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 25 Jul 2000 12:11:53 +0000 Subject: [PATCH] Perform NE_InitProcess in the context of the new task. --- files/directory.c | 12 ++++---- include/task.h | 1 - loader/ne/module.c | 65 +++++++++++++++++++++++++++++++++++-------- loader/task.c | 69 ++++++---------------------------------------- 4 files changed, 68 insertions(+), 79 deletions(-) diff --git a/files/directory.c b/files/directory.c index 546500d8685..063a83f9c2b 100644 --- a/files/directory.c +++ b/files/directory.c @@ -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 */ diff --git a/include/task.h b/include/task.h index dcc63be8fc1..5635dacb967 100644 --- a/include/task.h +++ b/include/task.h @@ -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 ); diff --git a/loader/ne/module.c b/loader/ne/module.c index 9295af92cd9..5d2bb07d2eb 100644 --- a/loader/ne/module.c +++ b/loader/ne/module.c @@ -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 ); } /*********************************************************************** diff --git a/loader/task.c b/loader/task.c index 54941fa6854..5ec6df4a716 100644 --- a/loader/task.c +++ b/loader/task.c @@ -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();