diff --git a/graphics/psdrv/escape.c b/graphics/psdrv/escape.c
index 98a57ab..37dbc28 100644
--- a/graphics/psdrv/escape.c
+++ b/graphics/psdrv/escape.c
@@ -7,12 +7,13 @@
 #include "psdrv.h"
 #include "debugtools.h"
 #include "winspool.h"
+#include "heap.h"
 
 DEFAULT_DEBUG_CHANNEL(psdrv)
 
 
 INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput, 
-                              SEGPTR lpInData, SEGPTR lpOutData )
+		  SEGPTR lpInData, SEGPTR lpOutData )
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
 
@@ -38,13 +39,11 @@
 
         if(!physDev->job.hJob) {
 	    FIXME("hJob == 0. Now what?\n");
-	    return 0;
+	    return SP_ERROR;
 	}
-
-	if(!PSDRV_WriteEndPage( dc ))
-	    return 0;
-
-	physDev->job.NeedPageHeader = TRUE;
+	
+	if(!PSDRV_EndPage( dc ))
+	    return SP_ERROR;
 	return 1;
           
     case QUERYESCSUPPORT:
@@ -86,46 +85,35 @@
 	return 1;
 
     case STARTDOC:
+      {
+	DOCINFOA doc;
+	char *name = NULL;
+	INT16 ret;
+
         TRACE("STARTDOC\n");
-        if(physDev->job.hJob) {
-	    FIXME("hJob != 0. Now what?\n");
-	    return 0;
-	}
 
-	physDev->job.hJob = OpenJob16(physDev->job.output,
-				    PTR_SEG_TO_LIN(lpInData), dc->hSelf);
-	if(!physDev->job.hJob) {
-	    WARN("OpenJob failed\n");
-	    return 0;
+	/* lpInData may not be 0 terminated so we must copy it */
+	if(lpInData) {
+	    name = HeapAlloc( GetProcessHeap(), 0, cbInput+1 );
+	    memcpy(name, PTR_SEG_TO_LIN(lpInData), cbInput);
+	    name[cbInput] = '\0';
 	}
-	physDev->job.banding = FALSE;
-	physDev->job.NeedPageHeader = FALSE;
-	physDev->job.PageNo = 1;
-	if(!PSDRV_WriteHeader( dc, PTR_SEG_TO_LIN(lpInData), cbInput ))
-	    return 0;
+	doc.cbSize = sizeof(doc);
+	doc.lpszDocName = name;
+	doc.lpszOutput = doc.lpszDatatype = NULL;
+	doc.fwType = 0;
 
-	if(!PSDRV_WriteNewPage( dc ))
-	    return 0;
-	return 1;
+	ret = PSDRV_StartDoc(dc, &doc);
+	if(name) HeapFree( GetProcessHeap(), 0, name );
+	if(ret <= 0) return -1;
+	ret = PSDRV_StartPage(dc);
+	if(ret <= 0) return -1;
+	return ret;
+      }
 
     case ENDDOC:
         TRACE("ENDDOC\n");
-        if(!physDev->job.hJob) {
-	    FIXME("hJob == 0. Now what?\n");
-	    return 0;
-	}
-
-	physDev->job.NeedPageHeader = FALSE;
-
-	if(!PSDRV_WriteFooter( dc ))
-	    return 0;
-
-        if( CloseJob16( physDev->job.hJob ) == SP_ERROR ) {
-	    WARN("CloseJob error\n");
-	    return 0;
-	}
-	physDev->job.hJob = 0;
-	return 1;
+	return PSDRV_EndDoc( dc );
 
     case GETPHYSPAGESIZE:
         {
@@ -257,3 +245,99 @@
 	return 0;
     }
 }
+
+/************************************************************************
+ *           PSDRV_StartPage
+ */
+INT PSDRV_StartPage( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(!physDev->job.OutOfPage) {
+        FIXME("Already started a page?\n");
+	return 1;
+    }
+    physDev->job.PageNo++;
+    if(!PSDRV_WriteNewPage( dc ))
+        return 0;
+    physDev->job.OutOfPage = FALSE;
+    return 1;
+}
+
+	
+/************************************************************************
+ *           PSDRV_EndPage
+ */
+INT PSDRV_EndPage( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(physDev->job.OutOfPage) {
+        FIXME("Already ended a page?\n");
+	return 1;
+    }
+    if(!PSDRV_WriteEndPage( dc ))
+        return 0;
+    physDev->job.OutOfPage = TRUE;
+    return 1;
+}
+
+
+/************************************************************************
+ *           PSDRV_StartDoc
+ */
+INT PSDRV_StartDoc( DC *dc, const DOCINFOA *doc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(physDev->job.hJob) {
+        FIXME("hJob != 0. Now what?\n");
+	return 0;
+    }
+
+    if(doc->lpszOutput) {
+        HeapFree( PSDRV_Heap, 0, physDev->job.output );
+	physDev->job.output = HEAP_strdupA( PSDRV_Heap, 0, doc->lpszOutput );
+    }
+    physDev->job.hJob = OpenJob16(physDev->job.output,  doc->lpszDocName,
+				  dc->hSelf);
+    if(!physDev->job.hJob) {
+        WARN("OpenJob failed\n");
+	return 0;
+    }
+    physDev->job.banding = FALSE;
+    physDev->job.OutOfPage = TRUE;
+    physDev->job.PageNo = 0;
+    if(!PSDRV_WriteHeader( dc, doc->lpszDocName ))
+        return 0;
+
+    return physDev->job.hJob;
+}
+
+
+/************************************************************************
+ *           PSDRV_EndDoc
+ */
+INT PSDRV_EndDoc( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(!physDev->job.hJob) {
+        FIXME("hJob == 0. Now what?\n");
+	return 0;
+    }
+
+    if(!physDev->job.OutOfPage) {
+        WARN("Somebody forgot a EndPage\n");
+	PSDRV_EndPage( dc );
+    }
+    if(!PSDRV_WriteFooter( dc ))
+        return 0;
+
+    if( CloseJob16( physDev->job.hJob ) == SP_ERROR ) {
+        WARN("CloseJob error\n");
+	return 0;
+    }
+    physDev->job.hJob = 0;
+    return 1;
+}
diff --git a/graphics/psdrv/init.c b/graphics/psdrv/init.c
index f750199..4b8c138 100644
--- a/graphics/psdrv/init.c
+++ b/graphics/psdrv/init.c
@@ -36,8 +36,8 @@
     NULL,                            /* pDeleteObject */
     PSDRV_DeviceCapabilities,        /* pDeviceCapabilities */
     PSDRV_Ellipse,                   /* pEllipse */
-    NULL,                            /* pEndDoc */
-    NULL,                            /* pEndPage */
+    PSDRV_EndDoc,                    /* pEndDoc */
+    PSDRV_EndPage,                   /* pEndPage */
     PSDRV_EnumDeviceFonts,           /* pEnumDeviceFonts */
     PSDRV_Escape,                    /* pEscape */
     NULL,                            /* pExcludeClipRect */
@@ -95,8 +95,8 @@
     NULL,                            /* pSetViewportOrg (optional) */
     NULL,                            /* pSetWindowExt (optional) */
     NULL,                            /* pSetWindowOrg (optional) */
-    NULL,                            /* pStartDoc */
-    NULL,                            /* pStartPage */
+    PSDRV_StartDoc,                  /* pStartDoc */
+    PSDRV_StartPage,                 /* pStartPage */
     NULL,                            /* pStretchBlt */
     PSDRV_StretchDIBits              /* pStretchDIBits */
 };
diff --git a/graphics/psdrv/ps.c b/graphics/psdrv/ps.c
index 33b8e9c..b820f43 100644
--- a/graphics/psdrv/ps.c
+++ b/graphics/psdrv/ps.c
@@ -251,11 +251,9 @@
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
 
-    if(physDev->job.NeedPageHeader) {
-	physDev->job.PageNo++;
-        if( !PSDRV_WriteNewPage(dc) )
+    if(physDev->job.OutOfPage) { /* Will get here after NEWFRAME Escape */
+        if( !PSDRV_StartPage(dc) )
 	    return FALSE;
-	physDev->job.NeedPageHeader = FALSE;
     }
     return WriteSpool16( physDev->job.hJob, lpData, cch );
 }
@@ -282,26 +280,20 @@
 
 
 
-INT PSDRV_WriteHeader( DC *dc, char *title, int len )
+INT PSDRV_WriteHeader( DC *dc, LPCSTR title )
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
-    char *buf, *titlebuf, *orient, vectbuf[256];
+    char *buf, *orient, vectbuf[256];
     INPUTSLOT *slot;
     PAGESIZE *page;
     int urx, ury, i, j;
 
-    titlebuf = (char *)HeapAlloc( PSDRV_Heap, 0, len+1 );
-    if(!titlebuf) {
-        WARN("HeapAlloc failed\n");
-        return 0;
-    }
-    memcpy(titlebuf, title, len);
-    titlebuf[len] = '\0';
+    TRACE("'%s'\n", title);
 
-    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psheader) + len + 30);
+    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psheader) +
+			     strlen(title) + 30 );
     if(!buf) {
         WARN("HeapAlloc failed\n");
-	HeapFree( PSDRV_Heap, 0, titlebuf );
         return 0;
     }
 
@@ -319,16 +311,14 @@
 
     /* FIXME should do something better with BBox */
 
-    sprintf(buf, psheader, titlebuf, 0, 0, urx, ury, orient);		
+    sprintf(buf, psheader, title, 0, 0, urx, ury, orient);		
 
     if( WriteSpool16( physDev->job.hJob, buf, strlen(buf) ) != 
 	                                             strlen(buf) ) {
         WARN("WriteSpool error\n");
-	HeapFree( PSDRV_Heap, 0, titlebuf );
 	HeapFree( PSDRV_Heap, 0, buf );
 	return 0;
     }
-    HeapFree( PSDRV_Heap, 0, titlebuf );
     HeapFree( PSDRV_Heap, 0, buf );
 
     WriteSpool16( physDev->job.hJob, psbeginprolog, strlen(psbeginprolog) );
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 5d82103..4fff739 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -258,10 +258,10 @@
 376 pascal16 ResetDC(word ptr) ResetDC16
 377 pascal16 StartDoc(word ptr) StartDoc16
 378 pascal16 EndDoc(word) EndDoc16
-379 pascal16 StartPage(word) stub_GDI_379
+379 pascal16 StartPage(word) StartPage16
 380 pascal16 EndPage(word) EndPage16
 381 pascal16 SetAbortProc(word segptr) SetAbortProc16
-382 pascal16 AbortDoc() stub_GDI_382
+382 pascal16 AbortDoc() AbortDoc16
 400 pascal16 FastWindowFrame(word ptr s_word s_word long) FastWindowFrame16
 401 stub GDIMOVEBITMAP
 403 stub GDIINIT2
diff --git a/include/psdrv.h b/include/psdrv.h
index bacf8e2..3257079 100644
--- a/include/psdrv.h
+++ b/include/psdrv.h
@@ -214,9 +214,9 @@
 typedef struct {
     HANDLE16		hJob;
     LPSTR		output;		/* Output file/port */
-    BOOL              banding;        /* Have we received a NEXTBAND */
-    BOOL		NeedPageHeader; /* Page header not sent yet */
-    INT		PageNo;
+    BOOL		banding;        /* Have we received a NEXTBAND */
+    BOOL		OutOfPage;      /* Page header not sent yet */
+    INT			PageNo;
 } JOB;
 
 typedef struct {
@@ -263,7 +263,7 @@
 		     COLORREF wincolor );
 
 
-extern INT PSDRV_WriteHeader( DC *dc, char *title, int len );
+extern INT PSDRV_WriteHeader( DC *dc, LPCSTR title );
 extern INT PSDRV_WriteFooter( DC *dc );
 extern INT PSDRV_WriteNewPage( DC *dc );
 extern INT PSDRV_WriteEndPage( DC *dc );
@@ -315,6 +315,8 @@
 			   INT xend, INT yend );
 extern BOOL PSDRV_Ellipse( DC *dc, INT left, INT top, INT right,
 			     INT bottom );
+extern INT PSDRV_EndDoc( DC *dc );
+extern INT PSDRV_EndPage( DC *dc );
 extern BOOL PSDRV_EnumDeviceFonts( DC* dc, LPLOGFONT16 plf, 
 				     DEVICEFONTENUMPROC proc, LPARAM lp );
 extern INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput, 
@@ -349,11 +351,14 @@
 extern VOID PSDRV_SetDeviceClipping( DC *dc );
 extern COLORREF PSDRV_SetPixel( DC *dc, INT x, INT y, COLORREF color );
 extern COLORREF PSDRV_SetTextColor( DC *dc, COLORREF color );
+extern INT PSDRV_StartDoc( DC *dc, const DOCINFOA *doc );
+extern INT PSDRV_StartPage( DC *dc );
 extern INT PSDRV_StretchDIBits( DC *dc, INT xDst, INT yDst,
-				  INT widthDst, INT heightDst, INT xSrc,
-				  INT ySrc, INT widthSrc, INT heightSrc,
-				  const void *bits, const BITMAPINFO *info,
-				  UINT wUsage, DWORD dwRop );
+				INT widthDst, INT heightDst, INT xSrc,
+				INT ySrc, INT widthSrc, INT heightSrc,
+				const void *bits, const BITMAPINFO *info,
+				UINT wUsage, DWORD dwRop );
+
 extern INT PSDRV_ExtDeviceMode(HWND hwnd, LPDEVMODEA lpdmOutput,
 			       LPSTR lpszDevice, LPSTR lpszPort,
 			       LPDEVMODEA lpdmInput, LPSTR lpszProfile,
diff --git a/include/wine/wingdi16.h b/include/wine/wingdi16.h
index 66351c5..cb7f0a0 100644
--- a/include/wine/wingdi16.h
+++ b/include/wine/wingdi16.h
@@ -431,7 +431,7 @@
 INT16       WINAPI OffsetVisRgn16(HDC16,INT16,INT16);
 DWORD       WINAPI OffsetWindowOrg16(HDC16,INT16,INT16);
 BOOL16      WINAPI OffsetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
-HANDLE16    WINAPI OpenJob16(LPSTR,LPSTR,HDC16);
+HANDLE16    WINAPI OpenJob16(LPCSTR,LPCSTR,HDC16);
 BOOL16      WINAPI PaintRgn16(HDC16,HRGN16);
 BOOL16      WINAPI PatBlt16(HDC16,INT16,INT16,INT16,INT16,DWORD);
 HRGN16      WINAPI PathToRegion16(HDC16);
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 1a1471c..2c8553e 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -25,6 +25,7 @@
 #include "callback.h"
 #include "xmalloc.h"
 #include "options.h"
+#include "heap.h"
 
 DEFAULT_DEBUG_CHANNEL(print)
 
@@ -39,74 +40,65 @@
  */
 INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
 {
-  INT16 retVal;
-  TRACE("(%p)\n", lpdoc );
-  TRACE("%d 0x%lx:0x%p 0x%lx:0x%p\n",lpdoc->cbSize,
-	lpdoc->lpszDocName,PTR_SEG_TO_LIN(lpdoc->lpszDocName),
-	lpdoc->lpszOutput,PTR_SEG_TO_LIN(lpdoc->lpszOutput));
-  TRACE("%d %s %s\n",lpdoc->cbSize,
-	(LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName),
-	(LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszOutput));
-  retVal =  Escape16(hdc, STARTDOC,
-    strlen((LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName)), lpdoc->lpszDocName, 0);
-  TRACE("Escape16 returned %d\n",retVal);
-  return retVal;
+    DOCINFOA docA;
+
+    docA.cbSize = lpdoc->cbSize;
+    docA.lpszDocName = PTR_SEG_TO_LIN(lpdoc->lpszDocName);
+    docA.lpszOutput = PTR_SEG_TO_LIN(lpdoc->lpszOutput);
+    docA.lpszDatatype = NULL;
+    docA.fwType = 0;
+
+    return StartDocA(hdc, &docA);
 }
 
 /******************************************************************
- *                  EndPage16  [GDI.380]
+ *                  StartDocA  [GDI32.347]
  *
  */
-INT16 WINAPI EndPage16( HDC16 hdc )
+INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc)
 {
-  INT16 retVal;
-  retVal =  Escape16(hdc, NEWFRAME, 0, 0, 0);
-  TRACE("Escape16 returned %d\n",retVal);
-  return retVal;
-}
+    DC *dc = DC_GetDCPtr( hdc );
 
-/******************************************************************
- *                  StartDoc32A  [GDI32.347]
- *
- */
-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),
-		   doc->lpszDocName,
-		   0);
+
+    if(!dc) return 0;
+
+    if(dc->funcs->pStartDoc)
+        return dc->funcs->pStartDoc( dc, doc );
+    else
+        return Escape(hdc, STARTDOC, strlen(doc->lpszDocName),
+		      doc->lpszDocName, 0);
 }
 
 /*************************************************************************
- *                  StartDoc32W [GDI32.348]
+ *                  StartDocW [GDI32.348]
  * 
  */
-INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc) {
-  FIXME("stub\n");
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
-  return 0; /* failure*/
-}
-
-/******************************************************************
- *                  StartPage32  [GDI32.349]
- *
- */
-INT WINAPI StartPage(HDC hdc)
+INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc)
 {
-  FIXME("stub\n");
-  return 1;
-}
+    DOCINFOA docA;
+    INT ret;
 
-/******************************************************************
- *                  EndPage32  [GDI32.77]
- *
- */
-INT WINAPI EndPage(HDC hdc)
-{
-  return Escape(hdc, NEWFRAME, 0, 0, 0);
+    docA.cbSize = doc->cbSize;
+    docA.lpszDocName = doc->lpszDocName ? 
+      HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDocName ) : NULL;
+    docA.lpszOutput = doc->lpszOutput ?
+      HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszOutput ) : NULL;
+    docA.lpszDatatype = doc->lpszDatatype ?
+      HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDatatype ) : NULL;
+    docA.fwType = doc->fwType;
+
+    ret = StartDocA(hdc, &docA);
+
+    if(docA.lpszDocName)
+        HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDocName );
+    if(docA.lpszOutput)
+        HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszOutput );
+    if(docA.lpszDatatype)
+        HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDatatype );
+
+    return ret;
 }
 
 /******************************************************************
@@ -115,16 +107,71 @@
  */
 INT16 WINAPI EndDoc16(HDC16 hdc)
 {
-  return  Escape16(hdc, ENDDOC, 0, 0, 0);
+    return EndDoc(hdc);
 }
 
 /******************************************************************
- *                  EndDoc32  [GDI32.76]
+ *                  EndDoc  [GDI32.76]
  *
  */
 INT WINAPI EndDoc(HDC hdc)
 {
-  return Escape(hdc, ENDDOC, 0, 0, 0);
+    DC *dc = DC_GetDCPtr( hdc );
+    if(!dc) return 0;
+
+    if(dc->funcs->pEndDoc)
+        return dc->funcs->pEndDoc( dc );
+    else
+        return Escape(hdc, ENDDOC, 0, 0, 0);
+}
+
+/******************************************************************
+ *                  StartPage16  [GDI.379]
+ *
+ */
+INT16 WINAPI StartPage16(HDC16 hdc)
+{
+    return StartPage(hdc);
+}
+
+/******************************************************************
+ *                  StartPage  [GDI32.349]
+ *
+ */
+INT WINAPI StartPage(HDC hdc)
+{
+    DC *dc = DC_GetDCPtr( hdc );
+    if(!dc) return 0;
+
+    if(dc->funcs->pStartPage)
+        return dc->funcs->pStartPage( dc );
+
+    FIXME("stub\n");
+    return 1;
+}
+
+/******************************************************************
+ *                  EndPage16  [GDI.380]
+ *
+ */
+INT16 WINAPI EndPage16( HDC16 hdc )
+{
+    return EndPage(hdc);
+}
+
+/******************************************************************
+ *                  EndPage  [GDI32.77]
+ *
+ */
+INT WINAPI EndPage(HDC hdc)
+{
+    DC *dc = DC_GetDCPtr( hdc );
+    if(!dc) return 0;
+
+    if(dc->funcs->pEndPage)
+        return dc->funcs->pEndPage( dc );
+    else
+        return Escape(hdc, NEWFRAME, 0, 0, 0);
 }
 
 /******************************************************************************
@@ -132,20 +179,25 @@
  */
 INT16 WINAPI AbortDoc16(HDC16 hdc)
 {
-  return Escape16(hdc, ABORTDOC, 0, 0, 0);
+    return AbortDoc(hdc);
 }
 
 /******************************************************************************
- *                 AbortDoc32  [GDI32.0]
+ *                 AbortDoc  [GDI32.105]
  */
 INT WINAPI AbortDoc(HDC hdc)
 {
-    FIXME("(%d): stub\n", hdc);
-    return 1;
+    DC *dc = DC_GetDCPtr( hdc );
+    if(!dc) return 0;
+
+    if(dc->funcs->pAbortDoc)
+        return dc->funcs->pAbortDoc( dc );
+    else
+        return Escape(hdc, ABORTDOC, 0, 0, 0);
 }
 
 /**********************************************************************
- *           QueryAbort   (GDI.155)
+ *           QueryAbort16   (GDI.155)
  *
  *  Calls the app's AbortProc function if avail.
  *
@@ -363,7 +415,7 @@
 }
 
 /* TTD Need to do some DOS->UNIX file conversion here */
-static int CreateSpoolFile(LPSTR pszOutput)
+static int CreateSpoolFile(LPCSTR pszOutput)
 {
     int fd=-1;
     char psCmd[1024];
@@ -378,7 +430,7 @@
     TRACE("Got printerSpoolCommand '%s' for output device '%s'\n",
 	  psCmd, pszOutput);
     if (!*psCmd)
-        psCmdP = pszOutput;
+        psCmdP = (char *)pszOutput;
     else
     {
         while (*psCmdP && isspace(*psCmdP))
@@ -444,7 +496,7 @@
  *           OpenJob   (GDI.240)
  *
  */
-HANDLE16 WINAPI OpenJob16(LPSTR lpOutput, LPSTR lpTitle, HDC16 hDC)
+HANDLE16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
 {
     HANDLE16 hHandle = (HANDLE16)SP_ERROR;
     PPRINTJOB pPrintJob;
