From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 5474abd76da..0d873418536 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1809,12 +1809,14 @@ NTSTATUS WINAPI wow64_NtUserGetClipboardData( UINT *args )
params.data = UlongToPtr( params32->data ); params.size = params32->size; + params.data_size = params32->data_size; + params.data_only = params32->data_only;
ret = NtUserGetClipboardData( format, ¶ms );
+ params32->size = params.size; params32->data_size = params.data_size; params32->seqno = params.seqno; - params32->data_only = params.data_only; return HandleToUlong( ret ); }
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 0d873418536..bbe3e37a24d 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1981,8 +1981,16 @@ NTSTATUS WINAPI wow64_NtUserGetIconInfo( UINT *args ) info32->yHotspot = info.yHotspot; info32->hbmMask = HandleToUlong( info.hbmMask ); info32->hbmColor = HandleToUlong( info.hbmColor ); - if (module32) module32->Length = module.Length; - if (res_name32) res_name32->Length = res_name.Length; + if (module32) + { + module32->Buffer = PtrToUlong( module.Buffer ); + module32->Length = module.Length; + } + if (res_name32) + { + res_name32->Buffer = PtrToUlong( res_name.Buffer ); + res_name32->Length = res_name.Length; + } return TRUE; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index bbe3e37a24d..d4b9aac4fb6 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -2091,12 +2091,13 @@ NTSTATUS WINAPI wow64_NtUserGetMenuBarInfo( UINT *args ) }
info.cbSize = sizeof(info); - info.rcBar = info32->rcBar; - info.hMenu = UlongToHandle( info32->hMenu ); - info.hwndMenu = UlongToHandle( info32->hwndMenu ); - info.fBarFocused = info32->fBarFocused; - info.fFocused = info32->fFocused; - return NtUserGetMenuBarInfo( hwnd, id, item, &info ); + if (!NtUserGetMenuBarInfo( hwnd, id, item, &info )) return FALSE; + info32->rcBar = info.rcBar; + info32->hMenu = HandleToUlong( info.hMenu ); + info32->hwndMenu = HandleToUlong( info.hwndMenu ); + info32->fBarFocused = info.fBarFocused; + info32->fFocused = info.fFocused; + return TRUE; }
NTSTATUS WINAPI wow64_NtUserGetMenuItemRect( UINT *args ) @@ -2136,7 +2137,7 @@ NTSTATUS WINAPI wow64_NtUserGetMouseMovePointsEx( UINT *args )
if (size != sizeof(MOUSEMOVEPOINT32) || count < 0 || count > ARRAYSIZE( ptin )) { - RtlSetLastWin32Error( ERROR_INVALID_PARAMETER ); + set_last_error32( ERROR_INVALID_PARAMETER ); return -1; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index d4b9aac4fb6..1247eb86525 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -3222,12 +3222,18 @@ NTSTATUS WINAPI wow64_NtUserSendInput( UINT *args ) INPUT *inputs = NULL; unsigned int i;
- if (size != sizeof(*inputs32)) + if (size != sizeof(*inputs32) || !count) { set_last_error32( ERROR_INVALID_PARAMETER ); return 0; }
+ if (!inputs32) + { + set_last_error32( ERROR_NOACCESS ); + return 0; + } + if (count && !(inputs = Wow64AllocateTemp( count * sizeof(*inputs) ))) return 0;
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 1247eb86525..c71042f46f4 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -3297,6 +3297,16 @@ NTSTATUS WINAPI wow64_NtUserSetClassLongPtr( UINT *args ) LONG_PTR newval = get_ulong( &args ); BOOL ansi = get_ulong( &args );
+ if (offset == GCLP_MENUNAME) + { + struct client_menu_name menu_name; + struct client_menu_name32 *menu_name32 = UlongToPtr( newval ); + NtUserSetClassLong( hwnd, offset, + (UINT_PTR)client_menu_name_32to64( &menu_name, menu_name32 ), ansi ); + client_menu_name_64to32( &menu_name, menu_name32 ); + return 0; + } + return NtUserSetClassLongPtr( hwnd, offset, newval, ansi ); }
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 46 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index c71042f46f4..13d1d31a4a5 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -3845,6 +3845,7 @@ NTSTATUS WINAPI wow64_NtUserThunkedMenuItemInfo( UINT *args ) UNICODE_STRING32 *str32 = get_ptr( &args ); MENUITEMINFOW info = { sizeof(info) }, *info_ptr; UNICODE_STRING str; + UINT ret;
if (info32) { @@ -3858,19 +3859,58 @@ NTSTATUS WINAPI wow64_NtUserThunkedMenuItemInfo( UINT *args ) info.fState = info32->fState; info.wID = info32->wID; info.hSubMenu = UlongToHandle( info32->hSubMenu ); - info.hbmpChecked = UlongToHandle( info32->hbmpUnchecked ); + info.hbmpChecked = UlongToHandle( info32->hbmpChecked ); + info.hbmpUnchecked = UlongToHandle( info32->hbmpUnchecked ); info.dwItemData = info32->dwItemData; info.dwTypeData = UlongToPtr( info32->dwTypeData ); info.cch = info32->cch; info.hbmpItem = UlongToHandle( info32->hbmpItem ); break; + case NtUserCheckMenuRadioItem: + info.cch = info32->cch; + break; + case NtUserGetMenuItemInfoA: + case NtUserGetMenuItemInfoW: + info.dwTypeData = UlongToPtr( info32->dwTypeData ); + info.cch = info32->cch; + break; } info_ptr = &info; } else info_ptr = NULL;
- return NtUserThunkedMenuItemInfo( handle, pos, flags, method, info_ptr, - unicode_str_32to64( &str, str32 )); + ret = NtUserThunkedMenuItemInfo( handle, pos, flags, method, info_ptr, + unicode_str_32to64( &str, str32 )); + + if (info_ptr) + { + switch (method) + { + case NtUserGetMenuItemInfoA: + case NtUserGetMenuItemInfoW: + if (info.fMask & (MIIM_TYPE | MIIM_STRING | MIIM_FTYPE)) + info32->fType = info.fType; + if (info.fMask & (MIIM_TYPE | MIIM_BITMAP)) + info32->hbmpItem = HandleToUlong( info.hbmpItem ); + if (info.fMask & (MIIM_TYPE | MIIM_STRING)) + { + info32->dwTypeData = (UINT_PTR)info.dwTypeData; + info32->cch = info.cch; + } + if (info.fMask & MIIM_STATE) info32->fState = info.fState; + if (info.fMask & MIIM_ID) info32->wID = info.wID; + info32->hSubMenu = HandleToUlong( info.hSubMenu ); + if (info.fMask & MIIM_CHECKMARKS) + { + info32->hbmpChecked = HandleToUlong( info.hbmpChecked ); + info32->hbmpUnchecked = HandleToUlong( info.hbmpUnchecked ); + } + if (info.fMask & MIIM_DATA) info32->dwItemData = info.dwItemData; + break; + } + } + + return ret; }
NTSTATUS WINAPI wow64_NtUserToUnicodeEx( UINT *args )
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 13d1d31a4a5..c8b799881b2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -3936,6 +3936,7 @@ NTSTATUS WINAPI wow64_NtUserTrackMouseEvent( UINT *args ) DWORD dwHoverTime; } *info32 = get_ptr( &args ); TRACKMOUSEEVENT info; + BOOL ret;
if (info32->cbSize != sizeof(*info32)) { @@ -3947,7 +3948,11 @@ NTSTATUS WINAPI wow64_NtUserTrackMouseEvent( UINT *args ) info.dwFlags = info32->dwFlags; info.hwndTrack = UlongToHandle( info32->hwndTrack ); info.dwHoverTime = info32->dwHoverTime; - return NtUserTrackMouseEvent( &info ); + ret = NtUserTrackMouseEvent( &info ); + info32->dwFlags = info.dwFlags; + info32->hwndTrack = HandleToUlong( info.hwndTrack ); + info32->dwHoverTime = info.dwHoverTime; + return ret; }
NTSTATUS WINAPI wow64_NtUserTrackPopupMenuEx( UINT *args )
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index c8b799881b2..54079700340 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -824,22 +824,19 @@ static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) struct draw_text_params *params = arg; struct draw_text_params32 *params32; RECT *rect_ptr = params->ret_rect; - ULONG ret_len, len; + ULONG ret_len; void *ret_ptr; NTSTATUS ret;
- len = (size - FIELD_OFFSET( struct draw_text_params, str )) / sizeof(WCHAR); - if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct draw_text_params32, str[len] )))) - return 0; - - params32->hdc = HandleToUlong( params->hdc ); - params32->count = params->count; - params32->rect = params->rect; - params32->ret_rect = 0; + params32 = (struct draw_text_params32 *)(params + 1) - 1; params32->flags = params->flags; - if (len) memcpy( params32->str, params->str, len * sizeof(WCHAR) ); + params32->ret_rect = 0; + params32->rect = params->rect; + params32->count = params->count; + params32->hdc = HandleToUlong( params->hdc );
- ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params, size, &ret_ptr, &ret_len ); + ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params32, + size - sizeof(*params) + sizeof(*params32), &ret_ptr, &ret_len ); if (ret_len == sizeof(RECT) && rect_ptr) { *rect_ptr = *(const RECT *)ret_ptr;
From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64win/user.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 54079700340..38024f50548 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -332,7 +332,7 @@ static MSG *msg_32to64( MSG *msg, const MSG32 *msg32 ) { if (!msg32) return NULL;
- msg->hwnd = UlongToHandle( msg32->hwnd ); + msg->hwnd = LongToHandle( msg32->hwnd ); msg->message = msg32->message; msg->wParam = msg32->wParam; msg->lParam = msg32->lParam; @@ -1216,7 +1216,7 @@ NTSTATUS WINAPI wow64_NtUserCallHwndParam( UINT *args ) } *params32 = UlongToPtr( param ); struct map_window_points_params params;
- params.hwnd_to = UlongToHandle( params32->hwnd_to ); + params.hwnd_to = LongToHandle( params32->hwnd_to ); params.points = UlongToPtr( params32->points ); params.count = params32->count; return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, code ); @@ -1701,7 +1701,7 @@ NTSTATUS WINAPI wow64_NtUserFlashWindowEx( UINT *args ) }
info.cbSize = sizeof(info); - info.hwnd = UlongToHandle( info32->hwnd ); + info.hwnd = LongToHandle( info32->hwnd ); info.dwFlags = info32->dwFlags; info.uCount = info32->uCount; info.dwTimeout = info32->dwTimeout; @@ -2399,13 +2399,13 @@ NTSTATUS WINAPI wow64_NtUserRegisterClassExWOW( UINT *args ) wc.lpfnWndProc = UlongToPtr( wc32->lpfnWndProc ); wc.cbClsExtra = wc32->cbClsExtra; wc.cbWndExtra = wc32->cbWndExtra; - wc.hInstance = UlongToHandle( wc32->hInstance ); - wc.hIcon = UlongToHandle( wc32->hIcon ); - wc.hCursor = UlongToHandle( wc32->hCursor ); + wc.hInstance = UlongToPtr( wc32->hInstance ); + wc.hIcon = LongToHandle( wc32->hIcon ); + wc.hCursor = LongToHandle( wc32->hCursor ); wc.hbrBackground = UlongToHandle( wc32->hbrBackground ); wc.lpszMenuName = UlongToPtr( wc32->lpszMenuName ); wc.lpszClassName = UlongToPtr( wc32->lpszClassName ); - wc.hIconSm = UlongToHandle( wc32->hIconSm ); + wc.hIconSm = LongToHandle( wc32->hIconSm );
return NtUserRegisterClassExWOW( &wc, unicode_str_32to64( &name, name32 ), @@ -3022,7 +3022,7 @@ NTSTATUS WINAPI wow64_NtUserMsgWaitForMultipleObjectsEx( UINT *args ) set_last_error32( ERROR_INVALID_PARAMETER ); return WAIT_FAILED; } - for (i = 0; i < count; i++) handles[i] = UlongToHandle( handles32[i] ); + for (i = 0; i < count; i++) handles[i] = LongToHandle( handles32[i] );
return NtUserMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags ); } @@ -3855,7 +3855,7 @@ NTSTATUS WINAPI wow64_NtUserThunkedMenuItemInfo( UINT *args ) info.fType = info32->fType; info.fState = info32->fState; info.wID = info32->wID; - info.hSubMenu = UlongToHandle( info32->hSubMenu ); + info.hSubMenu = LongToHandle( info32->hSubMenu ); info.hbmpChecked = UlongToHandle( info32->hbmpChecked ); info.hbmpUnchecked = UlongToHandle( info32->hbmpUnchecked ); info.dwItemData = info32->dwItemData; @@ -3943,7 +3943,7 @@ NTSTATUS WINAPI wow64_NtUserTrackMouseEvent( UINT *args )
info.cbSize = sizeof(info); info.dwFlags = info32->dwFlags; - info.hwndTrack = UlongToHandle( info32->hwndTrack ); + info.hwndTrack = LongToHandle( info32->hwndTrack ); info.dwHoverTime = info32->dwHoverTime; ret = NtUserTrackMouseEvent( &info ); info32->dwFlags = info.dwFlags;
This merge request was approved by Huw Davies.