Jacek Caban : kernelbase: Close PEB ConsoleHandle in FreeConsole.
Alexandre Julliard
julliard at winehq.org
Thu Aug 13 15:11:52 CDT 2020
Module: wine
Branch: master
Commit: ccaaf6957f525f09ba485377a606ce322ab90792
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ccaaf6957f525f09ba485377a606ce322ab90792
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 13 16:00:27 2020 +0200
kernelbase: Close PEB ConsoleHandle in FreeConsole.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/console.c | 12 ++++++++++++
dlls/kernelbase/console.c | 3 +++
2 files changed, 15 insertions(+)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 2facdf91fa..32a1275e3e 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -3592,9 +3592,15 @@ static void test_FreeConsole(void)
HANDLE handle;
BOOL ret;
+ todo_wine
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n");
+
ret = FreeConsole();
ok(ret, "FreeConsole failed: %u\n", GetLastError());
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle == NULL, "ConsoleHandle = %p\n",
+ RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle);
+
handle = CreateFileA("CONOUT$", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
ok(handle == INVALID_HANDLE_VALUE &&
(GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)),
@@ -3719,8 +3725,12 @@ static void test_AttachConsole_child(DWORD console_pid)
ok(!res && GetLastError() == ERROR_ACCESS_DENIED,
"AttachConsole returned: %x(%u)\n", res, GetLastError());
+ todo_wine
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n");
res = FreeConsole();
ok(res, "FreeConsole failed: %u\n", GetLastError());
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle == NULL, "ConsoleHandle = %p\n",
+ RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle);
SetStdHandle(STD_ERROR_HANDLE, pipe_out);
@@ -3728,6 +3738,8 @@ static void test_AttachConsole_child(DWORD console_pid)
ok(res, "AttachConsole failed: %u\n", GetLastError());
ok(pipe_out != GetStdHandle(STD_ERROR_HANDLE), "std handle not set to console\n");
+ todo_wine
+ ok(RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle != NULL, "ConsoleHandle is NULL\n");
console = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
ok(console != INVALID_HANDLE_VALUE, "Could not open console\n");
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 7f9152d5c5..15153dbb6f 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -509,6 +509,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
RtlEnterCriticalSection( &console_section );
+ NtClose( RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle );
+ RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = NULL;
+
if (console_flags & CONSOLE_INPUT_HANDLE) NtClose( GetStdHandle( STD_INPUT_HANDLE ));
if (console_flags & CONSOLE_OUTPUT_HANDLE) NtClose( GetStdHandle( STD_OUTPUT_HANDLE ));
if (console_flags & CONSOLE_ERROR_HANDLE) NtClose( GetStdHandle( STD_ERROR_HANDLE ));
More information about the wine-cvs
mailing list