gdi32: Make SetDCHook 64-bit safe

Dmitry Timoshkov dmitry at codeweavers.com
Tue May 29 22:50:35 CDT 2007


Hello,

since SetDCHook is a Wine extension we can safely change it to serve our needs.

Changelog:
    gdi32: Make SetDCHook 64-bit safe.

---
 dlls/gdi32/dc.c          |   15 +++++++--------
 dlls/gdi32/gdi_private.h |    2 +-
 dlls/winex11.drv/dce.c   |   12 ++++++------
 include/wine/wingdi16.h  |    4 ++--
 4 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index bb1080c..30acc03 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -166,9 +166,9 @@ DC *DC_GetDCUpdate( HDC hdc )
         dc->flags &= ~DC_DIRTY;
         if (proc)
         {
-            DWORD data = dc->dwHookData;
+            DWORD_PTR data = dc->dwHookData;
             GDI_ReleaseObj( hdc );
-            proc( HDC_16(hdc), DCHC_INVALIDVISRGN, data, 0 );
+            proc( hdc, DCHC_INVALIDVISRGN, data, 0 );
             if (!(dc = DC_GetDCPtr( hdc ))) break;
             /* otherwise restart the loop in case it became dirty again in the meantime */
         }
@@ -791,9 +791,9 @@ BOOL WINAPI DeleteDC( HDC hdc )
     if (dc->hookThunk)
     {
         DCHOOKPROC proc = dc->hookThunk;
-        DWORD data = dc->dwHookData;
+        DWORD_PTR data = dc->dwHookData;
         GDI_ReleaseObj( hdc );
-        if (!proc( HDC_16(hdc), DCHC_DELETEDC, data, 0 )) return FALSE;
+        if (!proc( hdc, DCHC_DELETEDC, data, 0 )) return FALSE;
         if (!(dc = DC_GetDCPtr( hdc ))) return TRUE;  /* deleted by the hook */
     }
 
@@ -1328,7 +1328,7 @@ BOOL WINAPI CombineTransform( LPXFORM xformResult, const XFORM *xform1,
  *
  * Note: this doesn't exist in Win32, we add it here because user32 needs it.
  */
-BOOL WINAPI SetDCHook( HDC hdc, DCHOOKPROC hookProc, DWORD dwHookData )
+BOOL WINAPI SetDCHook( HDC hdc, DCHOOKPROC hookProc, DWORD_PTR dwHookData )
 {
     DC *dc = GDI_GetObjPtr( hdc, DC_MAGIC );
 
@@ -1345,19 +1345,18 @@ BOOL WINAPI SetDCHook( HDC hdc, DCHOOKPROC hookProc, DWORD dwHookData )
 
 
 /* relay function to call the 16-bit DC hook proc */
-static BOOL16 WINAPI call_dc_hook16( HDC16 hdc16, WORD code, DWORD data, LPARAM lParam )
+static BOOL WINAPI call_dc_hook16( HDC hdc, WORD code, DWORD_PTR data, LPARAM lParam )
 {
     WORD args[6];
     DWORD ret;
     FARPROC16 proc = NULL;
-    HDC hdc = HDC_32( hdc16 );
     DC *dc = DC_GetDCPtr( hdc );
 
     if (!dc) return FALSE;
     proc = dc->hookProc;
     GDI_ReleaseObj( hdc );
     if (!proc) return FALSE;
-    args[5] = hdc16;
+    args[5] = HDC_16(hdc);
     args[4] = code;
     args[3] = HIWORD(data);
     args[2] = LOWORD(data);
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index e43ac30..c6810dd 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -271,7 +271,7 @@ typedef struct tagDC
     PHYSDEV      physDev;         /* Physical device (driver-specific) */
     INT          saveLevel;
     HDC          saved_dc;
-    DWORD        dwHookData;
+    DWORD_PTR    dwHookData;
     FARPROC16    hookProc;         /* the original SEGPTR ... */
     DCHOOKPROC   hookThunk;        /* ... and the thunk to call it */
 
diff --git a/dlls/winex11.drv/dce.c b/dlls/winex11.drv/dce.c
index a0454cb..3b80308 100644
--- a/dlls/winex11.drv/dce.c
+++ b/dlls/winex11.drv/dce.c
@@ -51,7 +51,7 @@ struct dce
 
 static struct list dce_list = LIST_INIT(dce_list);
 
-static BOOL16 CALLBACK dc_hook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam );
+static BOOL CALLBACK dc_hook( HDC hDC, WORD code, DWORD_PTR data, LPARAM lParam );
 
 static CRITICAL_SECTION dce_section;
 static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -224,7 +224,7 @@ static struct dce *alloc_cache_dce(void)
     SaveDC( dce->hdc );
 
     /* store DCE handle in DC hook data field */
-    SetDCHook( dce->hdc, dc_hook, (DWORD)dce );
+    SetDCHook( dce->hdc, dc_hook, (DWORD_PTR)dce );
 
     dce->hwnd      = 0;
     dce->clip_rgn  = 0;
@@ -290,7 +290,7 @@ void alloc_window_dce( struct x11drv_win_data *data )
 
     /* store DCE handle in DC hook data field */
 
-    SetDCHook( dce->hdc, dc_hook, (DWORD)dce );
+    SetDCHook( dce->hdc, dc_hook, (DWORD_PTR)dce );
 
     dce->hwnd      = data->hwnd;
     dce->clip_rgn  = 0;
@@ -593,15 +593,15 @@ INT X11DRV_ReleaseDC( HWND hwnd, HDC hdc, BOOL end_paint )
  *
  * See "Undoc. Windows" for hints (DC, SetDCHook, SetHookFlags)..
  */
-static BOOL16 CALLBACK dc_hook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
+static BOOL CALLBACK dc_hook( HDC hDC, WORD code, DWORD_PTR data, LPARAM lParam )
 {
     BOOL retv = TRUE;
     struct dce *dce = (struct dce *)data;
 
-    TRACE("hDC = %04x, %i\n", hDC, code);
+    TRACE("hDC = %p, %u\n", hDC, code);
 
     if (!dce) return 0;
-    assert( HDC_16(dce->hdc) == hDC );
+    assert( dce->hdc == hDC );
 
     switch( code )
     {
diff --git a/include/wine/wingdi16.h b/include/wine/wingdi16.h
index 85b6798..c8b8ee4 100644
--- a/include/wine/wingdi16.h
+++ b/include/wine/wingdi16.h
@@ -269,7 +269,7 @@ typedef struct
     FONTSIGNATURE       ntmFontSig;
 } NEWTEXTMETRICEX16,*LPNEWTEXTMETRICEX16;
 
-typedef BOOL16 (CALLBACK *DCHOOKPROC)(HDC16,WORD,DWORD,LPARAM);
+typedef BOOL  (CALLBACK *DCHOOKPROC)(HDC,WORD,DWORD_PTR,LPARAM);
 typedef INT16 (CALLBACK *FONTENUMPROC16)(SEGPTR,SEGPTR,UINT16,LPARAM);
 typedef VOID  (CALLBACK *LINEDDAPROC16)(INT16,INT16,LPARAM);
 typedef INT16 (CALLBACK *GOBJENUMPROC16)(SEGPTR,LPARAM);
@@ -577,7 +577,7 @@ COLORREF    WINAPI SetBkColor16(HDC16,COLORREF);
 INT16       WINAPI SetBkMode16(HDC16,INT16);
 UINT16      WINAPI SetBoundsRect16(HDC16,const RECT16*,UINT16);
 DWORD       WINAPI SetBrushOrg16(HDC16,INT16,INT16);
-BOOL        WINAPI SetDCHook(HDC,DCHOOKPROC,DWORD);
+BOOL        WINAPI SetDCHook(HDC,DCHOOKPROC,DWORD_PTR);
 BOOL16      WINAPI SetDCHook16(HDC16,FARPROC16,DWORD);
 DWORD       WINAPI SetDCOrg16(HDC16,INT16,INT16);
 VOID        WINAPI SetDCState16(HDC16,HDC16);
-- 
1.5.1.6






More information about the wine-patches mailing list