[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