Jacek Caban : kernelbase: Use NtCreateFile for console handles in CreateFileW.
Alexandre Julliard
julliard at winehq.org
Fri Jun 26 17:00:54 CDT 2020
Module: wine
Branch: master
Commit: 0556d9e6f1c0951e6e4026efe3b176407b82fc7b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0556d9e6f1c0951e6e4026efe3b176407b82fc7b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jun 25 22:27:40 2020 +0200
kernelbase: Use NtCreateFile for console handles in CreateFileW.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 76cc71c7a3..50f80314f0 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 3171933b12..5fb84c0bd9 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 cc79284520..bd87f75665 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 459ae88c71..88765df3d1 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;
More information about the wine-cvs
mailing list