mirror of
https://github.com/reactos/wine.git
synced 2025-02-08 13:18:12 +00:00
Moved remaining initialisations to the new process context.
Shuffled things around a bit in PROCESS_Start to avoid deadlocks. Changed PROCESS_CallUserSignalProc to avoid accessing another process address space.
This commit is contained in:
parent
d2b7a0ba65
commit
463fd4ffb1
@ -176,47 +176,27 @@ PDB *PROCESS_IdToPDB( DWORD id )
|
||||
* USIG_FLAGS_FAULT
|
||||
* The signal is being sent due to a fault.
|
||||
*/
|
||||
void PROCESS_CallUserSignalProc( UINT uCode, DWORD dwThreadOrProcessId, HMODULE hModule )
|
||||
static void PROCESS_CallUserSignalProcHelper( UINT uCode, DWORD dwThreadOrProcessId,
|
||||
HMODULE hModule, DWORD flags, DWORD startup_flags )
|
||||
{
|
||||
PDB *pdb;
|
||||
STARTUPINFOA *startup;
|
||||
DWORD dwFlags = 0;
|
||||
|
||||
/* Get thread or process ID */
|
||||
|
||||
if ( dwThreadOrProcessId == 0 )
|
||||
{
|
||||
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
|
||||
dwThreadOrProcessId = GetCurrentThreadId();
|
||||
else
|
||||
dwThreadOrProcessId = GetCurrentProcessId();
|
||||
}
|
||||
|
||||
/* Determine dwFlags */
|
||||
|
||||
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
|
||||
pdb = PROCESS_Current();
|
||||
else
|
||||
pdb = PROCESS_IdToPDB( dwThreadOrProcessId );
|
||||
if ( !(flags & PDB32_WIN16_PROC) ) dwFlags |= USIG_FLAGS_WIN32;
|
||||
|
||||
startup = pdb->env_db? pdb->env_db->startup_info : NULL;
|
||||
|
||||
if ( !(pdb->flags & PDB32_WIN16_PROC) )
|
||||
dwFlags |= USIG_FLAGS_WIN32;
|
||||
|
||||
if ( !(pdb->flags & PDB32_CONSOLE_PROC) )
|
||||
dwFlags |= USIG_FLAGS_GUI;
|
||||
if ( !(flags & PDB32_CONSOLE_PROC) ) dwFlags |= USIG_FLAGS_GUI;
|
||||
|
||||
if ( dwFlags & USIG_FLAGS_GUI )
|
||||
{
|
||||
/* Feedback defaults to ON */
|
||||
if ( !(startup && (startup->dwFlags & STARTF_FORCEOFFFEEDBACK)) )
|
||||
if ( !(startup_flags & STARTF_FORCEOFFFEEDBACK) )
|
||||
dwFlags |= USIG_FLAGS_FEEDBACK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Feedback defaults to OFF */
|
||||
if ( startup && (startup->dwFlags & STARTF_FORCEONFEEDBACK) )
|
||||
if (startup_flags & STARTF_FORCEONFEEDBACK)
|
||||
dwFlags |= USIG_FLAGS_FEEDBACK;
|
||||
}
|
||||
|
||||
@ -231,6 +211,22 @@ void PROCESS_CallUserSignalProc( UINT uCode, DWORD dwThreadOrProcessId, HMODULE
|
||||
Callout.UserSignalProc( uCode, dwThreadOrProcessId, dwFlags, hModule );
|
||||
}
|
||||
|
||||
/* Call USER signal proc for the current thread/process */
|
||||
void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
|
||||
{
|
||||
DWORD dwThreadOrProcessId;
|
||||
|
||||
/* Get thread or process ID */
|
||||
if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT )
|
||||
dwThreadOrProcessId = GetCurrentThreadId();
|
||||
else
|
||||
dwThreadOrProcessId = GetCurrentProcessId();
|
||||
|
||||
PROCESS_CallUserSignalProcHelper( uCode, dwThreadOrProcessId, hModule,
|
||||
PROCESS_Current()->flags,
|
||||
PROCESS_Current()->env_db->startup_info->dwFlags );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* PROCESS_BuildEnvDB
|
||||
@ -321,15 +317,17 @@ static BOOL PROCESS_CreateEnvDB(void)
|
||||
struct init_process_reply reply;
|
||||
STARTUPINFOA *startup;
|
||||
ENVDB *env_db;
|
||||
char cmd_line[4096];
|
||||
int len;
|
||||
PDB *pdb = PROCESS_Current();
|
||||
|
||||
/* Retrieve startup info from the server */
|
||||
|
||||
req.dummy = 0;
|
||||
CLIENT_SendRequest( REQ_INIT_PROCESS, -1, 1, &req, sizeof(req) );
|
||||
if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) return FALSE;
|
||||
if (CLIENT_WaitReply( &len, NULL, 2, &reply, sizeof(reply), cmd_line, sizeof(cmd_line) ))
|
||||
return FALSE;
|
||||
|
||||
#if 0
|
||||
/* Allocate the env DB */
|
||||
|
||||
if (!(env_db = HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB) )))
|
||||
@ -340,25 +338,22 @@ static BOOL PROCESS_CreateEnvDB(void)
|
||||
/* Allocate and fill the startup info */
|
||||
if (!(startup = HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(STARTUPINFOA) )))
|
||||
return FALSE;
|
||||
pdb->env_db->startup_info = startup;
|
||||
#else
|
||||
startup = pdb->env_db->startup_info;
|
||||
#endif
|
||||
startup->dwFlags = reply.start_flags;
|
||||
pdb->env_db->hStdin = startup->hStdInput = reply.hstdin;
|
||||
pdb->env_db->hStdout = startup->hStdOutput = reply.hstdout;
|
||||
pdb->env_db->hStderr = startup->hStdError = reply.hstderr;
|
||||
env_db->startup_info = startup;
|
||||
startup->dwFlags = reply.start_flags;
|
||||
startup->wShowWindow = reply.cmd_show;
|
||||
env_db->hStdin = startup->hStdInput = reply.hstdin;
|
||||
env_db->hStdout = startup->hStdOutput = reply.hstdout;
|
||||
env_db->hStderr = startup->hStdError = reply.hstderr;
|
||||
|
||||
#if 0 /* FIXME */
|
||||
/* Copy the parent environment */
|
||||
|
||||
if (!ENV_InheritEnvironment( pdb, env )) return FALSE;
|
||||
if (!ENV_InheritEnvironment( pdb, reply.env_ptr )) return FALSE;
|
||||
|
||||
/* Copy the command line */
|
||||
|
||||
if (!(pdb->env_db->cmd_line = HEAP_strdupA( pdb->heap, 0, cmd_line )))
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -474,22 +469,20 @@ void PROCESS_Start(void)
|
||||
/* FIXME: this is a hack */
|
||||
pdb->modref_list = PROCESS_Initial()->modref_list;
|
||||
|
||||
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0, 0 ); /* for initial thread */
|
||||
|
||||
/* Initialize the critical section */
|
||||
InitializeCriticalSection( &pdb->crit_section );
|
||||
|
||||
#if 0
|
||||
/* Create the heap */
|
||||
|
||||
if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, header->SizeOfHeapReserve,
|
||||
header->SizeOfHeapCommit ))) goto error;
|
||||
pdb->heap_list = pdb->heap;
|
||||
#endif
|
||||
|
||||
/* Create the environment db */
|
||||
if (!PROCESS_CreateEnvDB()) goto error;
|
||||
|
||||
PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 ); /* for initial thread */
|
||||
|
||||
/* Create a task for this process */
|
||||
if (pdb->env_db->startup_info->dwFlags & STARTF_USESHOWWINDOW)
|
||||
cmdShow = pdb->env_db->startup_info->wShowWindow;
|
||||
@ -498,7 +491,18 @@ void PROCESS_Start(void)
|
||||
/* Link the task in the task list */
|
||||
TASK_StartTask( pdb->task );
|
||||
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0, 0 );
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0 );
|
||||
|
||||
/* Signal the parent process to continue */
|
||||
SetEvent( pdb->load_done_evt );
|
||||
CloseHandle( pdb->load_done_evt );
|
||||
pdb->load_done_evt = INVALID_HANDLE_VALUE;
|
||||
|
||||
/* Send the debug event to the debugger */
|
||||
entry = (LPTHREAD_START_ROUTINE)RVA_PTR(pModule->module32,
|
||||
OptionalHeader.AddressOfEntryPoint);
|
||||
if (pdb->flags & PDB32_DEBUGGED)
|
||||
DEBUG_SendCreateProcessEvent( -1 /*FIXME*/, pModule->module32, entry );
|
||||
|
||||
/* Create 32-bit MODREF */
|
||||
if (!PE_CreateModule( pModule->module32, ofs, 0, FALSE )) goto error;
|
||||
@ -507,7 +511,7 @@ void PROCESS_Start(void)
|
||||
assert( pdb->exe_modref );
|
||||
pdb->exe_modref->refCount++;
|
||||
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0, 0 ); /* FIXME: correct location? */
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0 ); /* FIXME: correct location? */
|
||||
|
||||
/* Initialize thread-local storage */
|
||||
|
||||
@ -516,24 +520,13 @@ void PROCESS_Start(void)
|
||||
if ( pdb->flags & PDB32_CONSOLE_PROC )
|
||||
AllocConsole();
|
||||
|
||||
/* Signal the parent process to continue */
|
||||
SetEvent( pdb->load_done_evt );
|
||||
CloseHandle( pdb->load_done_evt );
|
||||
pdb->load_done_evt = INVALID_HANDLE_VALUE;
|
||||
|
||||
/* Now call the entry point */
|
||||
|
||||
EnterCriticalSection( &pdb->crit_section );
|
||||
MODULE_DllProcessAttach( pdb->exe_modref, (LPVOID)1 );
|
||||
LeaveCriticalSection( &pdb->crit_section );
|
||||
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0, 0 );
|
||||
|
||||
entry = (LPTHREAD_START_ROUTINE)RVA_PTR(pModule->module32,
|
||||
OptionalHeader.AddressOfEntryPoint);
|
||||
|
||||
if (pdb->flags & PDB32_DEBUGGED)
|
||||
DEBUG_SendCreateProcessEvent( -1 /*FIXME*/, pModule->module32, entry );
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0 );
|
||||
|
||||
TRACE_(relay)("(entryproc=%p)\n", entry );
|
||||
ExitProcess( entry(NULL) );
|
||||
@ -585,6 +578,8 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
||||
req.hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
|
||||
req.hstderr = GetStdHandle( STD_ERROR_HANDLE );
|
||||
}
|
||||
req.cmd_show = startup->wShowWindow;
|
||||
req.env_ptr = (void*)env; /* FIXME: hack */
|
||||
CLIENT_SendRequest( REQ_NEW_PROCESS, -1, 2,
|
||||
&req, sizeof(req), cmd_line, strlen(cmd_line) + 1 );
|
||||
if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) goto error;
|
||||
@ -596,35 +591,37 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
||||
((parent->flags & PDB32_DEBUGGED) && !(flags & DEBUG_ONLY_THIS_PROCESS)))
|
||||
pdb->flags |= PDB32_DEBUGGED;
|
||||
|
||||
if (pModule->module32)
|
||||
{
|
||||
size = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfStackReserve;
|
||||
}
|
||||
else /* 16-bit process */
|
||||
{
|
||||
size = 0;
|
||||
pdb->flags |= PDB32_WIN16_PROC;
|
||||
}
|
||||
|
||||
/* Create the main thread */
|
||||
|
||||
if (!(thdb = THREAD_Create( pdb, 0L, size, hInstance == 0, tsa, &server_thandle )))
|
||||
goto error;
|
||||
info->hThread = server_thandle;
|
||||
info->dwThreadId = (DWORD)thdb->server_tid;
|
||||
thdb->startup = PROCESS_Start;
|
||||
|
||||
if (pModule->module32)
|
||||
{
|
||||
HANDLE handles[2];
|
||||
DWORD exitcode;
|
||||
|
||||
/* Create the main thread */
|
||||
size = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfStackReserve;
|
||||
if (!(thdb = THREAD_Create( pdb, 0L, size, TRUE, tsa, &server_thandle )))
|
||||
goto error;
|
||||
info->hThread = server_thandle;
|
||||
info->dwThreadId = (DWORD)thdb->server_tid;
|
||||
thdb->startup = PROCESS_Start;
|
||||
|
||||
/* Create the heap */
|
||||
size = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapReserve;
|
||||
commit = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapCommit;
|
||||
if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, size, commit ))) goto error;
|
||||
pdb->heap_list = pdb->heap;
|
||||
|
||||
/* Inherit the env DB from the parent */
|
||||
if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, inherit, startup )) goto error;
|
||||
|
||||
/* Create the load-done event */
|
||||
load_done_evt = CreateEventA( NULL, TRUE, FALSE, NULL );
|
||||
DuplicateHandle( GetCurrentProcess(), load_done_evt,
|
||||
info->hProcess, &pdb->load_done_evt, 0, TRUE, DUPLICATE_SAME_ACCESS );
|
||||
|
||||
/* Call USER signal proc */
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_CREATE, info->dwProcessId, 0 );
|
||||
PROCESS_CallUserSignalProcHelper( USIG_PROCESS_CREATE, info->dwProcessId, 0,
|
||||
pdb->flags, startup->dwFlags );
|
||||
|
||||
/* Set the process module (FIXME: hack) */
|
||||
pdb->module = pModule->self;
|
||||
@ -655,9 +652,6 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
||||
}
|
||||
else /* Create a 16-bit process */
|
||||
{
|
||||
/* Setup process flags */
|
||||
pdb->flags |= PDB32_WIN16_PROC;
|
||||
|
||||
/* Create the heap */
|
||||
size = 0x10000;
|
||||
commit = 0;
|
||||
@ -667,13 +661,6 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
||||
/* Inherit the env DB from the parent */
|
||||
if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, inherit, startup )) goto error;
|
||||
|
||||
/* Create the main thread */
|
||||
if (!(thdb = THREAD_Create( pdb, 0L, 0, hInstance == 0, tsa, &server_thandle )))
|
||||
goto error;
|
||||
info->hThread = server_thandle;
|
||||
info->dwThreadId = (DWORD)thdb->server_tid;
|
||||
thdb->startup = PROCESS_Start;
|
||||
|
||||
/* Duplicate the standard handles */
|
||||
if ((!(pdb->env_db->startup_info->dwFlags & STARTF_USESTDHANDLES)) && !inherit)
|
||||
{
|
||||
@ -686,7 +673,8 @@ PDB *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env,
|
||||
}
|
||||
|
||||
/* Call USER signal proc */
|
||||
PROCESS_CallUserSignalProc( USIG_PROCESS_CREATE, info->dwProcessId, 0 );
|
||||
PROCESS_CallUserSignalProcHelper( USIG_PROCESS_CREATE, info->dwProcessId, 0,
|
||||
pdb->flags, startup->dwFlags );
|
||||
|
||||
/* Create a Win16 task for this process */
|
||||
if (startup->dwFlags & STARTF_USESHOWWINDOW) cmdShow = startup->wShowWindow;
|
||||
|
Loading…
x
Reference in New Issue
Block a user