From f8e741bcbea7e144e0a89c59e5512e907a309f60 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 1 Jan 1999 16:53:11 +0000 Subject: [PATCH] Take into account handle inheritance flag. --- include/dosexe.h | 2 +- include/module.h | 2 +- include/pe_image.h | 2 +- include/process.h | 4 ++-- loader/dos/module.c | 4 ++-- loader/module.c | 14 ++++++-------- loader/pe_image.c | 4 ++-- scheduler/process.c | 30 ++++++++++++++++++++++-------- 8 files changed, 37 insertions(+), 25 deletions(-) diff --git a/include/dosexe.h b/include/dosexe.h index d443a476f63..4f5c16b0c06 100644 --- a/include/dosexe.h +++ b/include/dosexe.h @@ -48,7 +48,7 @@ extern BOOL32 (*instr_emu_call)( SIGCONTEXT* ); extern void MZ_Tick( WORD handle ); -extern HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, +extern HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ); extern int DOSVM_Enter( PCONTEXT context ); diff --git a/include/module.h b/include/module.h index 805ff9a145b..ba02b902775 100644 --- a/include/module.h +++ b/include/module.h @@ -162,7 +162,7 @@ extern WORD NE_GetOrdinal( HMODULE16 hModule, const char *name ); extern FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ); extern FARPROC16 NE_GetEntryPointEx( HMODULE16 hModule, WORD ordinal, BOOL16 snoop ); extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ); -extern int NE_OpenFile( NE_MODULE *pModule ); +extern HANDLE32 NE_OpenFile( NE_MODULE *pModule ); extern HINSTANCE16 NE_LoadModule( LPCSTR name, HINSTANCE16 *hPrevInstance, BOOL32 implicit, BOOL32 lib_only ); diff --git a/include/pe_image.h b/include/pe_image.h index a2ad9ea6872..3b2a43527fc 100644 --- a/include/pe_image.h +++ b/include/pe_image.h @@ -39,7 +39,7 @@ extern DWORD PE_SizeofResource32(HMODULE32,HRSRC32); extern HMODULE32 PE_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD); extern HGLOBAL32 PE_LoadResource32(struct _wine_modref *wm,HRSRC32); extern HINSTANCE16 PE_CreateProcess( LPCSTR name, LPCSTR cmd_line, - LPCSTR env, LPSTARTUPINFO32A startup, + LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ); struct _THDB; /* forward definition */ diff --git a/include/process.h b/include/process.h index f562ac5adae..9de40732932 100644 --- a/include/process.h +++ b/include/process.h @@ -157,8 +157,8 @@ extern PDB32 *PROCESS_GetPtr( HANDLE32 handle, DWORD access, int *server_handle extern PDB32 *PROCESS_IdToPDB( DWORD id ); extern PDB32 *PROCESS_Create( struct _NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env, HINSTANCE16 hInstance, - HINSTANCE16 hPrevInstance, STARTUPINFO32A *startup, - PROCESS_INFORMATION *info ); + HINSTANCE16 hPrevInstance, BOOL32 inherit, + STARTUPINFO32A *startup, PROCESS_INFORMATION *info ); extern void PROCESS_SuspendOtherThreads(void); extern void PROCESS_ResumeOtherThreads(void); extern int PROCESS_PDBList_Getsize (void); diff --git a/loader/dos/module.c b/loader/dos/module.c index df644ae4b88..64feff45f7c 100644 --- a/loader/dos/module.c +++ b/loader/dos/module.c @@ -411,7 +411,7 @@ int MZ_InitTask( LPDOSTASK lpDosTask ) return lpDosTask->hModule; } -HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, +HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ) { LPDOSTASK lpDosTask = NULL; /* keep gcc from complaining */ @@ -465,7 +465,7 @@ HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, } hInstance = NE_CreateInstance(pModule, NULL, (cmdline == NULL)); - PROCESS_Create( pModule, cmdline, env, hInstance, 0, startup, info ); + PROCESS_Create( pModule, cmdline, env, hInstance, 0, inherit, startup, info ); return hInstance; } else { return (err<32) ? err : pTask->hInstance; diff --git a/loader/module.c b/loader/module.c index 3253c46eccb..9fb53bae96f 100644 --- a/loader/module.c +++ b/loader/module.c @@ -407,7 +407,7 @@ HMODULE32 MODULE_FindModule32( * NE_CreateProcess */ static HINSTANCE16 NE_CreateProcess( LPCSTR name, LPCSTR cmd_line, LPCSTR env, - LPSTARTUPINFO32A startup, + BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ) { HINSTANCE16 hInstance, hPrevInstance; @@ -430,7 +430,7 @@ static HINSTANCE16 NE_CreateProcess( LPCSTR name, LPCSTR cmd_line, LPCSTR env, pModule->flags |= NE_FFLAGS_GUI; /* FIXME: is this necessary? */ PROCESS_Create( pModule, cmd_line, env, hInstance, - hPrevInstance, startup, info ); + hPrevInstance, inherit, startup, info ); return hInstance; } @@ -488,7 +488,7 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock ) } pdb = PROCESS_Create( pModule, new_cmd_line, env, - hInstance, hPrevInstance, &startup, &info ); + hInstance, hPrevInstance, TRUE, &startup, &info ); CloseHandle( info.hThread ); CloseHandle( info.hProcess ); @@ -605,8 +605,6 @@ BOOL32 WINAPI CreateProcess32A( LPCSTR lpApplicationName, LPSTR lpCommandLine, FIXME(module, "(%s,...): lpProcessAttributes ignored\n", name); if (lpThreadAttributes) FIXME(module, "(%s,...): lpThreadAttributes ignored\n", name); - if (bInheritHandles) - FIXME(module, "(%s,...): bInheritHandles ignored\n", name); if (dwCreationFlags & DEBUG_PROCESS) FIXME(module, "(%s,...): DEBUG_PROCESS ignored\n", name); if (dwCreationFlags & DEBUG_ONLY_THIS_PROCESS) @@ -669,17 +667,17 @@ BOOL32 WINAPI CreateProcess32A( LPCSTR lpApplicationName, LPSTR lpCommandLine, /* Try NE module */ - hInstance = NE_CreateProcess( name, cmdline, lpEnvironment, + hInstance = NE_CreateProcess( name, cmdline, lpEnvironment, bInheritHandles, lpStartupInfo, lpProcessInfo ); /* Try PE module */ if (hInstance == 21) - hInstance = PE_CreateProcess( name, cmdline, lpEnvironment, + hInstance = PE_CreateProcess( name, cmdline, lpEnvironment, bInheritHandles, lpStartupInfo, lpProcessInfo ); /* Try DOS module */ if (hInstance == 11) - hInstance = MZ_CreateProcess( name, cmdline, lpEnvironment, + hInstance = MZ_CreateProcess( name, cmdline, lpEnvironment, bInheritHandles, lpStartupInfo, lpProcessInfo ); if (hInstance < 32) diff --git a/loader/pe_image.c b/loader/pe_image.c index 8b7a77d5890..1fc779cfa33 100644 --- a/loader/pe_image.c +++ b/loader/pe_image.c @@ -852,7 +852,7 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, PDB32 *process, * due to the PROCESS_Create stuff. */ HINSTANCE16 PE_CreateProcess( LPCSTR name, LPCSTR cmd_line, - LPCSTR env, LPSTARTUPINFO32A startup, + LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ) { HMODULE16 hModule16; @@ -879,7 +879,7 @@ HINSTANCE16 PE_CreateProcess( LPCSTR name, LPCSTR cmd_line, /* Create new process */ hInstance = NE_CreateInstance( pModule, NULL, FALSE ); process = PROCESS_Create( pModule, cmd_line, env, - hInstance, 0, startup, info ); + hInstance, 0, inherit, startup, info ); /* Create 32-bit MODREF */ if ( !(wm = PE_CreateModule( process, hModule32, &ofs, 0, FALSE )) ) diff --git a/scheduler/process.c b/scheduler/process.c index 6ddc950d54c..e05f010a657 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -129,7 +129,7 @@ static BOOL32 PROCESS_BuildEnvDB( PDB32 *pdb ) * PROCESS_InheritEnvDB */ static BOOL32 PROCESS_InheritEnvDB( PDB32 *pdb, LPCSTR cmd_line, LPCSTR env, - STARTUPINFO32A *startup ) + BOOL32 inherit_handles, STARTUPINFO32A *startup ) { if (!(pdb->env_db = HeapAlloc(pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB)))) return FALSE; @@ -157,12 +157,13 @@ static BOOL32 PROCESS_InheritEnvDB( PDB32 *pdb, LPCSTR cmd_line, LPCSTR env, pdb->env_db->hStdout = pdb->env_db->startup_info->hStdOutput; pdb->env_db->hStderr = pdb->env_db->startup_info->hStdError; } - else + else if (inherit_handles) { pdb->env_db->hStdin = pdb->parent->env_db->hStdin; pdb->env_db->hStdout = pdb->parent->env_db->hStdout; pdb->env_db->hStderr = pdb->parent->env_db->hStderr; } + /* else will be done later on in PROCESS_Create */ return TRUE; } @@ -296,7 +297,7 @@ static void PROCESS_FreePDB( PDB32 *pdb ) * Allocate and fill a PDB structure. * Runs in the context of the parent process. */ -static PDB32 *PROCESS_CreatePDB( PDB32 *parent ) +static PDB32 *PROCESS_CreatePDB( PDB32 *parent, BOOL32 inherit ) { PDB32 *pdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(PDB32) ); @@ -315,7 +316,7 @@ static PDB32 *PROCESS_CreatePDB( PDB32 *parent ) /* Create the handle table */ - if (!HANDLE_CreateTable( pdb, TRUE )) goto error; + if (!HANDLE_CreateTable( pdb, inherit )) goto error; PROCESS_PDBList_Insert (pdb); return pdb; @@ -356,7 +357,7 @@ BOOL32 PROCESS_Init(void) if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return FALSE; /* Create the initial process and thread structures */ - if (!(pdb = PROCESS_CreatePDB( NULL ))) return FALSE; + if (!(pdb = PROCESS_CreatePDB( NULL, FALSE ))) return FALSE; if (!(thdb = THREAD_Create( pdb, 0, FALSE, NULL, NULL, NULL, NULL ))) return FALSE; thdb->unix_pid = getpid(); @@ -386,14 +387,15 @@ BOOL32 PROCESS_Init(void) */ PDB32 *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env, HINSTANCE16 hInstance, HINSTANCE16 hPrevInstance, - STARTUPINFO32A *startup, PROCESS_INFORMATION *info ) + BOOL32 inherit, STARTUPINFO32A *startup, + PROCESS_INFORMATION *info ) { DWORD size, commit; int server_thandle, server_phandle; UINT32 cmdShow = 0; THDB *thdb = NULL; PDB32 *parent = PROCESS_Current(); - PDB32 *pdb = PROCESS_CreatePDB( parent ); + PDB32 *pdb = PROCESS_CreatePDB( parent, inherit ); TDB *pTask; if (!pdb) return NULL; @@ -418,7 +420,7 @@ PDB32 *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env, /* Inherit the env DB from the parent */ - if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, startup )) goto error; + if (!PROCESS_InheritEnvDB( pdb, cmd_line, env, inherit, startup )) goto error; /* Create the main thread */ @@ -446,6 +448,18 @@ PDB32 *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env, thdb->unix_pid = pTask? pTask->thdb->unix_pid : THREAD_Current()->unix_pid; #endif + /* Duplicate the standard handles */ + + if ((!(pdb->env_db->startup_info->dwFlags & STARTF_USESTDHANDLES)) && !inherit) + { + DuplicateHandle( GetCurrentProcess(), pdb->parent->env_db->hStdin, + info->hProcess, &pdb->env_db->hStdin, 0, TRUE, DUPLICATE_SAME_ACCESS ); + DuplicateHandle( GetCurrentProcess(), pdb->parent->env_db->hStdout, + info->hProcess, &pdb->env_db->hStdout, 0, TRUE, DUPLICATE_SAME_ACCESS ); + DuplicateHandle( GetCurrentProcess(), pdb->parent->env_db->hStderr, + info->hProcess, &pdb->env_db->hStderr, 0, TRUE, DUPLICATE_SAME_ACCESS ); + } + /* Create a Win16 task for this process */ if (startup->dwFlags & STARTF_USESHOWWINDOW) -- 2.11.4.GIT