From f05e9b1e26653c3c3a4df5f7e077ac9de76761be Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 13 Aug 2021 14:59:39 +0200 Subject: [PATCH] krnl386.exe: Convert 16-bit GDI handles to full 32-bit handles. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51570 Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/krnl386.exe16/wowthunk.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/dlls/krnl386.exe16/wowthunk.c b/dlls/krnl386.exe16/wowthunk.c index 5bd9d7aecd4..0e9e9b6744c 100644 --- a/dlls/krnl386.exe16/wowthunk.c +++ b/dlls/krnl386.exe16/wowthunk.c @@ -28,6 +28,7 @@ #include "wownt32.h" #include "excpt.h" #include "winternl.h" +#include "ntgdi.h" #include "kernel16_private.h" #include "wine/exception.h" #include "wine/debug.h" @@ -309,6 +310,24 @@ VOID WINAPI K32WOWDirectedYield16( WORD htask16 ) DirectedYield16( (HTASK16)htask16 ); } +static HANDLE gdi_handle32( WORD handle ) +{ + static GDI_SHARED_MEMORY *gdi_shared; + + if (!gdi_shared) + { + if (NtCurrentTeb()->GdiBatchCount) + { + TEB64 *teb64 = (TEB64 *)(UINT_PTR)NtCurrentTeb()->GdiBatchCount; + PEB64 *peb64 = (PEB64 *)(UINT_PTR)teb64->Peb; + gdi_shared = (GDI_SHARED_MEMORY *)(UINT_PTR)peb64->GdiSharedHandleTable; + } + else gdi_shared = (GDI_SHARED_MEMORY *)NtCurrentTeb()->Peb->GdiSharedHandleTable; + if (!gdi_shared) return ULongToHandle( handle ); + } + + return ULongToHandle( (gdi_shared->Handles[handle].Unique << 16) | handle ); +} /*********************************************************************** * K32WOWHandle32 (KERNEL32.57) @@ -321,6 +340,9 @@ HANDLE WINAPI K32WOWHandle32( WORD handle, WOW_HANDLE_TYPE type ) case WOW_TYPE_HMENU: case WOW_TYPE_HDWP: case WOW_TYPE_HDROP: + case WOW_TYPE_HACCEL: + return (HANDLE)(ULONG_PTR)handle; + case WOW_TYPE_HDC: case WOW_TYPE_HFONT: case WOW_TYPE_HRGN: @@ -328,12 +350,8 @@ HANDLE WINAPI K32WOWHandle32( WORD handle, WOW_HANDLE_TYPE type ) case WOW_TYPE_HBRUSH: case WOW_TYPE_HPALETTE: case WOW_TYPE_HPEN: - case WOW_TYPE_HACCEL: - return (HANDLE)(ULONG_PTR)handle; - case WOW_TYPE_HMETAFILE: - FIXME( "conversion of metafile handles not supported yet\n" ); - return (HANDLE)(ULONG_PTR)handle; + return gdi_handle32( handle ); case WOW_TYPE_HTASK: return ((TDB *)GlobalLock16(handle))->teb->ClientId.UniqueThread;