Jacek Caban : kernelbase: Support PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE.
Alexandre Julliard
julliard at winehq.org
Fri Aug 21 16:43:26 CDT 2020
Module: wine
Branch: master
Commit: 76037ffbeefc7b15b764b4d6079bb6c939176523
URL: https://source.winehq.org/git/wine.git/?a=commit;h=76037ffbeefc7b15b764b4d6079bb6c939176523
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 20 23:49:22 2020 +0200
kernelbase: Support PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/console.c | 38 +++++++++++++++++++++++++++++++++++++-
dlls/kernel32/tests/process.c | 12 ++++++++++++
dlls/kernelbase/process.c | 17 +++++++++++++++++
3 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 20dd66e70e..d568bac709 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -3957,9 +3957,14 @@ static DWORD WINAPI read_pipe_proc( void *handle )
static void test_pseudo_console(void)
{
+ STARTUPINFOEXA startup = {{ sizeof(startup) }};
HANDLE console_pipe, console_pipe2, thread;
+ char **argv, cmdline[MAX_PATH];
+ PROCESS_INFORMATION info;
HPCON pseudo_console;
+ SIZE_T attr_size;
COORD size;
+ BOOL ret;
HRESULT hres;
if (!pCreatePseudoConsole)
@@ -3995,6 +4000,22 @@ static void test_pseudo_console(void)
ok(hres == S_OK, "CreatePseudoConsole failed: %08x\n", hres);
CloseHandle(console_pipe2);
+ InitializeProcThreadAttributeList(NULL, 1, 0, &attr_size);
+ startup.lpAttributeList = HeapAlloc(GetProcessHeap(), 0, attr_size);
+ InitializeProcThreadAttributeList(startup.lpAttributeList, 1, 0, &attr_size);
+ UpdateProcThreadAttribute(startup.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, pseudo_console,
+ sizeof(pseudo_console), NULL, NULL);
+
+ winetest_get_mainargs(&argv);
+ sprintf(cmdline, "\"%s\" %s --pseudo-console", argv[0], argv[1]);
+ ret = CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &startup.StartupInfo, &info);
+ ok(ret, "CreateProcessW failed: %u\n", GetLastError());
+
+ CloseHandle(info.hThread);
+ HeapFree(GetProcessHeap(), 0, startup.lpAttributeList);
+ wait_child_process(info.hProcess);
+ CloseHandle(info.hProcess);
+
pClosePseudoConsole(pseudo_console);
}
@@ -4003,6 +4024,7 @@ START_TEST(console)
HANDLE hConIn, hConOut;
BOOL ret, test_current;
CONSOLE_SCREEN_BUFFER_INFO sbi;
+ BOOL using_pseudo_console;
DWORD size;
char **argv;
int argc;
@@ -4026,8 +4048,9 @@ START_TEST(console)
}
test_current = argc >= 3 && !strcmp(argv[2], "--current");
+ using_pseudo_console = argc >= 3 && !strcmp(argv[2], "--pseudo-console");
- if (!test_current)
+ if (!test_current && !using_pseudo_console)
{
static const char font_name[] = "Lucida Console";
HKEY console_key;
@@ -4093,6 +4116,19 @@ START_TEST(console)
ok(hConIn != INVALID_HANDLE_VALUE, "Opening ConIn\n");
ok(hConOut != INVALID_HANDLE_VALUE, "Opening ConOut\n");
+ if (using_pseudo_console)
+ {
+ DWORD mode;
+
+ ret = GetConsoleMode(hConIn, &mode);
+ ok(ret, "GetConsoleMode failed: %u\n", GetLastError());
+ todo_wine
+ ok(mode == (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT |
+ ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS | ENABLE_AUTO_POSITION),
+ "mode = %x\n", mode);
+ return;
+ }
+
ret = GetConsoleScreenBufferInfo(hConOut, &sbi);
ok(ret, "Getting sb info\n");
if (!ret) return;
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 3162ba3c53..b794c8f0c0 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -3887,6 +3887,18 @@ static void test_ProcThreadAttributeList(void)
expect_list.count++;
}
+ ret = pUpdateProcThreadAttribute(&list, 0, PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, handles, sizeof(PROCESSOR_NUMBER), NULL, NULL);
+ ok(ret || broken(GetLastError() == ERROR_NOT_SUPPORTED), "got %d gle %d\n", ret, GetLastError());
+
+ if (ret)
+ {
+ unsigned int i = expect_list.count++;
+ expect_list.mask |= 1 << ProcThreadAttributePseudoConsole;
+ expect_list.attrs[i].attr = PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE;
+ expect_list.attrs[i].size = sizeof(HPCON);
+ expect_list.attrs[i].value = handles;
+ }
+
ok(!memcmp(&list, &expect_list, size), "mismatch\n");
pDeleteProcThreadAttributeList(&list);
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index 0081b6bf9c..648174b2a7 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -28,6 +28,7 @@
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
+#include "wincontypes.h"
#include "winternl.h"
#include "kernelbase.h"
@@ -568,6 +569,14 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
handle_list = &attrs->attrs[i];
TRACE("PROC_THREAD_ATTRIBUTE_HANDLE_LIST handle count %Iu.\n", attrs->attrs[i].size / sizeof(HANDLE));
break;
+ case PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE:
+ {
+ struct pseudo_console *console = attrs->attrs[i].value;
+ TRACE( "PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE %p reference %p\n",
+ console, console->reference );
+ params->ConsoleHandle = console->reference;
+ break;
+ }
default:
FIXME("Unsupported attribute %#Ix.\n", attrs->attrs[i].attr);
break;
@@ -1730,6 +1739,14 @@ BOOL WINAPI DECLSPEC_HOTPATCH UpdateProcThreadAttribute( struct _PROC_THREAD_ATT
}
break;
+ case PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE:
+ if (size != sizeof(HPCON))
+ {
+ SetLastError( ERROR_BAD_LENGTH );
+ return FALSE;
+ }
+ break;
+
default:
SetLastError( ERROR_NOT_SUPPORTED );
FIXME( "Unhandled attribute %lu\n", attr & PROC_THREAD_ATTRIBUTE_NUMBER );
More information about the wine-cvs
mailing list