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