Jacek Caban : win32u: Move NtUserGetClipboardFormatName implementation from user32.

Alexandre Julliard julliard at winehq.org
Mon Nov 15 16:01:27 CST 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 12 12:53:28 2021 +0100

win32u: Move NtUserGetClipboardFormatName implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/clipboard.c      | 12 +-----------
 dlls/user32/user32.spec      |  2 +-
 dlls/win32u/clipboard.c      | 25 +++++++++++++++++++++++++
 dlls/win32u/syscall.c        |  1 +
 dlls/win32u/win32u.spec      |  2 +-
 dlls/win32u/win32u_private.h |  6 ++++++
 dlls/wow64win/syscall.h      |  1 +
 dlls/wow64win/user.c         |  9 +++++++++
 include/ntuser.h             |  1 +
 9 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c
index b9bcc184ca1..2e0c6b92d39 100644
--- a/dlls/user32/clipboard.c
+++ b/dlls/user32/clipboard.c
@@ -82,7 +82,7 @@ static const char *debugstr_format( UINT id )
 {
     WCHAR buffer[256];
     DWORD le = GetLastError();
-    BOOL r = GetClipboardFormatNameW( id, buffer, 256 );
+    BOOL r = NtUserGetClipboardFormatName( id, buffer, 256 );
     SetLastError(le);
 
     if (r)
@@ -658,16 +658,6 @@ UINT WINAPI RegisterClipboardFormatA( LPCSTR name )
 }
 
 
-/**************************************************************************
- *		GetClipboardFormatNameW (USER32.@)
- */
-INT WINAPI GetClipboardFormatNameW( UINT format, LPWSTR buffer, INT maxlen )
-{
-    if (format < MAXINTATOM || format > 0xffff) return 0;
-    return GlobalGetAtomNameW( format, buffer, maxlen );
-}
-
-
 /**************************************************************************
  *		GetClipboardFormatNameA (USER32.@)
  */
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 87f4dc468bf..319dda49eb5 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -276,7 +276,7 @@
 @ stdcall GetClipCursor(ptr)
 @ stdcall GetClipboardData(long)
 @ stdcall GetClipboardFormatNameA(long ptr long)
-@ stdcall GetClipboardFormatNameW(long ptr long)
+@ stdcall GetClipboardFormatNameW(long ptr long) NtUserGetClipboardFormatName
 @ stdcall GetClipboardOwner()
 @ stdcall GetClipboardSequenceNumber ()
 @ stdcall GetClipboardViewer()
diff --git a/dlls/win32u/clipboard.c b/dlls/win32u/clipboard.c
index 8d0e09fdb55..c2fd07ac5b9 100644
--- a/dlls/win32u/clipboard.c
+++ b/dlls/win32u/clipboard.c
@@ -53,3 +53,28 @@ INT WINAPI NtUserCountClipboardFormats(void)
     TRACE( "returning %d\n", count );
     return count;
 }
+
+/**************************************************************************
+ *	     NtUserGetClipboardFormatName    (win32u.@)
+ */
+INT WINAPI NtUserGetClipboardFormatName( UINT format, WCHAR *buffer, INT maxlen )
+{
+    char buf[sizeof(ATOM_BASIC_INFORMATION) + 255 * sizeof(WCHAR)];
+    ATOM_BASIC_INFORMATION *abi = (ATOM_BASIC_INFORMATION *)buf;
+    UINT length = 0;
+
+    if (format < MAXINTATOM || format > 0xffff) return 0;
+    if (maxlen <= 0)
+    {
+        SetLastError( ERROR_MORE_DATA );
+        return 0;
+    }
+    if (!set_ntstatus( NtQueryInformationAtom( format, AtomBasicInformation,
+                                               buf, sizeof(buf), NULL )))
+        return 0;
+
+    length = min( abi->NameLength / sizeof(WCHAR), maxlen - 1 );
+    if (length) memcpy( buffer, abi->Name, length * sizeof(WCHAR) );
+    buffer[length] = 0;
+    return length;
+}
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 762729f815e..a84633b2215 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -105,6 +105,7 @@ static void * const syscalls[] =
     NtUserCloseWindowStation,
     NtUserCreateDesktopEx,
     NtUserCreateWindowStation,
+    NtUserGetClipboardFormatName,
     NtUserGetLayeredWindowAttributes,
     NtUserGetObjectInformation,
     NtUserGetProcessWindowStation,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index daea9cfe21a..d1774804293 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -903,7 +903,7 @@
 @ stub NtUserGetClipCursor
 @ stub NtUserGetClipboardAccessToken
 @ stub NtUserGetClipboardData
-@ stub NtUserGetClipboardFormatName
+@ stdcall -syscall NtUserGetClipboardFormatName(long ptr long)
 @ stub NtUserGetClipboardOwner
 @ stub NtUserGetClipboardSequenceNumber
 @ stub NtUserGetClipboardViewer
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index a78c7bb906b..7526f4414dd 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -232,6 +232,12 @@ extern ULONG query_reg_ascii_value( HKEY hkey, const char *name,
 
 extern const struct user_driver_funcs *user_driver DECLSPEC_HIDDEN;
 
+static inline BOOL set_ntstatus( NTSTATUS status )
+{
+    if (status) SetLastError( RtlNtStatusToDosError( status ));
+    return !status;
+}
+
 static inline WCHAR *win32u_wcsrchr( const WCHAR *str, WCHAR ch )
 {
     WCHAR *ret = NULL;
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index 8430d0b1527..b78b4697e6c 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -92,6 +92,7 @@
     SYSCALL_ENTRY( NtUserCloseWindowStation ) \
     SYSCALL_ENTRY( NtUserCreateDesktopEx ) \
     SYSCALL_ENTRY( NtUserCreateWindowStation ) \
+    SYSCALL_ENTRY( NtUserGetClipboardFormatName ) \
     SYSCALL_ENTRY( NtUserGetLayeredWindowAttributes ) \
     SYSCALL_ENTRY( NtUserGetObjectInformation ) \
     SYSCALL_ENTRY( NtUserGetProcessWindowStation ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 2686d75a094..f12516843fb 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -190,3 +190,12 @@ NTSTATUS WINAPI wow64_NtUserGetLayeredWindowAttributes( UINT *args )
 
     return NtUserGetLayeredWindowAttributes( hwnd, key, alpha, flags );
 }
+
+NTSTATUS WINAPI wow64_NtUserGetClipboardFormatName( UINT *args )
+{
+    UINT format = get_ulong( &args );
+    WCHAR *buffer = get_ptr( &args );
+    INT maxlen = get_ulong( &args );
+
+    return NtUserGetClipboardFormatName( format, buffer, maxlen );
+}
diff --git a/include/ntuser.h b/include/ntuser.h
index de493b7a6d7..a68c8458213 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -31,6 +31,7 @@ HDESK   WINAPI NtUserCreateDesktopEx( OBJECT_ATTRIBUTES *attr, UNICODE_STRING *d
                                       ULONG heap_size );
 HWINSTA WINAPI NtUserCreateWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK mask, ULONG arg3,
                                           ULONG arg4, ULONG arg5, ULONG arg6, ULONG arg7 );
+INT     WINAPI NtUserGetClipboardFormatName( UINT format, WCHAR *buffer, INT maxlen );
 BOOL    WINAPI NtUserGetLayeredWindowAttributes( HWND hwnd, COLORREF *key, BYTE *alpha, DWORD *flags );
 BOOL    WINAPI NtUserGetObjectInformation( HANDLE handle, INT index, void *info,
                                            DWORD len, DWORD *needed );




More information about the wine-cvs mailing list