Fixed some Winelib names.
[wine] / misc / printdrv.c
1 /* 
2  * Implementation of some printer driver bits
3  * 
4  * Copyright 1996 John Harvey
5  * Copyright 1998 Andreas Mohr
6  */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include <ctype.h>
11 #include "windows.h"
12 #include "win.h"
13 #include "winerror.h"
14 #include "winreg.h"
15 #include "debug.h"
16 #include "winspool.h"
17
18 static char PrinterModel[]      = "Printer Model";
19 static char DefaultDevMode[]    = "Default DevMode";
20 static char PrinterDriverData[] = "PrinterDriverData";
21 static char Printers[]          = "System\\CurrentControlSet\\Control\\Print\\Printers\\";
22
23 /******************************************************************
24  *                  StartDoc16  [GDI.377]
25  *
26  */
27 INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
28 {
29   INT16 retVal;
30   TRACE(print,"(%p)\n", lpdoc );
31   TRACE(print,"%d 0x%lx:0x%p 0x%lx:0x%p\n",lpdoc->cbSize,
32         lpdoc->lpszDocName,PTR_SEG_TO_LIN(lpdoc->lpszDocName),
33         lpdoc->lpszOutput,PTR_SEG_TO_LIN(lpdoc->lpszOutput));
34   TRACE(print, "%d %s %s\n",lpdoc->cbSize,
35         (LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName),
36         (LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszOutput));
37   retVal =  Escape16(hdc, STARTDOC,
38     strlen((LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName)), lpdoc->lpszDocName, 0);
39   TRACE(print,"Escape16 returned %d\n",retVal);
40   return retVal;
41 }
42
43 /******************************************************************
44  *                  EndPage16  [GDI.380]
45  *
46  */
47 INT16 WINAPI EndPage16( HDC16 hdc )
48 {
49   INT16 retVal;
50   retVal =  Escape16(hdc, NEWFRAME, 0, 0, 0);
51   TRACE(print,"Escape16 returned %d\n",retVal);
52   return retVal;
53 }
54
55 /******************************************************************
56  *                  StartDoc32A  [GDI32.347]
57  *
58  */
59 INT32 WINAPI StartDoc32A(HDC32 hdc ,const DOCINFO32A* doc)
60 {
61   FIXME(gdi,"stub\n");
62   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
63   return 0; /* failure*/
64 }
65
66 /*************************************************************************
67  *                  StartDoc32W [GDI32.348]
68  * 
69  */
70 INT32 WINAPI StartDoc32W(HDC32 hdc, const DOCINFO32W* doc) {
71   FIXME(gdi,"stub\n");
72   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
73   return 0; /* failure*/
74 }
75
76 /******************************************************************
77  *                  StartPage32  [GDI32.349]
78  *
79  */
80 INT32 WINAPI StartPage32(HDC32 hdc)
81 {
82   FIXME(gdi,"stub\n");
83   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
84   return 0; /* failure*/
85 }
86
87 /******************************************************************
88  *                  EndPage32  [GDI32.77]
89  *
90  */
91 INT32 WINAPI EndPage32(HDC32 hdc)
92 {
93   FIXME(gdi,"stub\n");
94   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
95   return 0; /* failure*/
96 }
97
98 /******************************************************************
99  *                  EndDoc16  [GDI.378]
100  *
101  */
102 INT16 WINAPI EndDoc16(HDC16 hdc)
103 {
104   return  Escape16(hdc, ENDDOC, 0, 0, 0);
105 }
106
107 /******************************************************************
108  *                  EndDoc32  [GDI32.76]
109  *
110  */
111 INT32 WINAPI EndDoc32(HDC32 hdc)
112 {
113   FIXME(gdi,"stub\n");
114   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
115   return 0; /* failure*/
116 }
117
118 /******************************************************************************
119  *                 AbortDoc16  [GDI.382]
120  */
121 INT16 WINAPI AbortDoc16(HDC16 hdc)
122 {
123   return Escape16(hdc, ABORTDOC, 0, 0, 0);
124 }
125
126 /******************************************************************************
127  *                 AbortDoc32  [GDI32.0]
128  */
129 INT32 WINAPI AbortDoc32(HDC32 hdc)
130 {
131     FIXME(gdi, "(%d): stub\n", hdc);
132     return 1;
133 }
134
135 /******************************************************************
136  *                  DrvGetPrinterDataInternal
137  *
138  * Helper for DrvGetPrinterData
139  */
140 static DWORD DrvGetPrinterDataInternal(LPSTR RegStr_Printer,
141 LPBYTE lpPrinterData, int cbData, int what)
142 {
143     DWORD res = -1;
144     HKEY hkey;
145     DWORD dwType, cbQueryData;
146
147     if (!(RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey))) {
148         if (what == INT_PD_DEFAULT_DEVMODE) { /* "Default DevMode" */
149             if (!(RegQueryValueEx32A(hkey, DefaultDevMode, 0, &dwType, 0, &cbQueryData))) {
150                 if (!lpPrinterData)
151                     res = cbQueryData;
152                 else if ((cbQueryData) && (cbQueryData <= cbData)) {
153                     cbQueryData = cbData;
154                     if (RegQueryValueEx32A(hkey, DefaultDevMode, 0,
155                                 &dwType, lpPrinterData, &cbQueryData))
156                         res = cbQueryData;
157                 }
158             }
159         } else { /* "Printer Driver" */
160             cbQueryData = 32;
161             RegQueryValueEx32A(hkey, "Printer Driver", 0,
162                         &dwType, lpPrinterData, &cbQueryData);
163             res = cbQueryData;
164         }
165     }
166     if (hkey) RegCloseKey(hkey);
167     return res;
168 }
169
170 /******************************************************************
171  *                DrvGetPrinterData     [GDI.282]
172  *
173  */
174 DWORD WINAPI DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
175                                LPDWORD lpType, LPBYTE lpPrinterData,
176                                int cbData, LPDWORD lpNeeded)
177 {
178     LPSTR RegStr_Printer;
179     HKEY hkey = 0, hkey2 = 0;
180     DWORD res = 0;
181     DWORD dwType, PrinterAttr, cbPrinterAttr, SetData, size;
182
183     if (HIWORD(lpPrinter))
184             TRACE(print,"printer %s\n",lpPrinter);
185     else
186             TRACE(print,"printer %p\n",lpPrinter);
187     if (HIWORD(lpProfile))
188             TRACE(print,"profile %s\n",lpProfile);
189     else
190             TRACE(print,"profile %p\n",lpProfile);
191     TRACE(print,"lpType %p\n",lpType);
192
193     if ((!lpPrinter) || (!lpProfile) || (!lpNeeded))
194         return ERROR_INVALID_PARAMETER;
195
196     RegStr_Printer = HeapAlloc(GetProcessHeap(), 0,
197                                strlen(Printers) + strlen(lpPrinter) + 2);
198     strcpy(RegStr_Printer, Printers);
199     strcat(RegStr_Printer, lpPrinter);
200
201     if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
202     (!strcmp(lpProfile, DefaultDevMode)))) {
203         size = DrvGetPrinterDataInternal(RegStr_Printer, lpPrinterData, cbData,
204                                          INT_PD_DEFAULT_DEVMODE);
205         if (size+1) {
206             *lpNeeded = size;
207             if ((lpPrinterData) && (*lpNeeded > cbData))
208                 res = ERROR_MORE_DATA;
209         }
210         else res = ERROR_INVALID_PRINTER_NAME;
211     }
212     else
213     if (((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
214     (!strcmp(lpProfile, PrinterModel)))) {
215         *lpNeeded = 32;
216         if (!lpPrinterData) goto failed;
217         if (cbData < 32) {
218             res = ERROR_MORE_DATA;
219             goto failed;
220         }
221         size = DrvGetPrinterDataInternal(RegStr_Printer, lpPrinterData, cbData,
222                                          INT_PD_DEFAULT_MODEL);
223         if ((size+1) && (lpType))
224             *lpType = REG_SZ;
225         else
226             res = ERROR_INVALID_PRINTER_NAME;
227     }
228     else
229     {
230         if ((res = RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)))
231             goto failed;
232         cbPrinterAttr = 4;
233         if ((res = RegQueryValueEx32A(hkey, "Attributes", 0,
234                         &dwType, (LPBYTE)&PrinterAttr, &cbPrinterAttr)))
235             goto failed;
236         if ((res = RegOpenKey32A(hkey, PrinterDriverData, &hkey2)))
237             goto failed;
238         *lpNeeded = cbData;
239         res = RegQueryValueEx32A(hkey2, lpProfile, 0,
240                 lpType, lpPrinterData, lpNeeded);
241         if ((res != ERROR_CANTREAD) &&
242          ((PrinterAttr &
243         (PRINTER_ATTRIBUTE_ENABLE_BIDI|PRINTER_ATTRIBUTE_NETWORK))
244         == PRINTER_ATTRIBUTE_NETWORK))
245         {
246             if (!(res) && (*lpType == REG_DWORD) && (*(LPDWORD)lpPrinterData == -1))
247                 res = ERROR_INVALID_DATA;
248         }
249         else
250         {
251             SetData = -1;
252             RegSetValueEx32A(hkey2, lpProfile, 0, REG_DWORD, (LPBYTE)&SetData, 4); /* no result returned */
253         }
254     }
255         
256 failed:
257     if (hkey2) RegCloseKey(hkey2);
258     if (hkey) RegCloseKey(hkey);
259     HeapFree(GetProcessHeap(), 0, RegStr_Printer);
260     return res;
261 }
262
263
264 /******************************************************************
265  *                 DrvSetPrinterData     [GDI.281]
266  *
267  */
268 DWORD WINAPI DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
269                                DWORD lpType, LPBYTE lpPrinterData,
270                                DWORD dwSize)
271 {
272     LPSTR RegStr_Printer;
273     HKEY hkey = 0;
274     DWORD res = 0;
275
276     if (HIWORD(lpPrinter))
277             TRACE(print,"printer %s\n",lpPrinter);
278     else
279             TRACE(print,"printer %p\n",lpPrinter);
280     if (HIWORD(lpProfile))
281             TRACE(print,"profile %s\n",lpProfile);
282     else
283             TRACE(print,"profile %p\n",lpProfile);
284     TRACE(print,"lpType %08lx\n",lpType);
285
286     if ((!lpPrinter) || (!lpProfile) ||
287     ((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
288     (!strcmp(lpProfile, PrinterModel))))
289         return ERROR_INVALID_PARAMETER;
290
291     RegStr_Printer = HeapAlloc(GetProcessHeap(), 0,
292                         strlen(Printers) + strlen(lpPrinter) + 2);
293     strcpy(RegStr_Printer, Printers);
294     strcat(RegStr_Printer, lpPrinter);
295
296     if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
297     (!strcmp(lpProfile, DefaultDevMode)))) {
298         if ( RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey) 
299              != ERROR_SUCCESS ||
300              RegSetValueEx32A(hkey, DefaultDevMode, 0, REG_BINARY, 
301                               lpPrinterData, dwSize) != ERROR_SUCCESS )
302                 res = ERROR_INVALID_PRINTER_NAME;
303     }
304     else
305     {
306         strcat(RegStr_Printer, "\\");
307
308         if( (res = RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)) ==
309             ERROR_SUCCESS ) {
310
311             if (!lpPrinterData) 
312                 res = RegDeleteValue32A(hkey, lpProfile);
313             else
314                 res = RegSetValueEx32A(hkey, lpProfile, 0, lpType,
315                                        lpPrinterData, dwSize);
316         }
317     }
318
319     if (hkey) RegCloseKey(hkey);
320     HeapFree(GetProcessHeap(), 0, RegStr_Printer);
321     return res;
322 }
323
324
325 /******************************************************************
326  *              DeviceCapabilities32A    [WINSPOOL.151]
327  *
328  */
329 INT32 WINAPI DeviceCapabilities32A(LPCSTR printer,LPCSTR target,WORD z,
330                                    LPSTR a,LPDEVMODE32A b)
331 {
332     FIXME(print,"(%s,%s,%d,%p,%p):stub.\n",printer,target,z,a,b);
333     return 1;           
334 }
335
336
337 /*****************************************************************************
338  *          DeviceCapabilities32W 
339  */
340 INT32 WINAPI DeviceCapabilities32W(LPCWSTR pDevice, LPCWSTR pPort,
341                                    WORD fwCapability, LPWSTR pOutput,
342                                    const DEVMODE32W *pDevMode)
343 {
344     FIXME(print,"(%p,%p,%d,%p,%p): stub\n",
345           pDevice, pPort, fwCapability, pOutput, pDevMode);
346     return -1;
347 }
348
349 /******************************************************************
350  *              DocumentProperties32A   [WINSPOOL.155]
351  *
352  */
353 LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
354                                 LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput,
355                                   LPDEVMODE32A pDevModeInput,DWORD fMode )
356 {
357     FIXME(print,"(%d,%d,%s,%p,%p,%ld):stub.\n",
358         hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
359     );
360     return 1;
361 }
362
363
364 /*****************************************************************************
365  *          DocumentProperties32W 
366  */
367 LONG WINAPI DocumentProperties32W(HWND32 hWnd, HANDLE32 hPrinter,
368                                   LPWSTR pDeviceName,
369                                   LPDEVMODE32W pDevModeOutput,
370                                   LPDEVMODE32W pDevModeInput, DWORD fMode)
371 {
372     FIXME(print,"(%d,%d,%s,%p,%p,%ld): stub\n",
373           hWnd,hPrinter,debugstr_w(pDeviceName),pDevModeOutput,pDevModeInput,
374           fMode);
375     return -1;
376 }
377
378
379 /******************************************************************
380  *              OpenPrinter32A        [WINSPOOL.196]
381  *
382  */
383 BOOL32 WINAPI OpenPrinter32A(LPSTR lpPrinterName,HANDLE32 *phPrinter,
384                              LPPRINTER_DEFAULTS32A pDefault)
385 {
386     FIXME(print,"(%s,%p,%p):stub\n",debugstr_a(lpPrinterName), phPrinter,
387           pDefault);
388     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
389     return FALSE;
390 }
391
392 /******************************************************************
393  *              OpenPrinter32W        [WINSPOOL.197]
394  *
395  */
396 BOOL32 WINAPI OpenPrinter32W(LPWSTR lpPrinterName,HANDLE32 *phPrinter,
397                              LPPRINTER_DEFAULTS32W pDefault)
398 {
399     FIXME(print,"(%s,%p,%p):stub\n",debugstr_w(lpPrinterName), phPrinter,
400           pDefault);
401     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
402     return FALSE;
403 }
404
405 /******************************************************************
406  *              EnumPrinters32A        [WINSPOOL.174]
407  *
408  */
409 BOOL32  WINAPI EnumPrinters32A(DWORD dwType, LPSTR lpszName,
410                                DWORD dwLevel, LPBYTE lpbPrinters,
411                                DWORD cbBuf, LPDWORD lpdwNeeded,
412                                LPDWORD lpdwReturned)
413 {
414     FIXME(print,"Nearly empty stub\n");
415     *lpdwReturned=0;
416     *lpdwNeeded = 0;
417     return TRUE;
418 }
419
420 /******************************************************************
421  *              EnumPrinters32W        [WINSPOOL.175]
422  *
423  */
424 BOOL32  WINAPI EnumPrinters32W(DWORD dwType, LPWSTR lpszName,
425                                DWORD dwLevel, LPBYTE lpbPrinters,
426                                DWORD cbBuf, LPDWORD lpdwNeeded,
427                                LPDWORD lpdwReturned)
428 {
429     FIXME(print,"Nearly empty stub\n");
430     *lpdwReturned=0;
431     *lpdwNeeded = 0;
432     return TRUE;
433 }
434
435 /******************************************************************
436  *              AddMonitor32A        [WINSPOOL.107]
437  *
438  */
439 BOOL32 WINAPI AddMonitor32A(LPCSTR pName, DWORD Level, LPBYTE pMonitors)
440 {
441     FIXME(print, "(%s,%lx,%p):stub!\n", pName, Level, pMonitors);
442     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
443     return FALSE;
444 }
445
446 /******************************************************************
447  *              DeletePrinterDriver32A        [WINSPOOL.146]
448  *
449  */
450 BOOL32 WINAPI
451 DeletePrinterDriver32A (LPSTR pName, LPSTR pEnvironment, LPSTR pDriverName)
452 {
453     FIXME(print,"(%s,%s,%s):stub\n",debugstr_a(pName),debugstr_a(pEnvironment),
454           debugstr_a(pDriverName));
455     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
456     return FALSE;
457 }
458
459
460 /******************************************************************
461  *              DeleteMonitor32A        [WINSPOOL.135]
462  *
463  */
464 BOOL32 WINAPI
465 DeleteMonitor32A (LPSTR pName, LPSTR pEnvironment, LPSTR pMonitorName)
466 {
467     FIXME(print,"(%s,%s,%s):stub\n",debugstr_a(pName),debugstr_a(pEnvironment),
468           debugstr_a(pMonitorName));
469     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
470     return FALSE;
471 }
472
473
474 /******************************************************************
475  *              DeletePort32A        [WINSPOOL.137]
476  *
477  */
478 BOOL32 WINAPI
479 DeletePort32A (LPSTR pName, HWND32 hWnd, LPSTR pPortName)
480 {
481     FIXME(print,"(%s,0x%08x,%s):stub\n",debugstr_a(pName),hWnd,
482           debugstr_a(pPortName));
483     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
484     return FALSE;
485 }
486
487 /******************************************************************************
488  *    SetPrinter32W  [WINSPOOL.214]
489  */
490 BOOL32 WINAPI
491 SetPrinter32W(
492   HANDLE32  hPrinter,
493   DWORD     Level,
494   LPBYTE    pPrinter,
495   DWORD     Command) {
496
497        FIXME(print,"():stub\n");
498   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
499        return FALSE;
500 }
501
502 /******************************************************************************
503  *    WritePrinter32  [WINSPOOL.223]
504  */
505 BOOL32 WINAPI
506 WritePrinter32( 
507   HANDLE32  hPrinter,
508   LPVOID  pBuf,
509   DWORD   cbBuf,
510   LPDWORD pcWritten) {
511
512        FIXME(print,"():stub\n");
513   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
514        return FALSE;
515 }
516
517 /*****************************************************************************
518  *          AddForm32A  [WINSPOOL.103]
519  */
520 BOOL32 WINAPI AddForm32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pForm)
521 {
522     FIXME(print, "(%d,%ld,%p): stub\n", hPrinter, Level, pForm);
523     return 1;
524 }
525
526 /*****************************************************************************
527  *          AddForm32W  [WINSPOOL.104]
528  */
529 BOOL32 WINAPI AddForm32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pForm)
530 {
531     FIXME(print, "(%d,%ld,%p): stub\n", hPrinter, Level, pForm);
532     return 1;
533 }
534
535 /*****************************************************************************
536  *          AddJob32A  [WINSPOOL.105]
537  */
538 BOOL32 WINAPI AddJob32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pData,
539                         DWORD cbBuf, LPDWORD pcbNeeded)
540 {
541     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pData, cbBuf,
542           pcbNeeded);
543     return 1;
544 }
545
546 /*****************************************************************************
547  *          AddJob32W  [WINSPOOL.106]
548  */
549 BOOL32 WINAPI AddJob32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pData, DWORD cbBuf,
550                         LPDWORD pcbNeeded)
551 {
552     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pData, cbBuf,
553           pcbNeeded);
554     return 1;
555 }
556
557 /*****************************************************************************
558  *          AddPrinter32A  [WINSPOOL.117]
559  */
560 HANDLE32 WINAPI AddPrinter32A(LPSTR pName, DWORD Level, LPBYTE pPrinter)
561 {
562     FIXME(print, "(%s,%ld,%p): stub\n", pName, Level, pPrinter);
563     return 0;
564 }
565
566 /*****************************************************************************
567  *          AddPrinter32W  [WINSPOOL.122]
568  */
569 HANDLE32 WINAPI AddPrinter32W(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
570 {
571     FIXME(print, "(%p,%ld,%p): stub\n", pName, Level, pPrinter);
572     return 0;
573 }
574
575
576 /*****************************************************************************
577  *          ClosePrinter32  [WINSPOOL.126]
578  */
579 BOOL32 WINAPI ClosePrinter32(HANDLE32 hPrinter)
580 {
581     FIXME(print, "(%d): stub\n", hPrinter);
582     return 1;
583 }
584
585 /*****************************************************************************
586  *          DeleteForm32A  [WINSPOOL.133]
587  */
588 BOOL32 WINAPI DeleteForm32A(HANDLE32 hPrinter, LPSTR pFormName)
589 {
590     FIXME(print, "(%d,%s): stub\n", hPrinter, pFormName);
591     return 1;
592 }
593
594 /*****************************************************************************
595  *          DeleteForm32W  [WINSPOOL.134]
596  */
597 BOOL32 WINAPI DeleteForm32W(HANDLE32 hPrinter, LPWSTR pFormName)
598 {
599     FIXME(print, "(%d,%s): stub\n", hPrinter, debugstr_w(pFormName));
600     return 1;
601 }
602
603 /*****************************************************************************
604  *          DeletePrinter32  [WINSPOOL.143]
605  */
606 BOOL32 WINAPI DeletePrinter32(HANDLE32 hPrinter)
607 {
608     FIXME(print, "(%d): stub\n", hPrinter);
609     return 1;
610 }
611
612 /*****************************************************************************
613  *          SetPrinter32A  [WINSPOOL.211]
614  */
615 BOOL32 WINAPI SetPrinter32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
616                            DWORD Command)
617 {
618     FIXME(print, "(%d,%ld,%p,%ld): stub\n",hPrinter,Level,pPrinter,Command);
619     return FALSE;
620 }
621
622 /*****************************************************************************
623  *          SetJob32A  [WINSPOOL.209]
624  */
625 BOOL32 WINAPI SetJob32A(HANDLE32 hPrinter, DWORD JobId, DWORD Level,
626                        LPBYTE pJob, DWORD Command)
627 {
628     FIXME(print, "(%d,%ld,%ld,%p,%ld): stub\n",hPrinter,JobId,Level,pJob,
629          Command);
630     return FALSE;
631 }
632
633 /*****************************************************************************
634  *          SetJob32W  [WINSPOOL.210]
635  */
636 BOOL32 WINAPI SetJob32W(HANDLE32 hPrinter, DWORD JobId, DWORD Level,
637                        LPBYTE pJob, DWORD Command)
638 {
639     FIXME(print, "(%d,%ld,%ld,%p,%ld): stub\n",hPrinter,JobId,Level,pJob,
640          Command);
641     return FALSE;
642 }
643
644 /*****************************************************************************
645  *          GetForm32A  [WINSPOOL.181]
646  */
647 BOOL32 WINAPI GetForm32A(HANDLE32 hPrinter, LPSTR pFormName, DWORD Level,
648                  LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded)
649 {
650     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,pFormName,
651          Level,pForm,cbBuf,pcbNeeded); 
652     return FALSE;
653 }
654
655 /*****************************************************************************
656  *          GetForm32W  [WINSPOOL.182]
657  */
658 BOOL32 WINAPI GetForm32W(HANDLE32 hPrinter, LPWSTR pFormName, DWORD Level,
659                  LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded)
660 {
661     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,
662           debugstr_w(pFormName),Level,pForm,cbBuf,pcbNeeded);
663     return FALSE;
664 }
665
666 /*****************************************************************************
667  *          SetForm32A  [WINSPOOL.207]
668  */
669 BOOL32 WINAPI SetForm32A(HANDLE32 hPrinter, LPSTR pFormName, DWORD Level,
670                         LPBYTE pForm)
671 {
672     FIXME(print, "(%d,%s,%ld,%p): stub\n",hPrinter,pFormName,Level,pForm);
673     return FALSE;
674 }
675
676 /*****************************************************************************
677  *          SetForm32W  [WINSPOOL.208]
678  */
679 BOOL32 WINAPI SetForm32W(HANDLE32 hPrinter, LPWSTR pFormName, DWORD Level,
680                         LPBYTE pForm)
681 {
682     FIXME(print, "(%d,%p,%ld,%p): stub\n",hPrinter,pFormName,Level,pForm);
683     return FALSE;
684 }
685
686 /*****************************************************************************
687  *          ReadPrinter32  [WINSPOOL.202]
688  */
689 BOOL32 WINAPI ReadPrinter32(HANDLE32 hPrinter, LPVOID pBuf, DWORD cbBuf,
690                            LPDWORD pNoBytesRead)
691 {
692     FIXME(print, "(%d,%p,%ld,%p): stub\n",hPrinter,pBuf,cbBuf,pNoBytesRead);
693     return FALSE;
694 }
695
696 /*****************************************************************************
697  *          ResetPrinter32A  [WINSPOOL.203]
698  */
699 BOOL32 WINAPI ResetPrinter32A(HANDLE32 hPrinter, LPPRINTER_DEFAULTS32A pDefault)
700 {
701     FIXME(print, "(%d, %p): stub\n", hPrinter, pDefault);
702     return FALSE;
703 }
704
705 /*****************************************************************************
706  *          ResetPrinter32W  [WINSPOOL.204]
707  */
708 BOOL32 WINAPI ResetPrinter32W(HANDLE32 hPrinter, LPPRINTER_DEFAULTS32W pDefault)
709 {
710     FIXME(print, "(%d, %p): stub\n", hPrinter, pDefault);
711     return FALSE;
712 }
713
714 /*****************************************************************************
715  *          GetPrinter32A  [WINSPOOL.187]
716  */
717 BOOL32 WINAPI GetPrinter32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
718                     DWORD cbBuf, LPDWORD pcbNeeded)
719 {
720     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pPrinter, 
721          cbBuf, pcbNeeded);
722     return FALSE;
723 }
724
725 /*****************************************************************************
726  *          GetPrinter32W  [WINSPOOL.194]
727  */
728 BOOL32 WINAPI GetPrinter32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
729                     DWORD cbBuf, LPDWORD pcbNeeded)
730 {
731     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pPrinter,
732           cbBuf, pcbNeeded);
733     return FALSE;
734 }
735
736 /*****************************************************************************
737  *          GetPrinterDriver32A  [WINSPOOL.190]
738  */
739 BOOL32 WINAPI GetPrinterDriver32A(HANDLE32 hPrinter, LPSTR pEnvironment,
740                                  DWORD Level, LPBYTE pDriverInfo,
741                                  DWORD cbBuf, LPDWORD pcbNeeded)
742 {
743     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,pEnvironment,
744          Level,pDriverInfo,cbBuf, pcbNeeded);
745     return FALSE;
746 }
747
748 /*****************************************************************************
749  *          GetPrinterDriver32W  [WINSPOOL.193]
750  */
751 BOOL32 WINAPI GetPrinterDriver32W(HANDLE32 hPrinter, LPWSTR pEnvironment,
752                                   DWORD Level, LPBYTE pDriverInfo, 
753                                   DWORD cbBuf, LPDWORD pcbNeeded)
754 {
755     FIXME(print, "(%d,%p,%ld,%p,%ld,%p): stub\n",hPrinter,pEnvironment,
756           Level,pDriverInfo,cbBuf, pcbNeeded);
757     return FALSE;
758 }
759 /*****************************************************************************
760  *          AddPrinterDriver32A  [WINSPOOL.120]
761  */
762 BOOL32 WINAPI AddPrinterDriver32A(LPSTR printerName,DWORD level, 
763                                    LPBYTE pDriverInfo)
764 {
765     FIXME(print, "(%s,%ld,%p): stub\n",printerName,level,pDriverInfo);
766     return FALSE;
767 }
768 /*****************************************************************************
769  *          AddPrinterDriver32W  [WINSPOOL.121]
770  */
771 BOOL32 WINAPI AddPrinterDriver32W(LPWSTR printerName,DWORD level, 
772                                    LPBYTE pDriverInfo)
773 {
774     FIXME(print, "(%s,%ld,%p): stub\n",debugstr_w(printerName),
775           level,pDriverInfo);
776     return FALSE;
777 }
778
779
780