winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
August 2020
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
692 discussions
Start a n
N
ew thread
Jacek Caban : kernelbase: Support PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 76037ffbeefc7b15b764b4d6079bb6c939176523 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=76037ffbeefc7b15b764b4d6…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:49:22 2020 +0200 kernelbase: Support PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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 );
1
0
0
0
Jacek Caban : kernel32/tests: Add CreatePseudoConsole tests.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 36663d9abd0fc085c1197429a78dfbe86c1dc56a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=36663d9abd0fc085c1197429…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:49:09 2020 +0200 kernel32/tests: Add CreatePseudoConsole tests. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/console.c | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index e6c88e8c73..20dd66e70e 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -24,6 +24,8 @@ #include <winternl.h> #include <stdio.h> +static void (WINAPI *pClosePseudoConsole)(HPCON); +static HRESULT (WINAPI *pCreatePseudoConsole)(COORD,HANDLE,HANDLE,DWORD,HPCON*); static BOOL (WINAPI *pGetConsoleInputExeNameA)(DWORD, LPSTR); static DWORD (WINAPI *pGetConsoleProcessList)(LPDWORD, DWORD); static HANDLE (WINAPI *pOpenConsoleW)(LPCWSTR,DWORD,BOOL,DWORD); @@ -68,6 +70,8 @@ static void init_function_pointers(void) if(!p##func) trace("GetProcAddress(hKernel32, '%s') failed\n", #func); hKernel32 = GetModuleHandleA("kernel32.dll"); + KERNEL32_GET_PROC(ClosePseudoConsole); + KERNEL32_GET_PROC(CreatePseudoConsole); KERNEL32_GET_PROC(GetConsoleInputExeNameA); KERNEL32_GET_PROC(GetConsoleProcessList); KERNEL32_GET_PROC(OpenConsoleW); @@ -3941,6 +3945,59 @@ static void test_AllocConsole(void) CloseHandle(pipe_write); } +static DWORD WINAPI read_pipe_proc( void *handle ) +{ + char buf[64]; + DWORD size; + while (ReadFile(handle, buf, sizeof(buf), &size, NULL)); + ok(GetLastError() == ERROR_BROKEN_PIPE, "ReadFile returned %u\n", GetLastError()); + CloseHandle(handle); + return 0; +} + +static void test_pseudo_console(void) +{ + HANDLE console_pipe, console_pipe2, thread; + HPCON pseudo_console; + COORD size; + HRESULT hres; + + if (!pCreatePseudoConsole) + { + win_skip("CreatePseudoConsole not available\n"); + return; + } + + console_pipe = CreateNamedPipeW(L"\\\\.\\pipe\\pseudoconsoleconn", PIPE_ACCESS_DUPLEX, + PIPE_WAIT | PIPE_TYPE_BYTE, 1, 4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, NULL); + ok(console_pipe != INVALID_HANDLE_VALUE, "CreateNamedPipeW failed: %u\n", GetLastError()); + + console_pipe2 = CreateFileW(L"\\\\.\\pipe\\pseudoconsoleconn", GENERIC_READ | GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + ok(console_pipe2 != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError()); + + thread = CreateThread( NULL, 0, read_pipe_proc, console_pipe, 0, NULL ); + CloseHandle(thread); + + size.X = 0; + size.Y = 30; + hres = pCreatePseudoConsole(size, console_pipe2, console_pipe2, 0, &pseudo_console); + ok(hres == E_INVALIDARG, "CreatePseudoConsole failed: %08x\n", hres); + + size.X = 40; + size.Y = 0; + hres = pCreatePseudoConsole(size, console_pipe2, console_pipe2, 0, &pseudo_console); + ok(hres == E_INVALIDARG, "CreatePseudoConsole failed: %08x\n", hres); + + size.X = 40; + size.Y = 30; + hres = pCreatePseudoConsole(size, console_pipe2, console_pipe2, 0, &pseudo_console); + ok(hres == S_OK, "CreatePseudoConsole failed: %08x\n", hres); + CloseHandle(console_pipe2); + + pClosePseudoConsole(pseudo_console); +} + START_TEST(console) { HANDLE hConIn, hConOut; @@ -4123,5 +4180,6 @@ START_TEST(console) test_AttachConsole(hConOut); test_AllocConsole(); test_FreeConsole(); + test_pseudo_console(); } }
1
0
0
0
Jacek Caban : kernelbase: Add ClosePseudoConsole implementation.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 0ec191eb0fd161e3bbd9e92270282d3d81e2cf11 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0ec191eb0fd161e3bbd9e922…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:49:00 2020 +0200 kernelbase: Add ClosePseudoConsole implementation. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernelbase/console.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index cb85061fc9..42dc971227 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -1704,7 +1704,18 @@ HRESULT WINAPI CreatePseudoConsole( COORD size, HANDLE input, HANDLE output, DWO */ void WINAPI ClosePseudoConsole( HPCON handle ) { - FIXME( "%p\n", handle ); + struct pseudo_console *pseudo_console = handle; + + TRACE( "%p\n", handle ); + + if (!pseudo_console) return; + if (pseudo_console->signal) CloseHandle( pseudo_console->signal ); + if (pseudo_console->process) + { + WaitForSingleObject( pseudo_console->process, INFINITE ); + CloseHandle( pseudo_console->process ); + } + if (pseudo_console->reference) CloseHandle( pseudo_console->reference ); } /******************************************************************************
1
0
0
0
Jacek Caban : kernelbase: Add CreatePseudoConsole implementation.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 7ea9f9edeed417a241d607bac282d68bdf5abd36 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7ea9f9edeed417a241d607ba…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:48:54 2020 +0200 kernelbase: Add CreatePseudoConsole implementation. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernelbase/console.c | 116 ++++++++++++++++++++++++++++++++++++++++++- dlls/kernelbase/kernelbase.h | 7 +++ 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index e5a9fbd501..cb85061fc9 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -174,6 +174,40 @@ static COORD get_largest_console_window_size( HANDLE handle ) return c; } +static HANDLE create_console_server( void ) +{ + OBJECT_ATTRIBUTES attr = {sizeof(attr)}; + UNICODE_STRING string; + IO_STATUS_BLOCK iosb; + HANDLE handle; + NTSTATUS status; + + RtlInitUnicodeString( &string, L"\\Device\\ConDrv\\Server" ); + attr.ObjectName = &string; + attr.Attributes = OBJ_INHERIT; + status = NtCreateFile( &handle, FILE_WRITE_PROPERTIES | FILE_READ_PROPERTIES | SYNCHRONIZE, + &attr, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, + FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); + return set_ntstatus( status ) ? handle : NULL; +} + +static HANDLE create_console_reference( HANDLE root ) +{ + OBJECT_ATTRIBUTES attr = {sizeof(attr)}; + UNICODE_STRING string; + IO_STATUS_BLOCK iosb; + HANDLE handle; + NTSTATUS status; + + RtlInitUnicodeString( &string, L"Reference" ); + attr.RootDirectory = root; + attr.ObjectName = &string; + status = NtCreateFile( &handle, FILE_READ_DATA | FILE_WRITE_DATA | FILE_WRITE_PROPERTIES | + FILE_READ_PROPERTIES | SYNCHRONIZE, &attr, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, + 0, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); + return set_ntstatus( status ) ? handle : NULL; +} + static BOOL init_console_std_handles(void) { HANDLE std_out = NULL, std_err = NULL, handle; @@ -1578,13 +1612,91 @@ BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleOutputCharacterW( HANDLE handle, LPCWS return ret; } +static HANDLE create_pseudo_console( COORD size, HANDLE input, HANDLE output, HANDLE signal, + DWORD flags, HANDLE *process ) +{ + WCHAR cmd[MAX_PATH], conhost_path[MAX_PATH]; + PROCESS_INFORMATION pi; + HANDLE server, console; + STARTUPINFOEXW si; + void *redir; + BOOL res; + + if (!(server = create_console_server())) return NULL; + + console = create_console_reference( server ); + if (!console) + { + NtClose( server ); + return NULL; + } + + memset( &si, 0, sizeof(si) ); + si.StartupInfo.cb = sizeof(STARTUPINFOEXW); + si.StartupInfo.hStdInput = input; + si.StartupInfo.hStdOutput = output; + si.StartupInfo.hStdError = output; + si.StartupInfo.dwFlags = STARTF_USESTDHANDLES; + swprintf( conhost_path, ARRAY_SIZE(conhost_path), L"%s\\conhost.exe", system_dir ); + swprintf( cmd, ARRAY_SIZE(cmd), + L"\"%s\" --headless %s--width %u --height %u --signal 0x%x --server 0x%x", + conhost_path, (flags & PSEUDOCONSOLE_INHERIT_CURSOR) ? L"--inheritcursor " : L"", + size.X, size.Y, signal, server ); + + Wow64DisableWow64FsRedirection( &redir ); + res = CreateProcessW( conhost_path, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, + &si.StartupInfo, &pi ); + Wow64RevertWow64FsRedirection( redir ); + NtClose( server ); + if (!res) + { + NtClose( console ); + return NULL; + } + + NtClose( pi.hThread ); + *process = pi.hProcess; + return console; +} + /****************************************************************************** * CreatePseudoConsole (kernelbase.@) */ HRESULT WINAPI CreatePseudoConsole( COORD size, HANDLE input, HANDLE output, DWORD flags, HPCON *ret ) { - FIXME( "(%u,%u) %p %p %x %p\n", size.X, size.Y, input, output, flags, ret ); - return E_NOTIMPL; + SECURITY_ATTRIBUTES inherit_attr = { sizeof(inherit_attr), NULL, TRUE }; + struct pseudo_console *pseudo_console; + HANDLE signal = NULL; + WCHAR pipe_name[64]; + + TRACE( "(%u,%u) %p %p %x %p\n", size.X, size.Y, input, output, flags, ret ); + + if (!size.X || !size.Y || !ret) return E_INVALIDARG; + + if (!(pseudo_console = HeapAlloc( GetProcessHeap(), 0, HEAP_ZERO_MEMORY ))) return E_OUTOFMEMORY; + + swprintf( pipe_name, ARRAY_SIZE(pipe_name), L"\\\\.\\pipe\\wine_pty_signal_pipe%x", + GetCurrentThreadId() ); + signal = CreateNamedPipeW( pipe_name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, + PIPE_UNLIMITED_INSTANCES, 4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, &inherit_attr ); + if (signal == INVALID_HANDLE_VALUE) + { + HeapFree( GetProcessHeap(), 0, pseudo_console ); + return HRESULT_FROM_WIN32( GetLastError() ); + } + pseudo_console->signal = CreateFileW( pipe_name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); + if (pseudo_console->signal != INVALID_HANDLE_VALUE) + pseudo_console->reference = create_pseudo_console( size, input, output, signal, flags, + &pseudo_console->process ); + NtClose( signal ); + if (!pseudo_console->reference) + { + ClosePseudoConsole( pseudo_console ); + return HRESULT_FROM_WIN32( GetLastError() ); + } + + *ret = pseudo_console; + return S_OK; } /****************************************************************************** diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 59265bab2c..551542e572 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -24,6 +24,13 @@ #include "windef.h" #include "winbase.h" +struct pseudo_console +{ + HANDLE signal; + HANDLE reference; + HANDLE process; +}; + extern WCHAR *file_name_AtoW( LPCSTR name, BOOL alloc ) DECLSPEC_HIDDEN; extern DWORD file_name_WtoA( LPCWSTR src, INT srclen, LPSTR dest, INT destlen ) DECLSPEC_HIDDEN; extern void init_startup_info( RTL_USER_PROCESS_PARAMETERS *params ) DECLSPEC_HIDDEN;
1
0
0
0
Jacek Caban : server: Support creating console reference from console server.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 5f0d268fffc741171fcf9006012c310128846de5 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5f0d268fffc741171fcf9006…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:48:21 2020 +0200 server: Support creating console reference from console server. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- server/console.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/server/console.c b/server/console.c index 670ee23ee7..148f9f1f9c 100644 --- a/server/console.c +++ b/server/console.c @@ -59,6 +59,7 @@ struct console_input int recnum; /* number of input records */ INPUT_RECORD *records; /* input records */ struct console_input_events *evt; /* synchronization event with renderer */ + struct console_server *server; /* console server object */ WCHAR *title; /* console title */ data_size_t title_len; /* length of console title */ struct history_line **history; /* lines history */ @@ -181,11 +182,13 @@ static const struct fd_ops console_input_events_fd_ops = struct console_server { struct object obj; /* object header */ + struct console_input *console; /* attached console */ }; static void console_server_dump( struct object *obj, int verbose ); static void console_server_destroy( struct object *obj ); static int console_server_signaled( struct object *obj, struct wait_queue_entry *entry ); +static struct object *console_server_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ); static struct object *console_server_open_file( struct object *obj, unsigned int access, unsigned int sharing, unsigned int options ); @@ -203,7 +206,7 @@ static const struct object_ops console_server_ops = default_fd_map_access, /* map_access */ default_get_sd, /* get_sd */ default_set_sd, /* set_sd */ - no_lookup_name, /* lookup_name */ + console_server_lookup_name, /* lookup_name */ no_link_name, /* link_name */ NULL, /* unlink_name */ console_server_open_file, /* open_file */ @@ -485,6 +488,7 @@ static struct object *create_console_input( int fd ) console_input->recnum = 0; console_input->records = NULL; console_input->evt = NULL; + console_input->server = NULL; console_input->title = NULL; console_input->title_len = 0; console_input->history_size = 50; @@ -1148,6 +1152,13 @@ static void console_input_destroy( struct object *obj ) int i; assert( obj->ops == &console_input_ops ); + + if (console_in->server) + { + assert( console_in->server->console == console_in ); + console_in->server->console = NULL; + } + free( console_in->title ); free( console_in->records ); @@ -1511,13 +1522,51 @@ static void console_server_dump( struct object *obj, int verbose ) static void console_server_destroy( struct object *obj ) { + struct console_server *server = (struct console_server *)obj; assert( obj->ops == &console_server_ops ); + if (server->console) + { + assert( server->console->server == server ); + server->console->server = NULL; + } +} + +static struct object *console_server_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ) +{ + struct console_server *server = (struct console_server*)obj; + static const WCHAR referenceW[] = {'R','e','f','e','r','e','n','c','e'}; + assert( obj->ops == &console_server_ops ); + + if (name->len == sizeof(referenceW) && !memcmp( name->str, referenceW, name->len )) + { + struct screen_buffer *screen_buffer; + name->len = 0; + if (server->console) + { + set_error( STATUS_INVALID_HANDLE ); + return 0; + } + if (!(server->console = (struct console_input *)create_console_input( -1 ))) return NULL; + if (!(screen_buffer = (struct screen_buffer *)create_console_output( server->console, -1 ))) + { + release_object( server->console ); + server->console = NULL; + return NULL; + } + release_object( screen_buffer ); + server->console->server = server; + + return &server->console->obj; + } + + return NULL; } static int console_server_signaled( struct object *obj, struct wait_queue_entry *entry ) { + struct console_server *server = (struct console_server*)obj; assert( obj->ops == &console_server_ops ); - return 0; + return !server->console; } static struct object *console_server_open_file( struct object *obj, unsigned int access, @@ -1531,6 +1580,7 @@ static struct object *create_console_server( void ) struct console_server *server; if (!(server = alloc_object( &console_server_ops ))) return NULL; + server->console = NULL; return &server->obj; }
1
0
0
0
Jacek Caban : server: Introduce console server object.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 0267a04547770fe75147aa025e11045aca5c4ed9 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0267a04547770fe75147aa02…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:48:08 2020 +0200 server: Introduce console server object. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- server/console.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/server/console.c b/server/console.c index 4509905c2c..670ee23ee7 100644 --- a/server/console.c +++ b/server/console.c @@ -178,6 +178,40 @@ static const struct fd_ops console_input_events_fd_ops = default_fd_reselect_async /* reselect_async */ }; +struct console_server +{ + struct object obj; /* object header */ +}; + +static void console_server_dump( struct object *obj, int verbose ); +static void console_server_destroy( struct object *obj ); +static int console_server_signaled( struct object *obj, struct wait_queue_entry *entry ); +static struct object *console_server_open_file( struct object *obj, unsigned int access, + unsigned int sharing, unsigned int options ); + +static const struct object_ops console_server_ops = +{ + sizeof(struct console_server), /* size */ + console_server_dump, /* dump */ + no_get_type, /* get_type */ + add_queue, /* add_queue */ + remove_queue, /* remove_queue */ + console_server_signaled, /* signaled */ + no_satisfied, /* satisfied */ + no_signal, /* signal */ + no_get_fd, /* get_fd */ + default_fd_map_access, /* map_access */ + default_get_sd, /* get_sd */ + default_set_sd, /* set_sd */ + no_lookup_name, /* lookup_name */ + no_link_name, /* link_name */ + NULL, /* unlink_name */ + console_server_open_file, /* open_file */ + no_kernel_obj_list, /* get_kernel_obj_list */ + fd_close_handle, /* close_handle */ + console_server_destroy /* destroy */ +}; + struct font_info { short int width; @@ -1469,6 +1503,38 @@ static void scroll_console_output( struct screen_buffer *screen_buffer, int xsrc console_input_events_append( screen_buffer->input, &evt ); } +static void console_server_dump( struct object *obj, int verbose ) +{ + assert( obj->ops == &console_server_ops ); + fprintf( stderr, "Console server\n" ); +} + +static void console_server_destroy( struct object *obj ) +{ + assert( obj->ops == &console_server_ops ); +} + +static int console_server_signaled( struct object *obj, struct wait_queue_entry *entry ) +{ + assert( obj->ops == &console_server_ops ); + return 0; +} + +static struct object *console_server_open_file( struct object *obj, unsigned int access, + unsigned int sharing, unsigned int options ) +{ + return grab_object( obj ); +} + +static struct object *create_console_server( void ) +{ + struct console_server *server; + + if (!(server = alloc_object( &console_server_ops ))) return NULL; + + return &server->obj; +} + static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) { struct console_input *console = get_fd_user( fd ); @@ -1901,6 +1967,7 @@ static struct object *console_device_lookup_name( struct object *obj, struct uni static const WCHAR current_outW[] = {'C','u','r','r','e','n','t','O','u','t'}; static const WCHAR rendererW[] = {'R','e','n','d','e','r','e','r'}; static const WCHAR screen_bufferW[] = {'S','c','r','e','e','n','B','u','f','f','e','r'}; + static const WCHAR serverW[] = {'S','e','r','v','e','r'}; if (name->len == sizeof(current_inW) && !memcmp( name->str, current_inW, name->len )) { @@ -1947,6 +2014,12 @@ static struct object *console_device_lookup_name( struct object *obj, struct uni return create_console_output( current->process->console, -1 ); } + if (name->len == sizeof(serverW) && !memcmp( name->str, serverW, name->len )) + { + name->len = 0; + return create_console_server(); + } + return NULL; }
1
0
0
0
Jacek Caban : kernel32/tests: Fix tests on some broken Windows versions.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 7531091f33dcd0dc849cfb5df918e9a331f7a6b8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7531091f33dcd0dc849cfb5d…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Aug 20 23:46:26 2020 +0200 kernel32/tests: Fix tests on some broken Windows versions. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/console.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 3a374c7797..e6c88e8c73 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -2255,9 +2255,9 @@ static void check_region_(unsigned int line, const SMALL_RECT *region, unsigned else ok_(__FILE__,line)(region->Right == -right || region->Right == region->Left - 1, "Right = %u, expected %d\n", region->Right, right); - if (bottom >= 0) + if (bottom > 0) ok_(__FILE__,line)(region->Bottom == bottom, "Bottom = %u, expected %u\n", region->Bottom, bottom); - else + else if (bottom < 0) ok_(__FILE__,line)(region->Bottom == -bottom || region->Bottom == region->Top - 1, "Bottom = %u, expected %d\n", region->Bottom, bottom); } @@ -2862,7 +2862,7 @@ static void test_ReadConsoleOutput(HANDLE console) set_region(®ion, 200, 7, 15, 211); ret = ReadConsoleOutputW(console, char_info_buf, size, coord, ®ion); ok(!ret, "ReadConsoleOutputW returned: %x(%u)\n", ret, GetLastError()); - check_region(®ion, 200, 7, -15, -211); + check_region(®ion, 200, 7, -15, 0); size.X = 23; size.Y = 17;
1
0
0
0
Martin Storsjo : include: Update ARM64 context flag definitions to match current SDKs.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: 5b3842451ba6c7a37a24e0f16707d8a19020287d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5b3842451ba6c7a37a24e0f1…
Author: Martin Storsjo <martin(a)martin.st> Date: Fri Aug 21 15:02:03 2020 +0300 include: Update ARM64 context flag definitions to match current SDKs. CONTEXT_FLOATING_POINT should be included in CONTEXT_FULL, and there's a new flag CONTEXT_ARM64_X18 (not available without the arch specific prefix) that only is part of CONTEXT_ALL. Signed-off-by: Martin Storsjo <martin(a)martin.st> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/signal_arm64.c | 2 +- dlls/ntdll/unix/signal_arm64.c | 7 ++++--- include/winnt.h | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index e3102f7bdf..134e40545f 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -97,7 +97,7 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 8, "mov x1, sp\n\t" "stp x1, x30, [x0, #0x100]\n\t" /* context->Sp,Pc */ "mov w1, #0x400000\n\t" /* CONTEXT_ARM64 */ - "add w1, w1, #0x3\n\t" /* CONTEXT_FULL */ + "movk w1, #0x7\n\t" /* CONTEXT_FULL */ "str w1, [x0]\n\t" /* context->ContextFlags */ "mrs x1, NZCV\n\t" "str w1, [x0, #0x4]\n\t" /* context->Cpsr */ diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 52f00323a0..a4454af71e 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -311,7 +311,8 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext ) { DWORD i; - context->ContextFlags = CONTEXT_FULL; + context->ContextFlags = (CONTEXT_FULL & ~CONTEXT_FLOATING_POINT) | + CONTEXT_ARM64; context->u.s.Fp = FP_sig(sigcontext); /* Frame pointer */ context->u.s.Lr = LR_sig(sigcontext); /* Link register */ context->Sp = SP_sig(sigcontext); /* Stack pointer */ @@ -664,7 +665,7 @@ __ASM_GLOBAL_FUNC( call_user_apc_dispatcher, "csel x0, x19, x0, lo\n\t" "mov sp, x0\n\t" "mov w2, #0x400000\n\t" /* context.ContextFlags = CONTEXT_FULL */ - "movk w2, #3\n\t" + "movk w2, #7\n\t" "mov x1, x19\n\t" "str w2, [x19]\n\t" "mov x0, #~1\n\t" @@ -1039,7 +1040,7 @@ PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void init_thread_context( ctx, entry, arg, relay ); } pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); - ctx->ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT; + ctx->ContextFlags = CONTEXT_FULL; return ctx; } diff --git a/include/winnt.h b/include/winnt.h index 8c5f24aff8..63567ba62e 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -1928,11 +1928,12 @@ NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,DWORD,DWORD,RUNTIME_FUNCTION*,CONTE #define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x00000002) #define CONTEXT_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008) +#define CONTEXT_ARM64_X18 (CONTEXT_ARM64 | 0x00000010) #define CONTEXT_UNWOUND_TO_CALL 0x20000000 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_ARM64_X18) #define EXCEPTION_READ_FAULT 0 #define EXCEPTION_WRITE_FAULT 1
1
0
0
0
Martin Storsjo : winedump: Fix dumping of rare arm64 unwind opcodes.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: af6853278f74b1e5ea4db93fc433448a49eca047 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=af6853278f74b1e5ea4db93f…
Author: Martin Storsjo <martin(a)martin.st> Date: Fri Aug 21 14:57:20 2020 +0300 winedump: Fix dumping of rare arm64 unwind opcodes. Signed-off-by: Martin Storsjo <martin(a)martin.st> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- tools/winedump/pe.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index 7252a6a61f..f03c523be0 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -1345,18 +1345,22 @@ static void dump_arm64_codes( const BYTE *ptr, unsigned int count ) default:printf( "unknown op\n" ); break; } } - else if (ptr[i] == 0xe9) /* MSFT_OP_TRAP_FRAME */ + else if (ptr[i] == 0xe8) /* MSFT_OP_TRAP_FRAME */ { printf( "MSFT_OP_TRAP_FRAME\n" ); } - else if (ptr[i] == 0xea) /* MSFT_OP_MACHINE_FRAME */ + else if (ptr[i] == 0xe9) /* MSFT_OP_MACHINE_FRAME */ { printf( "MSFT_OP_MACHINE_FRAME\n" ); } - else if (ptr[i] == 0xeb) /* MSFT_OP_CONTEXT */ + else if (ptr[i] == 0xea) /* MSFT_OP_CONTEXT */ { printf( "MSFT_OP_CONTEXT\n" ); } + else if (ptr[i] == 0xec) /* MSFT_OP_CLEAR_UNWOUND_TO_CALL */ + { + printf( "MSFT_OP_CLEAR_UNWOUND_TO_CALL\n" ); + } else printf( "??\n"); } }
1
0
0
0
Nikolay Sivov : ole32: Use public symbol for maximum moniker comparison data length.
by Alexandre Julliard
21 Aug '20
21 Aug '20
Module: wine Branch: master Commit: d3502f92c035d2b8ef4f206ac724f3f63e8cb16b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=d3502f92c035d2b8ef4f206a…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Fri Aug 21 11:38:19 2020 +0300 ole32: Use public symbol for maximum moniker comparison data length. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ole32/moniker.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dlls/ole32/moniker.c b/dlls/ole32/moniker.c index e0cdd865c8..4421219ac1 100644 --- a/dlls/ole32/moniker.c +++ b/dlls/ole32/moniker.c @@ -44,11 +44,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -/* see MSDN docs for IROTData::GetComparisonData, which states what this - * constant is - */ -#define MAX_COMPARISON_DATA 2048 - static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr) { return I_RpcExceptionFilter(eptr->ExceptionRecord->ExceptionCode); @@ -245,7 +240,7 @@ static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparison hr = IMoniker_QueryInterface(pMoniker, &IID_IROTData, (void *)&pROTData); if (SUCCEEDED(hr)) { - ULONG size = MAX_COMPARISON_DATA; + ULONG size = ROT_COMPARE_MAX; *moniker_data = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MonikerComparisonData, abData[size])); if (!*moniker_data) {
1
0
0
0
← Newer
1
...
16
17
18
19
20
21
22
...
70
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Results per page:
10
25
50
100
200