diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index 615c0f434a1..0729e578e44 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -157,6 +157,31 @@ static COORD get_largest_console_window_size( HANDLE handle ) return c; } +/* helper function to replace OpenConsoleW */ +HANDLE open_console( BOOL output, DWORD access, SECURITY_ATTRIBUTES *sa, DWORD creation ) +{ + HANDLE ret; + + if (creation != OPEN_EXISTING) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return INVALID_HANDLE_VALUE; + } + + SERVER_START_REQ( open_console ) + { + req->from = wine_server_obj_handle( ULongToHandle( output )); + req->access = access; + req->attributes = sa && sa->bInheritHandle ? OBJ_INHERIT : 0; + req->share = FILE_SHARE_READ | FILE_SHARE_WRITE; + wine_server_call_err( req ); + ret = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + if (ret) ret = console_handle_map( ret ); + return ret; +} + /****************************************************************** * AttachConsole (kernelbase.@) diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 23ca5629a32..59ddcd9ed93 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -428,8 +428,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO DWORD dosdev; const WCHAR *vxd_name = NULL; static const WCHAR bkslashes_with_dotW[] = {'\\','\\','.','\\',0}; - static const WCHAR coninW[] = {'C','O','N','I','N','$',0}; - static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0}; SECURITY_QUALITY_OF_SERVICE qos; static const UINT nt_disposition[5] = @@ -462,12 +460,10 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO /* Open a console for CONIN$ or CONOUT$ */ - if (!wcsicmp(filename, coninW) || !wcsicmp(filename, conoutW)) - { - ret = OpenConsoleW( filename, access, sa && sa->bInheritHandle, creation ? OPEN_EXISTING : 0 ); - if (ret == INVALID_HANDLE_VALUE) SetLastError( ERROR_INVALID_PARAMETER ); - return ret; - } + if (!wcsicmp( filename, L"CONIN$" )) + return open_console( FALSE, access, sa, creation ? OPEN_EXISTING : 0 ); + if (!wcsicmp( filename, L"CONOUT$" )) + return open_console( TRUE, access, sa, creation ? OPEN_EXISTING : 0 ); if (!wcsncmp( filename, bkslashes_with_dotW, 4 )) { @@ -502,9 +498,9 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO switch (access & (GENERIC_READ|GENERIC_WRITE)) { case GENERIC_READ: - return OpenConsoleW( coninW, access, sa && sa->bInheritHandle, OPEN_EXISTING ); + return open_console( FALSE, access, sa, OPEN_EXISTING ); case GENERIC_WRITE: - return OpenConsoleW( conoutW, access, sa && sa->bInheritHandle, OPEN_EXISTING ); + return open_console( TRUE, access, sa, OPEN_EXISTING ); default: SetLastError( ERROR_FILE_NOT_FOUND ); return INVALID_HANDLE_VALUE; diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 4aed1829e37..d7de53c412d 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -35,6 +35,8 @@ extern const WCHAR system_dir[] DECLSPEC_HIDDEN; static const BOOL is_win64 = (sizeof(void *) > sizeof(int)); extern BOOL is_wow64 DECLSPEC_HIDDEN; +extern HANDLE open_console( BOOL output, DWORD access, SECURITY_ATTRIBUTES *sa, DWORD creation ) DECLSPEC_HIDDEN; + static inline BOOL is_console_handle(HANDLE h) { return h != INVALID_HANDLE_VALUE && ((UINT_PTR)h & 3) == 3;