From 0556d9e6f1c0951e6e4026efe3b176407b82fc7b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 25 Jun 2020 22:27:40 +0200 Subject: [PATCH] kernelbase: Use NtCreateFile for console handles in CreateFileW. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/console.c | 5 ----- dlls/kernelbase/console.c | 26 -------------------------- dlls/kernelbase/file.c | 31 ++++++------------------------- dlls/kernelbase/kernelbase.h | 2 -- 4 files changed, 6 insertions(+), 58 deletions(-) diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 76cc71c7a3a..50f80314f0f 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -1308,7 +1308,6 @@ static void test_CreateFileW(void) cf_table[index].creation, FILE_ATTRIBUTE_NORMAL, NULL); if (!index && ret == INVALID_HANDLE_VALUE) { - todo_wine win_skip("Skipping NT path tests, not supported on this Windows version\n"); skip_nt = TRUE; continue; @@ -3208,25 +3207,21 @@ static void test_FreeConsole(void) ok(ret, "FreeConsole failed: %u\n", GetLastError()); handle = CreateFileA("CONOUT$", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); - todo_wine ok(handle == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)), "CreateFileA failed: %u\n", GetLastError()); handle = CreateFileA("CONIN$", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); - todo_wine ok(handle == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)), "CreateFileA failed: %u\n", GetLastError()); handle = CreateFileA("CON", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); - todo_wine ok(handle == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_ACCESS_DENIED /* winxp */)), "CreateFileA failed: %u\n", GetLastError()); handle = CreateFileA("CON", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); - todo_wine ok(handle == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* winxp */)), "CreateFileA failed: %u\n", GetLastError()); diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index 3171933b122..5fb84c0bd96 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -172,32 +172,6 @@ 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 cc792845205..bd87f75665d 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -744,13 +744,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO (sharing & FILE_SHARE_DELETE) ? "FILE_SHARE_DELETE " : "", creation, attributes); - /* Open a console for CONIN$ or CONOUT$ */ - - 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, L"\\\\.\\", 4 )) { if ((filename[4] && filename[5] == ':' && !filename[6]) || @@ -771,24 +764,6 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO } else dosdev = RtlIsDosDeviceName_U( filename ); - if (dosdev) - { - if (LOWORD(dosdev) == 3 * sizeof(WCHAR) && - !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CON", 3 )) - { - switch (access & (GENERIC_READ|GENERIC_WRITE)) - { - case GENERIC_READ: - return open_console( FALSE, access, sa, OPEN_EXISTING ); - case GENERIC_WRITE: - return open_console( TRUE, access, sa, OPEN_EXISTING ); - default: - SetLastError( ERROR_FILE_NOT_FOUND ); - return INVALID_HANDLE_VALUE; - } - } - } - if (creation < CREATE_NEW || creation > TRUNCATE_EXISTING) { SetLastError( ERROR_INVALID_PARAMETER ); @@ -853,6 +828,12 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileW( LPCWSTR filename, DWORD access, DWO } else { + if (dosdev && + ((LOWORD(dosdev) == 3 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CON", 3 )) || + (LOWORD(dosdev) == 6 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CONIN$", 6 )) || + (LOWORD(dosdev) == 7 * sizeof(WCHAR) && !wcsnicmp( filename + HIWORD(dosdev)/sizeof(WCHAR), L"CONOUT$", 7 )))) + ret = console_handle_map( ret ); + if ((creation == CREATE_ALWAYS && io.Information == FILE_OVERWRITTEN) || (creation == OPEN_ALWAYS && io.Information == FILE_OPENED)) SetLastError( ERROR_ALREADY_EXISTS ); diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 459ae88c71f..88765df3d16 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -35,8 +35,6 @@ 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;