[PATCH 6/6] kernelbase: Implement CreateProcess flag CREATE_NO_WINDOW.
Torge Matthies
openglfreak at googlemail.com
Mon Apr 4 21:06:43 CDT 2022
Use the second bit of ConsoleFlags to pass this flag to the child.
Signed-off-by: Torge Matthies <openglfreak at googlemail.com>
---
dlls/kernel32/tests/console.c | 4 ++--
dlls/kernelbase/console.c | 3 +++
dlls/kernelbase/process.c | 11 +++++++----
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 8a995ca36db..0de96f416bf 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -4750,7 +4750,7 @@ static void test_CreateProcessCUI(void)
res = check_same_console(cuiexec, DETACHED_PROCESS);
ok(!res, "Expected child to be attached to a different console\n");
res = check_same_console(cuiexec, CREATE_NO_WINDOW);
- todo_wine ok(!res, "Expected child to be attached to a different console\n");
+ ok(!res, "Expected child to be attached to a different console\n");
res = check_same_console(cuiexec, CREATE_NO_WINDOW|DETACHED_PROCESS);
ok(!res, "Expected child to be attached to a different console\n");
res = check_same_console(cuiexec, CREATE_NO_WINDOW|CREATE_NEW_CONSOLE);
@@ -4761,7 +4761,7 @@ static void test_CreateProcessCUI(void)
res = check_has_window(cuiexec, DETACHED_PROCESS);
ok(!res, "Expected child to not have a console window\n");
res = check_has_window(cuiexec, CREATE_NO_WINDOW);
- todo_wine ok(!res, "Expected child to not have a console window\n");
+ ok(!res, "Expected child to not have a console window\n");
res = check_has_window(cuiexec, CREATE_NO_WINDOW|DETACHED_PROCESS);
ok(!res, "Expected child to not have a console window\n");
res = check_has_window(cuiexec, CREATE_NO_WINDOW|CREATE_NEW_CONSOLE);
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index b2bb6c53fd9..aa6a7681800 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -419,6 +419,8 @@ BOOL WINAPI AllocConsole(void)
swprintf( conhost_path, ARRAY_SIZE(conhost_path), L"%s\\conhost.exe", system_dir );
swprintf( cmd, ARRAY_SIZE(cmd), L"\"%s\" --server 0x%x", conhost_path, condrv_handle( server ));
+ if (NtCurrentTeb()->Peb->ProcessParameters->ConsoleFlags & 2)
+ wcsncat( cmd, L" --no-window", ARRAY_SIZE(cmd) );
Wow64DisableWow64FsRedirection( &redir );
ret = CreateProcessW( conhost_path, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &console_si, &pi );
Wow64RevertWow64FsRedirection( redir );
@@ -2293,6 +2295,7 @@ void init_console( void )
params->ConsoleHandle = NULL;
if (RtlImageNtHeader( mod )->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
AllocConsole();
+ params->ConsoleFlags &= ~2;
}
else if (params->ConsoleHandle) create_console_connection( params->ConsoleHandle );
}
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index 1cecbce9321..c219f3d149c 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -148,6 +148,7 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename
UNICODE_STRING imageW, curdirW, cmdlineW, titleW, desktopW, runtimeW, newdirW;
WCHAR imagepath[MAX_PATH];
WCHAR *envW = env;
+ BOOL no_window = (flags & CREATE_NO_WINDOW) && !(flags & (DETACHED_PROCESS|CREATE_NEW_CONSOLE));
if (!GetLongPathNameW( filename, imagepath, MAX_PATH )) lstrcpynW( imagepath, filename, MAX_PATH );
if (!GetFullPathNameW( imagepath, MAX_PATH, imagepath, NULL )) lstrcpynW( imagepath, filename, MAX_PATH );
@@ -189,8 +190,10 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename
}
RtlFreeUnicodeString( &newdirW );
- if (flags & CREATE_NEW_PROCESS_GROUP) params->ConsoleFlags = 1;
- if (flags & CREATE_NEW_CONSOLE) params->ConsoleHandle = CONSOLE_HANDLE_ALLOC;
+ params->ConsoleFlags = 0;
+ if (flags & CREATE_NEW_PROCESS_GROUP) params->ConsoleFlags |= 1;
+ if (no_window) params->ConsoleFlags |= 2;
+ if ((flags & CREATE_NEW_CONSOLE) || no_window) params->ConsoleHandle = CONSOLE_HANDLE_ALLOC;
else if (!(flags & DETACHED_PROCESS))
{
params->ConsoleHandle = NtCurrentTeb()->Peb->ProcessParameters->ConsoleHandle;
@@ -532,8 +535,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
/* Warn if unsupported features are used */
if (flags & (IDLE_PRIORITY_CLASS | HIGH_PRIORITY_CLASS | REALTIME_PRIORITY_CLASS |
- CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW |
- PROFILE_USER | PROFILE_KERNEL | PROFILE_SERVER))
+ CREATE_DEFAULT_ERROR_MODE | PROFILE_USER | PROFILE_KERNEL |
+ PROFILE_SERVER))
WARN( "(%s,...): ignoring some flags in %lx\n", debugstr_w(app_name), flags );
if (cur_dir)
--
2.35.1
More information about the wine-devel
mailing list