[PATCH v2 3/3] dlls/kernelbase: handle corner case in CreateProcess

Eric Pouech eric.pouech at gmail.com
Tue Feb 15 10:43:40 CST 2022


in CreateProcess, if:
- parent isn't attached to a console
- CreateProcess's flag isn't set with DETACHED_PROCESS nor
  CREATE_NEW_CONSOLE
- child is a CUI program
then a console must be allocated for the child

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52048
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/kernel32/tests/console.c |    2 +-
 dlls/kernelbase/process.c     |    6 +++++-
 programs/services/services.c  |    2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 7ab88957ae0..3eada958f34 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -4720,7 +4720,7 @@ static void test_CreateProcessCUI(void)
     res = check_whether_child_attached(cuiexec, DETACHED_PROCESS);
     ok(!res, "Don't expecting child to be attached to a console\n");
     res = check_whether_child_attached(cuiexec, 0);
-    todo_wine ok(res, "Expecting child to be attached to a console\n");
+    ok(res, "Expecting child to be attached to a console\n");
 
     DeleteFileA(guiexec);
     DeleteFileA(cuiexec);
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index 35381f409e9..1cecbce9321 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -191,7 +191,11 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename
 
     if (flags & CREATE_NEW_PROCESS_GROUP) params->ConsoleFlags = 1;
     if (flags & CREATE_NEW_CONSOLE) params->ConsoleHandle = CONSOLE_HANDLE_ALLOC;
-    else if (!(flags & DETACHED_PROCESS)) params->ConsoleHandle = NtCurrentTeb()->Peb->ProcessParameters->ConsoleHandle;
+    else if (!(flags & DETACHED_PROCESS))
+    {
+        params->ConsoleHandle = NtCurrentTeb()->Peb->ProcessParameters->ConsoleHandle;
+        if (!params->ConsoleHandle) params->ConsoleHandle = CONSOLE_HANDLE_ALLOC;
+    }
 
     if (startup->dwFlags & STARTF_USESTDHANDLES)
     {
diff --git a/programs/services/services.c b/programs/services/services.c
index 87ab319367b..2edc02d300c 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -1094,7 +1094,7 @@ found:
     process->use_count++;
     service_unlock(service_entry);
 
-    r = CreateProcessW(NULL, path, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, environment, NULL, &si, &pi);
+    r = CreateProcessW(NULL, path, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS, environment, NULL, &si, &pi);
     HeapFree(GetProcessHeap(), 0, path);
     if (!r)
     {




More information about the wine-devel mailing list