Commit 859b526c authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

kernelbase: Use conhost in AllocConsole.

parent 12cc863a
...@@ -326,9 +326,10 @@ BOOL WINAPI AllocConsole(void) ...@@ -326,9 +326,10 @@ BOOL WINAPI AllocConsole(void)
{ {
SECURITY_ATTRIBUTES inheritable_attr = { sizeof(inheritable_attr), NULL, TRUE }; SECURITY_ATTRIBUTES inheritable_attr = { sizeof(inheritable_attr), NULL, TRUE };
STARTUPINFOW app_si, console_si; STARTUPINFOW app_si, console_si;
WCHAR buffer[1024], cmd[256]; HANDLE server, console = NULL;
WCHAR buffer[1024], cmd[256], conhost_path[MAX_PATH];
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
HANDLE event, console; void *redir;
BOOL ret; BOOL ret;
TRACE("()\n"); TRACE("()\n");
...@@ -343,6 +344,8 @@ BOOL WINAPI AllocConsole(void) ...@@ -343,6 +344,8 @@ BOOL WINAPI AllocConsole(void)
return FALSE; return FALSE;
} }
if (!(server = create_console_server()) || !(console = create_console_reference( server ))) goto error;
GetStartupInfoW(&app_si); GetStartupInfoW(&app_si);
memset(&console_si, 0, sizeof(console_si)); memset(&console_si, 0, sizeof(console_si));
...@@ -372,30 +375,27 @@ BOOL WINAPI AllocConsole(void) ...@@ -372,30 +375,27 @@ BOOL WINAPI AllocConsole(void)
console_si.lpTitle = buffer; console_si.lpTitle = buffer;
} }
if (!(event = CreateEventW( &inheritable_attr, TRUE, FALSE, NULL ))) goto error; 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 ));
Wow64DisableWow64FsRedirection( &redir );
ret = CreateProcessW( conhost_path, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &console_si, &pi );
Wow64RevertWow64FsRedirection( redir );
if (!ret || !create_console_connection( console)) goto error;
if (!init_console_std_handles( !(app_si.dwFlags & STARTF_USESTDHANDLES) )) goto error;
swprintf( cmd, ARRAY_SIZE(cmd), L"wineconsole --use-event=%ld", (DWORD_PTR)event );
if ((ret = CreateProcessW( NULL, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &console_si, &pi )))
{
HANDLE wait_handles[2] = { event, pi.hProcess };
ret = WaitForMultipleObjects( ARRAY_SIZE(wait_handles), wait_handles, FALSE, INFINITE ) == WAIT_OBJECT_0;
CloseHandle( pi.hThread );
CloseHandle( pi.hProcess );
}
CloseHandle( event );
if (!ret || !init_console_std_handles( !(app_si.dwFlags & STARTF_USESTDHANDLES) )) goto error;
console = CreateFileW( L"CONIN$", GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, 0, NULL, OPEN_EXISTING, 0, 0 );
if (console == INVALID_HANDLE_VALUE) goto error;
RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = console; RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = console;
TRACE( "Started wineconsole pid=%08x tid=%08x\n", pi.dwProcessId, pi.dwThreadId ); TRACE( "Started wineconsole pid=%08x tid=%08x\n", pi.dwProcessId, pi.dwThreadId );
CloseHandle( server );
RtlLeaveCriticalSection( &console_section ); RtlLeaveCriticalSection( &console_section );
SetLastError( ERROR_SUCCESS ); SetLastError( ERROR_SUCCESS );
return TRUE; return TRUE;
error: error:
ERR("Can't allocate console\n"); ERR("Can't allocate console\n");
NtClose( console );
NtClose( server );
FreeConsole(); FreeConsole();
RtlLeaveCriticalSection( &console_section ); RtlLeaveCriticalSection( &console_section );
return FALSE; return FALSE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment