Authors: Alexandre Julliard <julliard@codeweavers.com> (for Corel), Albert den Haan <albertd@corel.com>
Added syslevel locking for GDI operations.
Propagate the changes through the graphics code.

diff --git a/dlls/gdi/printdrv.c b/dlls/gdi/printdrv.c
index 8090861..8d0e331 100644
--- a/dlls/gdi/printdrv.c
+++ b/dlls/gdi/printdrv.c
@@ -69,6 +69,7 @@
  */
 INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc)
 {
+    INT ret;
     DC *dc = DC_GetDCPtr( hdc );
 
     TRACE("DocName = '%s' Output = '%s' Datatype = '%s'\n",
@@ -77,10 +78,12 @@
     if(!dc) return SP_ERROR;
 
     if(dc->funcs->pStartDoc)
-        return dc->funcs->pStartDoc( dc, doc );
+        ret = dc->funcs->pStartDoc( dc, doc );
     else
-        return Escape(hdc, STARTDOC, strlen(doc->lpszDocName),
+        ret = Escape(hdc, STARTDOC, strlen(doc->lpszDocName),
 		      doc->lpszDocName, (LPVOID)doc);
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /*************************************************************************
@@ -128,13 +131,16 @@
  */
 INT WINAPI EndDoc(HDC hdc)
 {
+    INT ret;
     DC *dc = DC_GetDCPtr( hdc );
     if(!dc) return SP_ERROR;
 
     if(dc->funcs->pEndDoc)
-        return dc->funcs->pEndDoc( dc );
+        ret = dc->funcs->pEndDoc( dc );
     else
-        return Escape(hdc, ENDDOC, 0, 0, 0);
+        ret = Escape(hdc, ENDDOC, 0, 0, 0);
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /******************************************************************
@@ -152,14 +158,16 @@
  */
 INT WINAPI StartPage(HDC hdc)
 {
+    INT ret = 1;
     DC *dc = DC_GetDCPtr( hdc );
     if(!dc) return SP_ERROR;
 
     if(dc->funcs->pStartPage)
-        return dc->funcs->pStartPage( dc );
-
-    FIXME("stub\n");
-    return 1;
+        ret = dc->funcs->pStartPage( dc );
+    else
+        FIXME("stub\n");
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /******************************************************************
@@ -177,13 +185,16 @@
  */
 INT WINAPI EndPage(HDC hdc)
 {
+    INT ret;
     DC *dc = DC_GetDCPtr( hdc );
     if(!dc) return SP_ERROR;
 
     if(dc->funcs->pEndPage)
-        return dc->funcs->pEndPage( dc );
+        ret = dc->funcs->pEndPage( dc );
     else
-        return Escape(hdc, NEWFRAME, 0, 0, 0);
+        ret = Escape(hdc, NEWFRAME, 0, 0, 0);
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /******************************************************************************
@@ -199,13 +210,16 @@
  */
 INT WINAPI AbortDoc(HDC hdc)
 {
+    INT ret;
     DC *dc = DC_GetDCPtr( hdc );
     if(!dc) return SP_ERROR;
 
     if(dc->funcs->pAbortDoc)
-        return dc->funcs->pAbortDoc( dc );
+        ret = dc->funcs->pAbortDoc( dc );
     else
-        return Escape(hdc, ABORTDOC, 0, 0, 0);
+        ret = Escape(hdc, ABORTDOC, 0, 0, 0);
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /**********************************************************************
@@ -219,6 +233,7 @@
  */
 BOOL16 WINAPI QueryAbort16(HDC16 hdc, INT16 reserved)
 {
+    BOOL ret = TRUE;
     DC *dc = DC_GetDCPtr( hdc );
 
     if(!dc) {
@@ -226,9 +241,9 @@
 	return FALSE;
     }
 
-    if(!dc->w.pAbortProc)
-        return TRUE;
-    return dc->w.pAbortProc(hdc, 0);
+    if (dc->w.pAbortProc) ret = dc->w.pAbortProc(hdc, 0);
+    GDI_ReleaseObj( hdc );
+    return ret;
 }
 
 /* ### start build ### */
@@ -256,6 +271,7 @@
 
     if(dc->w.pAbortProc) THUNK_Free((FARPROC)dc->w.pAbortProc);
     dc->w.pAbortProc = abrtprc;
+    GDI_ReleaseObj( hdc );
     return TRUE;
 }