[PATCH] user.exe16: Releasing DC does not disable it.

Jeff Smith whydoubt at gmail.com
Sun Jan 12 14:54:10 CST 2020

ReleaseDC in user32 marks cache DCs as disabled.  For user.exe (the
16-bit equivalent), this causes DCs to become inaccessible after
release.  On Windows, they are still accessible after release.

Work around this in user.exe by re-enabling the DC immediately after
calling the user32 ReleaseDC.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44408
Signed-off-by: Jeff Smith <whydoubt at gmail.com>
Tested with the program referenced in the bug report.  I also wrote
and ran some tests on WinXP to compare how user32.dll and user.exe
handle ReleaseDC.

 dlls/user.exe16/window.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/dlls/user.exe16/window.c b/dlls/user.exe16/window.c
index 10f1389f0a..bf86719325 100644
--- a/dlls/user.exe16/window.c
+++ b/dlls/user.exe16/window.c
@@ -23,6 +23,7 @@
 #include "user_private.h"
 #include "wine/list.h"
 #include "wine/server.h"
+#include "wine/gdi_driver.h"
 #include "wine/debug.h"
@@ -675,7 +676,9 @@ HDC16 WINAPI GetWindowDC16( HWND16 hwnd )
 INT16 WINAPI ReleaseDC16( HWND16 hwnd, HDC16 hdc )
-    return (INT16)ReleaseDC( WIN_Handle32(hwnd), HDC_32(hdc) );
+    INT16 ret = (INT16)ReleaseDC( WIN_Handle32(hwnd), HDC_32(hdc) );
+    SetHookFlags( HDC_32(hdc), DCHF_ENABLEDC );
+    return ret;

More information about the wine-devel mailing list