Jacek Caban : win32u: Move NtUserGetWindowRgnEx implementation from user32.
Alexandre Julliard
julliard at winehq.org
Thu Mar 10 16:10:15 CST 2022
Module: wine
Branch: master
Commit: 929052a9c6f8b2758bd86c7d67c4fe67cc537791
URL: https://source.winehq.org/git/wine.git/?a=commit;h=929052a9c6f8b2758bd86c7d67c4fe67cc537791
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Mar 10 14:31:20 2022 +0100
win32u: Move NtUserGetWindowRgnEx 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/winpos.c | 45 ++-------------------------------------------
dlls/win32u/syscall.c | 1 +
dlls/win32u/win32u.spec | 2 +-
dlls/win32u/window.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
dlls/wow64win/syscall.h | 1 +
dlls/wow64win/user.c | 9 +++++++++
include/ntuser.h | 1 +
7 files changed, 63 insertions(+), 44 deletions(-)
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index 1387552ca55..c4c61347704 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -97,50 +97,9 @@ BOOL WINAPI GetWindowRect( HWND hwnd, LPRECT rect )
/***********************************************************************
* GetWindowRgn (USER32.@)
*/
-int WINAPI GetWindowRgn ( HWND hwnd, HRGN hrgn )
+int WINAPI GetWindowRgn( HWND hwnd, HRGN hrgn )
{
- int nRet = ERROR;
- NTSTATUS status;
- HRGN win_rgn = 0;
- RGNDATA *data;
- size_t size = 256;
-
- do
- {
- if (!(data = HeapAlloc( GetProcessHeap(), 0, sizeof(*data) + size - 1 )))
- {
- SetLastError( ERROR_OUTOFMEMORY );
- return ERROR;
- }
- SERVER_START_REQ( get_window_region )
- {
- req->window = wine_server_user_handle( hwnd );
- wine_server_set_reply( req, data->Buffer, size );
- if (!(status = wine_server_call( req )))
- {
- size_t reply_size = wine_server_reply_size( reply );
- if (reply_size)
- {
- data->rdh.dwSize = sizeof(data->rdh);
- data->rdh.iType = RDH_RECTANGLES;
- data->rdh.nCount = reply_size / sizeof(RECT);
- data->rdh.nRgnSize = reply_size;
- win_rgn = ExtCreateRegion( NULL, data->rdh.dwSize + data->rdh.nRgnSize, data );
- }
- }
- else size = reply->total_size;
- }
- SERVER_END_REQ;
- HeapFree( GetProcessHeap(), 0, data );
- } while (status == STATUS_BUFFER_OVERFLOW);
-
- if (status) SetLastError( RtlNtStatusToDosError(status) );
- else if (win_rgn)
- {
- nRet = CombineRgn( hrgn, win_rgn, 0, RGN_COPY );
- DeleteObject( win_rgn );
- }
- return nRet;
+ return NtUserGetWindowRgnEx( hwnd, hrgn, 0 );
}
/***********************************************************************
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 0db90cc185d..41f9cfead49 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -139,6 +139,7 @@ static void * const syscalls[] =
NtUserGetProp,
NtUserGetSystemDpiForProcess,
NtUserGetThreadDesktop,
+ NtUserGetWindowRgnEx,
NtUserInitializeClientPfnArrays,
NtUserInternalGetWindowText,
NtUserNotifyWinEvent,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index fdc4aa153b0..5c493c54629 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -1016,7 +1016,7 @@
@ stub NtUserGetWindowMinimizeRect
@ stub NtUserGetWindowPlacement
@ stub NtUserGetWindowProcessHandle
-@ stub NtUserGetWindowRgnEx
+@ stdcall -syscall NtUserGetWindowRgnEx(long long long)
@ stub NtUserGhostWindowFromHungWindow
@ stub NtUserHandleDelegatedInput
@ stub NtUserHardErrorControl
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index abfc19de40a..2129afa405e 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -1163,6 +1163,54 @@ static BOOL get_window_info( HWND hwnd, WINDOWINFO *info )
return TRUE;
}
+/*******************************************************************
+ * NtUserGetWindowRgnEx (win32u.@)
+ */
+int WINAPI NtUserGetWindowRgnEx( HWND hwnd, HRGN hrgn, UINT unk )
+{
+ NTSTATUS status;
+ HRGN win_rgn = 0;
+ RGNDATA *data;
+ size_t size = 256;
+ int ret = ERROR;
+
+ do
+ {
+ if (!(data = malloc( sizeof(*data) + size - 1 )))
+ {
+ SetLastError( ERROR_OUTOFMEMORY );
+ return ERROR;
+ }
+ SERVER_START_REQ( get_window_region )
+ {
+ req->window = wine_server_user_handle( hwnd );
+ wine_server_set_reply( req, data->Buffer, size );
+ if (!(status = wine_server_call( req )))
+ {
+ size_t reply_size = wine_server_reply_size( reply );
+ if (reply_size)
+ {
+ data->rdh.dwSize = sizeof(data->rdh);
+ data->rdh.iType = RDH_RECTANGLES;
+ data->rdh.nCount = reply_size / sizeof(RECT);
+ data->rdh.nRgnSize = reply_size;
+ win_rgn = NtGdiExtCreateRegion( NULL, data->rdh.dwSize + data->rdh.nRgnSize, data );
+ }
+ }
+ else size = reply->total_size;
+ }
+ SERVER_END_REQ;
+ free( data );
+ } while (status == STATUS_BUFFER_OVERFLOW);
+
+ if (set_ntstatus( status ) && win_rgn)
+ {
+ ret = NtGdiCombineRgn( hrgn, win_rgn, 0, RGN_COPY );
+ NtGdiDeleteObjectApp( win_rgn );
+ }
+ return ret;
+}
+
/*****************************************************************************
* NtUserGetLayeredWindowAttributes (win32u.@)
*/
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index 303d719d3a8..82262cd83ab 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -124,6 +124,7 @@
SYSCALL_ENTRY( NtUserGetProp ) \
SYSCALL_ENTRY( NtUserGetSystemDpiForProcess ) \
SYSCALL_ENTRY( NtUserGetThreadDesktop ) \
+ SYSCALL_ENTRY( NtUserGetWindowRgnEx ) \
SYSCALL_ENTRY( NtUserInitializeClientPfnArrays ) \
SYSCALL_ENTRY( NtUserInternalGetWindowText ) \
SYSCALL_ENTRY( NtUserNotifyWinEvent ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 18486c92305..4ee05838b47 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -197,6 +197,15 @@ NTSTATUS WINAPI wow64_NtUserGetAncestor( UINT *args )
return HandleToUlong( NtUserGetAncestor( hwnd, type ));
}
+NTSTATUS WINAPI wow64_NtUserGetWindowRgnEx( UINT *args )
+{
+ HWND hwnd = get_handle( &args );
+ HRGN hrgn = get_handle( &args );
+ UINT unk = get_ulong( &args );
+
+ return NtUserGetWindowRgnEx( hwnd, hrgn, unk );
+}
+
NTSTATUS WINAPI wow64_NtUserBuildHwndList( UINT *args )
{
HDESK desktop = get_handle( &args );
diff --git a/include/ntuser.h b/include/ntuser.h
index 547471daf69..25d58de5992 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -333,6 +333,7 @@ DWORD WINAPI NtUserGetQueueStatus( UINT flags );
ULONG WINAPI NtUserGetSystemDpiForProcess( HANDLE process );
HDESK WINAPI NtUserGetThreadDesktop( DWORD thread );
BOOL WINAPI NtUserGetUpdatedClipboardFormats( UINT *formats, UINT size, UINT *out_size );
+int WINAPI NtUserGetWindowRgnEx( HWND hwnd, HRGN hrgn, UINT unk );
NTSTATUS WINAPI NtUserInitializeClientPfnArrays( const struct user_client_procs *client_procsA,
const struct user_client_procs *client_procsW,
const void *client_workers, HINSTANCE user_module );
More information about the wine-cvs
mailing list