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