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