[PATCH] Various background processes must be launched detached from current console (if any)
Eric Pouech
eric.pouech at orange.fr
Mon Jan 14 14:20:06 CST 2013
This patch is:
- required before applying the console patchset and fixes hang in hlink test
- but is also something needed for reducing ressource consumption (not inheriting
consoles too much)
- but will also fix the test when run under wineconsole
the rule of thumb I used for writting this patch is:
- if caller of CreateProcess waits for the termination of the child program, then
we don't run detached (that could be challenged, as it's not mandatory for the
console patchset, I didn't change it)
- if caller doesn't wait, and child program is a GUI, then run it detached
NB1: I checked that on windows, the console is inherited even for a GUI program
(and is usable), hence the fix isn't in CreateProcess itself
NB2: the whole console patchset should be applied after this patch is in git.
A+
A+
---
dlls/appwiz.cpl/addons.c | 2 +-
dlls/dinput/dinput_main.c | 2 +-
dlls/ieframe/intshcut.c | 2 +-
dlls/mscoree/mscoree_main.c | 2 +-
dlls/mshtml/nsembed.c | 2 +-
dlls/msi/action.c | 2 +-
dlls/msi/custom.c | 2 +-
dlls/ole32/moniker.c | 2 +-
dlls/ole32/rpc.c | 2 +-
dlls/rpcrt4/rpc_epmap.c | 2 +-
dlls/setupapi/install.c | 2 +-
dlls/shell32/shelllink.c | 2 +-
dlls/shell32/shlexec.c | 2 ++
programs/services/services.c | 2 +-
programs/wineboot/wineboot.c | 4 ++--
15 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/dlls/appwiz.cpl/addons.c b/dlls/appwiz.cpl/addons.c
index 4eb37c7..2a47b84 100644
--- a/dlls/appwiz.cpl/addons.c
+++ b/dlls/appwiz.cpl/addons.c
@@ -630,7 +630,7 @@ static void run_winebrowser(const WCHAR *url)
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
- ret = CreateProcessW(app, args, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+ ret = CreateProcessW(app, args, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
heap_free(args);
if (ret) {
CloseHandle(pi.hThread);
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index c07b333..87041e4 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -656,7 +656,7 @@ static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUT7A iface,
if (!This->initialized)
return DIERR_NOTINITIALIZED;
- if (!CreateProcessW(NULL, control_exeW, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
+ if (!CreateProcessW(NULL, control_exeW, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi))
return HRESULT_FROM_WIN32(GetLastError());
return DI_OK;
diff --git a/dlls/ieframe/intshcut.c b/dlls/ieframe/intshcut.c
index 7107a0a..71373c7 100644
--- a/dlls/ieframe/intshcut.c
+++ b/dlls/ieframe/intshcut.c
@@ -108,7 +108,7 @@ static BOOL run_winemenubuilder( const WCHAR *args )
si.cb = sizeof(si);
Wow64DisableWow64FsRedirection( &redir );
- ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
Wow64RevertWow64FsRedirection( redir );
heap_free( buffer );
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c
index de37706..82b2f1c 100644
--- a/dlls/mscoree/mscoree_main.c
+++ b/dlls/mscoree/mscoree_main.c
@@ -724,7 +724,7 @@ static BOOL install_wine_mono(void)
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
- ret = CreateProcessW(app, args, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+ ret = CreateProcessW(app, args, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
HeapFree(GetProcessHeap(), 0, args);
if (ret) {
CloseHandle(pi.hThread);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 109b6ad..1a825c0 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -416,7 +416,7 @@ static BOOL install_wine_gecko(void)
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
- ret = CreateProcessW(app, args, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+ ret = CreateProcessW(app, args, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
heap_free(args);
if (ret) {
CloseHandle(pi.hThread);
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 22fa388..22db913 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -4734,7 +4734,7 @@ static void register_dll( const WCHAR *dll, BOOL unregister )
else sprintfW( cmd, regW, dll );
memset( &si, 0, sizeof(STARTUPINFOW) );
- if (CreateProcessW( NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ))
+ if (CreateProcessW( NULL, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi ))
{
CloseHandle( pi.hThread );
msi_dialog_check_messages( pi.hProcess );
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index a33f19d..267952b 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -813,7 +813,7 @@ static HANDLE execute_command( const WCHAR *app, WCHAR *arg, const WCHAR *dir )
}
}
memset( &si, 0, sizeof(STARTUPINFOW) );
- ret = CreateProcessW( exe, exe ? cmd : arg, NULL, NULL, FALSE, 0, NULL, dir, &si, &info );
+ ret = CreateProcessW( exe, exe ? cmd : arg, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, dir, &si, &info );
msi_free( cmd );
msi_free( exe );
if (!ret)
diff --git a/dlls/ole32/moniker.c b/dlls/ole32/moniker.c
index 1d7f219..8d4e98f 100644
--- a/dlls/ole32/moniker.c
+++ b/dlls/ole32/moniker.c
@@ -146,7 +146,7 @@ static BOOL start_rpcss(void)
strcatW( cmd, rpcss );
Wow64DisableWow64FsRedirection( &redir );
- rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
Wow64RevertWow64FsRedirection( redir );
if (rslt)
diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c
index 9b57206..5c981bb 100644
--- a/dlls/ole32/rpc.c
+++ b/dlls/ole32/rpc.c
@@ -1680,7 +1680,7 @@ static HRESULT create_server(REFCLSID rclsid, HANDLE *process)
/* FIXME: Win2003 supports a ServerExecutable value that is passed into
* CreateProcess */
- if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
+ if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) {
WARN("failed to run local server %s\n", debugstr_w(command));
return HRESULT_FROM_WIN32(GetLastError());
}
diff --git a/dlls/rpcrt4/rpc_epmap.c b/dlls/rpcrt4/rpc_epmap.c
index f079ff4..540c1c4 100644
--- a/dlls/rpcrt4/rpc_epmap.c
+++ b/dlls/rpcrt4/rpc_epmap.c
@@ -92,7 +92,7 @@ static BOOL start_rpcss(void)
lstrcatW( cmd, rpcss );
Wow64DisableWow64FsRedirection( &redir );
- rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
Wow64RevertWow64FsRedirection( redir );
if (rslt)
diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c
index dda1396..aff3da4 100644
--- a/dlls/setupapi/install.c
+++ b/dlls/setupapi/install.c
@@ -550,7 +550,7 @@ static BOOL do_register_dll( struct register_dll_info *info, const WCHAR *path,
memset( &startup, 0, sizeof(startup) );
startup.cb = sizeof(startup);
TRACE( "executing %s\n", debugstr_w(cmd_line) );
- res = CreateProcessW( path, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &process_info );
+ res = CreateProcessW( path, cmd_line, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &startup, &process_info );
HeapFree( GetProcessHeap(), 0, cmd_line );
if (!res)
{
diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c
index e325e2e..e2889ba 100644
--- a/dlls/shell32/shelllink.c
+++ b/dlls/shell32/shelllink.c
@@ -439,7 +439,7 @@ BOOL run_winemenubuilder( const WCHAR *args )
si.cb = sizeof(si);
Wow64DisableWow64FsRedirection( &redir );
- ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi );
Wow64RevertWow64FsRedirection( redir );
HeapFree( GetProcessHeap(), 0, buffer );
diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 39d640a..6338bfd 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -340,6 +340,8 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
if (psei->fMask & SEE_MASK_NO_CONSOLE)
dwCreationFlags |= CREATE_NEW_CONSOLE;
+ else
+ dwCreationFlags |= DETACHED_PROCESS;
if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, dwCreationFlags, env,
lpDirectory, &startup, &info))
{
diff --git a/programs/services/services.c b/programs/services/services.c
index 75abf06..f4173b0 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -675,7 +675,7 @@ static DWORD service_start_process(struct service_entry *service_entry, HANDLE *
service_unlock(service_entry);
- r = CreateProcessW(NULL, path, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi);
+ r = CreateProcessW(NULL, path, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS, env, NULL, &si, &pi);
HeapFree(GetProcessHeap(),0,path);
if (!r)
{
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 0be773b..3abf43f 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -851,7 +851,7 @@ static BOOL start_services_process(void)
strcatW(path, services);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
- if (!CreateProcessW(path, path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
+ if (!CreateProcessW(path, path, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi))
{
WINE_ERR("Couldn't start services.exe: error %u\n", GetLastError());
return FALSE;
@@ -952,7 +952,7 @@ static HANDLE start_rundll32( const char *inf_path, BOOL wow64 )
strcatW( buffer, inf );
MultiByteToWideChar( CP_UNIXCP, 0, inf_path, -1, buffer + strlenW(buffer), inf_len );
- if (CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ))
+ if (CreateProcessW( app, buffer, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi ))
CloseHandle( pi.hThread );
else
pi.hProcess = 0;
More information about the wine-patches
mailing list