[PATCH 1/2] [Gdi.exe]: no longer use 16bit abort procs inside the DC structure

Eric Pouech eric.pouech at orange.fr
Sun Nov 15 15:09:59 CST 2009




A+
---

 0 files changed, 0 insertions(+), 0 deletions(-)


diff --git a/dlls/gdi32/gdi16.c b/dlls/gdi32/gdi16.c
index ee829e1..7bc715d 100644
--- a/dlls/gdi32/gdi16.c
+++ b/dlls/gdi32/gdi16.c
@@ -34,6 +34,127 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdi);
 #define HGDIOBJ_32(handle16)    ((HGDIOBJ)(ULONG_PTR)(handle16))
 #define HGDIOBJ_16(handle32)    ((HGDIOBJ16)(ULONG_PTR)(handle32))
 
+/*
+ * ############################################################################
+ */
+
+#include <pshpack1.h>
+#define GDI_MAX_THUNKS      32
+
+static struct gdi_thunk
+{
+    BYTE                        popl_eax;       /* popl  %eax (return address) */
+    BYTE                        pushl_pfn16;    /* pushl pfn16 */
+    DWORD                       pfn16;          /* pfn16 */
+    BYTE                        pushl_eax;      /* pushl %eax */
+    BYTE                        jmp;            /* ljmp GDI_Callback1632 */
+    DWORD                       callback;
+    HDC16                       hdc;
+} *GDI_Thunks;
+
+#include <poppack.h>
+
+/**********************************************************************
+ *           GDI_Callback3216
+ */
+static BOOL CALLBACK GDI_Callback3216( DWORD pfn16, HDC hdc, INT code )
+{
+    if (pfn16)
+    {
+        WORD args[2];
+        DWORD ret;
+
+        args[1] = HDC_16(hdc);
+        args[0] = code;
+        WOWCallback16Ex( pfn16, WCB16_PASCAL, sizeof(args), args, &ret );
+        return LOWORD(ret);
+    }
+    return TRUE;
+}
+
+
+/******************************************************************
+ *		GDI_AddThunk
+ *
+ */
+struct gdi_thunk*       GDI_AddThunk(HDC16 dc16, ABORTPROC16 pfn16)
+{
+    struct gdi_thunk* thunk;
+
+    if (!GDI_Thunks)
+    {
+        GDI_Thunks = VirtualAlloc(NULL, GDI_MAX_THUNKS * sizeof(*GDI_Thunks),
+                                        MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+        if (!GDI_Thunks)
+        {
+            return NULL;
+        }
+        for (thunk = GDI_Thunks; thunk < &GDI_Thunks[GDI_MAX_THUNKS]; thunk++)
+        {
+            thunk->popl_eax     = 0x58;   /* popl  %eax */
+            thunk->pushl_pfn16  = 0x68;   /* pushl pfn16 */
+            thunk->pfn16        = 0;
+            thunk->pushl_eax    = 0x50;   /* pushl %eax */
+            thunk->jmp          = 0xe9;   /* jmp GDI_Callback3216 */
+            thunk->callback     = (char *)GDI_Callback3216 - (char *)(&thunk->callback + 1);
+        }
+    }
+    for (thunk = GDI_Thunks; thunk < &GDI_Thunks[GDI_MAX_THUNKS]; thunk++)
+    {
+        if (thunk->pfn16 == 0)
+        {
+            thunk->pfn16 = (DWORD)pfn16;
+            thunk->hdc   = dc16;
+            return thunk;
+        }
+    }
+    FIXME("Out of mmdrv-thunks. Bump GDI_MAX_THUNKS\n");
+    return NULL;
+}
+
+/******************************************************************
+ *		GDI_DeleteThunk
+ */
+static void    GDI_DeleteThunk(struct gdi_thunk* thunk)
+{
+    thunk->pfn16 = 0;
+}
+
+/******************************************************************
+ *		GDI_FindThunk
+ */
+static struct gdi_thunk*        GDI_FindThunk(HDC16 hdc)
+{
+    struct gdi_thunk* thunk;
+
+    for (thunk = GDI_Thunks; thunk < &GDI_Thunks[GDI_MAX_THUNKS]; thunk++)
+    {
+        if (thunk->hdc == hdc)  return thunk;
+    }
+    return NULL;
+}
+
+/**********************************************************************
+ *           SetAbortProc   (GDI.381)
+ */
+INT16 WINAPI SetAbortProc16(HDC16 hdc16, ABORTPROC16 abrtprc)
+{
+    struct gdi_thunk*   thunk;
+
+    thunk = GDI_AddThunk(hdc16, abrtprc);
+    if (!thunk) return FALSE;
+    if (!SetAbortProc(HDC_32( hdc16 ), (ABORTPROC)thunk))
+    {
+        GDI_DeleteThunk(thunk);
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/*
+ * ############################################################################
+ */
+
 struct callback16_info
 {
     FARPROC16 proc;
@@ -1167,7 +1288,14 @@ HBRUSH16 WINAPI CreateSolidBrush16( COLORREF color )
  */
 BOOL16 WINAPI DeleteDC16( HDC16 hdc )
 {
-    return DeleteDC( HDC_32(hdc) );
+    if (DeleteDC( HDC_32(hdc) ))
+    {
+        struct gdi_thunk* thunk;
+        if ((thunk = GDI_FindThunk(hdc)))
+            GDI_DeleteThunk(thunk);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index f0248c9..ad57b1b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -302,7 +302,6 @@ typedef struct tagDC
     INT           MapMode;
     INT           GraphicsMode;      /* Graphics mode */
     ABORTPROC     pAbortProc;        /* AbortProc for Printing */
-    ABORTPROC16   pAbortProc16;
     INT           CursPosX;          /* Current position */
     INT           CursPosY;
     INT           ArcDirection;
diff --git a/dlls/gdi32/printdrv16.c b/dlls/gdi32/printdrv16.c
index e7954ee..d71a752 100644
--- a/dlls/gdi32/printdrv16.c
+++ b/dlls/gdi32/printdrv16.c
@@ -82,47 +82,6 @@ BOOL16 WINAPI QueryAbort16(HDC16 hdc16, INT16 reserved)
 }
 
 
-/**********************************************************************
- *           call_abort_proc16
- */
-static BOOL CALLBACK call_abort_proc16( HDC hdc, INT code )
-{
-    ABORTPROC16 proc16;
-    DC *dc = get_dc_ptr( hdc );
-
-    if (!dc) return FALSE;
-    proc16 = dc->pAbortProc16;
-    release_dc_ptr( dc );
-    if (proc16)
-    {
-        WORD args[2];
-        DWORD ret;
-
-        args[1] = HDC_16(hdc);
-        args[0] = code;
-        WOWCallback16Ex( (DWORD)proc16, WCB16_PASCAL, sizeof(args), args, &ret );
-        return LOWORD(ret);
-    }
-    return TRUE;
-}
-
-
-/**********************************************************************
- *           SetAbortProc   (GDI.381)
- */
-INT16 WINAPI SetAbortProc16(HDC16 hdc16, ABORTPROC16 abrtprc)
-{
-    HDC hdc = HDC_32( hdc16 );
-    DC *dc = get_dc_ptr( hdc );
-
-    if (!dc) return FALSE;
-    dc->pAbortProc16 = abrtprc;
-    dc->pAbortProc   = call_abort_proc16;
-    release_dc_ptr( dc );
-    return TRUE;
-}
-
-
 /****************** misc. printer related functions */
 
 /*






More information about the wine-patches mailing list