Jacek Caban : krnl386.exe: Convert 16-bit GDI handles to full 32-bit handles.

Alexandre Julliard julliard at winehq.org
Fri Aug 13 14:44:14 CDT 2021


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

Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list