Implement handling of 32 bit AbortProc.

diff --git a/misc/printdrv.c b/misc/printdrv.c
index 2aac7a9..1a1471c 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -71,6 +71,8 @@
  */
 INT WINAPI StartDocA(HDC hdc ,const DOCINFOA* doc)
 {
+    TRACE("DocName = '%s' Output = '%s' Datatype = '%s'\n",
+	  doc->lpszDocName, doc->lpszOutput, doc->lpszDatatype);
     return  Escape(hdc,
 		   STARTDOC,
 		   strlen(doc->lpszDocName),
@@ -154,10 +156,27 @@
 BOOL16 WINAPI QueryAbort16(HDC16 hdc, INT16 reserved)
 {
     DC *dc = DC_GetDCPtr( hdc );
+    BOOL16 ret;
 
-    if ((!dc) || (!dc->w.lpfnPrint))
-	return TRUE;
-    return Callbacks->CallDrvAbortProc(dc->w.lpfnPrint, hdc, 0);
+    if(!dc) {
+        ERR("Invalid hdc %04x\n", hdc);
+	return FALSE;
+    }
+
+    if(!dc->w.lpfnPrint && !dc->w.spfnPrint)
+        return TRUE;
+
+    if(dc->w.lpfnPrint && dc->w.spfnPrint)
+        FIXME("16 and 32 bit AbortProcs set?\n");
+
+    if(dc->w.spfnPrint) {
+        TRACE("Calling 16bit AbortProc\n");
+	ret = Callbacks->CallDrvAbortProc(dc->w.spfnPrint, hdc, 0);
+    } else {
+        TRACE("Calling 32bit AbortProc\n");
+	ret = dc->w.lpfnPrint(hdc,0);
+    }
+    return ret;
 }
 
 /**********************************************************************
@@ -167,7 +186,7 @@
 INT16 WINAPI SetAbortProc16(HDC16 hdc, SEGPTR abrtprc)
 {
     return Escape16(hdc, SETABORTPROC, 0, abrtprc, (SEGPTR)0);
-} 
+}
 
 /**********************************************************************
  *           SetAbortProc32   (GDI32.301)
@@ -175,8 +194,10 @@
  */
 INT WINAPI SetAbortProc(HDC hdc, ABORTPROC abrtprc)
 {
-    FIXME("stub\n");
-    return 1;
+    DC *dc = DC_GetDCPtr( hdc );
+
+    dc->w.lpfnPrint = abrtprc;
+    return TRUE;
 }