Alexandre Julliard : kernelbase: Add an OpenConsoleW() replacement wrapper.

Alexandre Julliard julliard at winehq.org
Tue Dec 10 15:58:49 CST 2019


Module: wine
Branch: master
Commit: 7b3c0fbed230dda20836b4b4fb8cc0584e198b99
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7b3c0fbed230dda20836b4b4fb8cc0584e198b99

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Dec 10 11:09:33 2019 +0100

kernelbase: Add an OpenConsoleW() replacement wrapper.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/console.c    | 25 +++++++++++++++++++++++++
 dlls/kernelbase/file.c       | 16 ++++++----------
 dlls/kernelbase/kernelbase.h |  2 ++
 3 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 615c0f434a..0729e578e4 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 23ca5629a3..59ddcd9ed9 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 4aed1829e3..d7de53c412 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;




More information about the wine-cvs mailing list