- OpenConsole: try to open the Unix console if we fail with wineserver
- kernel32: simplifying code for opening a console handle - msvcrt: now correctly initializing the handles to the Windows console
This commit is contained in:
parent
809edabfbe
commit
a1deba5ab4
|
@ -5,7 +5,7 @@
|
|||
* Copyright 1997 Karl Garrison
|
||||
* Copyright 1998 John Richardson
|
||||
* Copyright 1998 Marcus Meissner
|
||||
* Copyright 2001,2002,2004 Eric Pouech
|
||||
* Copyright 2001,2002,2004,2005 Eric Pouech
|
||||
* Copyright 2001 Alexandre Julliard
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
|
@ -58,6 +58,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(console);
|
|||
static UINT console_input_codepage;
|
||||
static UINT console_output_codepage;
|
||||
|
||||
static const WCHAR coninW[] = {'C','O','N','I','N','$',0};
|
||||
static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0};
|
||||
|
||||
/* map input records to ASCII */
|
||||
static void input_records_WtoA( INPUT_RECORD *buffer, int count )
|
||||
|
@ -208,8 +210,6 @@ BOOL WINAPI Beep( DWORD dwFreq, DWORD dwDur )
|
|||
*/
|
||||
HANDLE WINAPI OpenConsoleW(LPCWSTR name, DWORD access, BOOL inherit, DWORD creation)
|
||||
{
|
||||
static const WCHAR coninW[] = {'C','O','N','I','N','$',0};
|
||||
static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0};
|
||||
BOOL output;
|
||||
HANDLE ret;
|
||||
|
||||
|
@ -239,7 +239,23 @@ HANDLE WINAPI OpenConsoleW(LPCWSTR name, DWORD access, BOOL inherit, DWORD creat
|
|||
ret = reply->handle;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
return ret ? console_handle_map(ret) : INVALID_HANDLE_VALUE;
|
||||
if (ret)
|
||||
ret = console_handle_map(ret);
|
||||
else
|
||||
{
|
||||
/* likely, we're not attached to wineconsole
|
||||
* let's try to return a handle to the unix-console
|
||||
*/
|
||||
int fd = open("/dev/tty", output ? O_WRONLY : O_RDONLY);
|
||||
ret = INVALID_HANDLE_VALUE;
|
||||
if (fd != -1)
|
||||
{
|
||||
DWORD attr = (output ? GENERIC_WRITE : GENERIC_READ) | SYNCHRONIZE;
|
||||
wine_server_fd_to_handle(fd, attr, inherit, &ret);
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
|
@ -1099,19 +1115,20 @@ BOOL WINAPI AllocConsole(void)
|
|||
STARTUPINFOA siCurrent;
|
||||
STARTUPINFOA siConsole;
|
||||
char buffer[1024];
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
handle_in = CreateFileA( "CONIN$", GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
|
||||
0, NULL, OPEN_EXISTING, 0, 0 );
|
||||
handle_in = OpenConsoleW( coninW, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
|
||||
FALSE, OPEN_EXISTING );
|
||||
|
||||
if (handle_in != INVALID_HANDLE_VALUE)
|
||||
if (VerifyConsoleIoHandle(handle_in))
|
||||
{
|
||||
/* we already have a console opened on this process, don't create a new one */
|
||||
CloseHandle(handle_in);
|
||||
return FALSE;
|
||||
}
|
||||
/* happens when we're running on a Unix console */
|
||||
if (handle_in != INVALID_HANDLE_VALUE) CloseHandle(handle_in);
|
||||
|
||||
GetStartupInfoA(&siCurrent);
|
||||
|
||||
|
@ -1148,16 +1165,12 @@ BOOL WINAPI AllocConsole(void)
|
|||
|
||||
if( !(siCurrent.dwFlags & STARTF_USESTDHANDLES) ) {
|
||||
/* all std I/O handles are inheritable by default */
|
||||
sa.nLength = sizeof(sa);
|
||||
sa.lpSecurityDescriptor = NULL;
|
||||
sa.bInheritHandle = TRUE;
|
||||
|
||||
handle_in = CreateFileA( "CONIN$", GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
|
||||
0, &sa, OPEN_EXISTING, 0, 0 );
|
||||
handle_in = OpenConsoleW( coninW, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
|
||||
TRUE, OPEN_EXISTING );
|
||||
if (handle_in == INVALID_HANDLE_VALUE) goto the_end;
|
||||
|
||||
handle_out = CreateFileA( "CONOUT$", GENERIC_READ|GENERIC_WRITE,
|
||||
0, &sa, OPEN_EXISTING, 0, 0 );
|
||||
handle_out = OpenConsoleW( conoutW, GENERIC_READ|GENERIC_WRITE,
|
||||
TRUE, OPEN_EXISTING );
|
||||
if (handle_out == INVALID_HANDLE_VALUE) goto the_end;
|
||||
|
||||
if (!DuplicateHandle(GetCurrentProcess(), handle_out, GetCurrentProcess(),
|
||||
|
|
|
@ -1015,6 +1015,11 @@ static void test_DebuggingFlag(void)
|
|||
assert(DeleteFileA(resfile) != 0);
|
||||
}
|
||||
|
||||
static BOOL is_console(HANDLE h)
|
||||
{
|
||||
return h != INVALID_HANDLE_VALUE && ((ULONG_PTR)h & 3) == 3;
|
||||
}
|
||||
|
||||
static void test_Console(void)
|
||||
{
|
||||
char buffer[MAX_PATH];
|
||||
|
@ -1042,7 +1047,7 @@ static void test_Console(void)
|
|||
startup.hStdOutput = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0);
|
||||
|
||||
/* first, we need to be sure we're attached to a console */
|
||||
if (startup.hStdInput == INVALID_HANDLE_VALUE || startup.hStdOutput == INVALID_HANDLE_VALUE)
|
||||
if (!is_console(startup.hStdInput) || !is_console(startup.hStdOutput))
|
||||
{
|
||||
/* we're not attached to a console, let's do it */
|
||||
AllocConsole();
|
||||
|
|
|
@ -43,14 +43,8 @@ void msvcrt_init_console(void)
|
|||
{
|
||||
TRACE(":Opening console handles\n");
|
||||
|
||||
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE),
|
||||
GetCurrentProcess(), &MSVCRT_console_in, 0, FALSE, DUPLICATE_SAME_ACCESS);
|
||||
|
||||
/* FIXME: Should be initialised with:
|
||||
* CreateFileA("CONIN$", GENERIC_READ, FILE_SHARE_READ,
|
||||
* NULL, OPEN_EXISTING, 0, NULL);
|
||||
*/
|
||||
|
||||
MSVCRT_console_in = CreateFileA("CONIN$", GENERIC_READ, FILE_SHARE_READ,
|
||||
NULL, OPEN_EXISTING, 0, NULL);
|
||||
MSVCRT_console_out= CreateFileA("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE,
|
||||
NULL, OPEN_EXISTING, 0, NULL);
|
||||
|
||||
|
|
Loading…
Reference in New Issue