Module: wine Branch: master Commit: f05e9b1e26653c3c3a4df5f7e077ac9de76761be URL: https://source.winehq.org/git/wine.git/?a=commit;h=f05e9b1e26653c3c3a4df5f7e...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Aug 13 14:59:39 2021 +0200
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 jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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;