1/*
2 * winsplp.h
3 *
4 * This file is part of the ReactOS PSDK package.
5 *
6 * Contributors:
7 *   Created by Amine Khaldi.
8 *
9 * THIS SOFTWARE IS NOT COPYRIGHTED
10 *
11 * This source code is offered for use in the public domain. You may
12 * use, modify or distribute it freely.
13 *
14 * This code is distributed in the hope that it will be useful but
15 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
16 * DISCLAIMED. This includes but is not limited to warranties of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 */
20
21#pragma once
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27#if (STRICT && (NTDDI_VERSION >= NTDDI_VISTA))
28#define HKEYMONITOR HKEY
29#else
30#define HKEYMONITOR HANDLE
31#endif
32
33#define PRINTER_NOTIFY_STATUS_ENDPOINT  1
34#define PRINTER_NOTIFY_STATUS_POLL      2
35#define PRINTER_NOTIFY_STATUS_INFO      4
36
37#define ROUTER_UNKNOWN      0
38#define ROUTER_SUCCESS      1
39#define ROUTER_STOP_ROUTING 2
40
41#if (NTDDI_VERSION >= NTDDI_WINXP)
42#define MONITOR2_SIZE_WIN2K (sizeof(DWORD) + (sizeof(PVOID)*18))
43#endif
44
45#define COPYFILE_EVENT_SET_PRINTER_DATAEX           1
46#define COPYFILE_EVENT_DELETE_PRINTER               2
47#define COPYFILE_EVENT_ADD_PRINTER_CONNECTION       3
48#define COPYFILE_EVENT_DELETE_PRINTER_CONNECTION    4
49#define COPYFILE_EVENT_FILES_CHANGED                5
50
51#define COPYFILE_FLAG_CLIENT_SPOOLER             0x00000001
52#define COPYFILE_FLAG_SERVER_SPOOLER             0x00000002
53
54#define PRINTER_NOTIFY_INFO_DATA_COMPACT         1
55
56typedef struct _PRINTER_NOTIFY_INIT {
57  DWORD Size;
58  DWORD Reserved;
59  DWORD PollTime;
60} PRINTER_NOTIFY_INIT, *LPPRINTER_NOTIFY_INIT, *PPRINTER_NOTIFY_INIT;
61
62typedef struct _SPLCLIENT_INFO_1 {
63  DWORD dwSize;
64  LPWSTR pMachineName;
65  LPWSTR pUserName;
66  DWORD dwBuildNum;
67  DWORD dwMajorVersion;
68  DWORD dwMinorVersion;
69  WORD wProcessorArchitecture;
70} SPLCLIENT_INFO_1, *LPSPLCLIENT_INFO_1, *PSPLCLIENT_INFO_1;
71
72typedef struct _SPLCLIENT_INFO_2_V1{
73  ULONG_PTR hSplPrinter;
74} SPLCLIENT_INFO_2_W2K;
75
76typedef struct _SPLCLIENT_INFO_2_V2{
77#ifdef _WIN64
78  DWORD64 hSplPrinter;
79#else
80  DWORD32 hSplPrinter;
81#endif
82} SPLCLIENT_INFO_2_WINXP;
83
84typedef struct _SPLCLIENT_INFO_2_V3{
85  UINT64 hSplPrinter;
86} SPLCLIENT_INFO_2_LONGHORN;
87
88typedef struct _PRINTPROVIDOR {
89  WINBOOL (WINAPI *fpOpenPrinter)(PWSTR lpPrinterName, HANDLE *phPrinter,
90                               PPRINTER_DEFAULTSW pDefault);
91  WINBOOL (WINAPI *fpSetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
92                          LPBYTE pJob, DWORD Command);
93  WINBOOL (WINAPI *fpGetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
94                          LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded);
95  WINBOOL (WINAPI *fpEnumJobs)(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs,
96                            DWORD Level, LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded,
97                            LPDWORD pcReturned);
98  HANDLE (WINAPI *fpAddPrinter)(LPWSTR pName, DWORD Level, LPBYTE pPrinter);
99  WINBOOL (WINAPI *fpDeletePrinter)(HANDLE hPrinter);
100  WINBOOL (WINAPI *fpSetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
101                              DWORD Command);
102  WINBOOL (WINAPI *fpGetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
103                              DWORD cbBuf, LPDWORD pcbNeeded);
104  WINBOOL (WINAPI *fpEnumPrinters)(DWORD dwType, LPWSTR lpszName, DWORD dwLevel,
105                                LPBYTE lpbPrinters, DWORD cbBuf, LPDWORD lpdwNeeded,
106                                LPDWORD lpdwReturned);
107  WINBOOL (WINAPI *fpAddPrinterDriver)(LPWSTR pName, DWORD Level, LPBYTE pDriverInfo);
108  WINBOOL (WINAPI *fpEnumPrinterDrivers)(LPWSTR pName, LPWSTR pEnvironment,
109                                      DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
110                                      LPDWORD pcbNeeded, LPDWORD pcbReturned);
111  WINBOOL (WINAPI *fpGetPrinterDriver)(HANDLE hPrinter, LPWSTR pEnvironment,
112                                    DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
113                                    LPDWORD pcbNeeded);
114  WINBOOL (WINAPI *fpGetPrinterDriverDirectory)(LPWSTR pName, LPWSTR pEnvironment,
115                                             DWORD Level, LPBYTE pDriverDirectory,
116                                             DWORD cbBuf, LPDWORD pcbNeeded);
117  WINBOOL (WINAPI *fpDeletePrinterDriver)(LPWSTR pName, LPWSTR pEnvironment,
118                                       LPWSTR pDriverName);
119  WINBOOL (WINAPI *fpAddPrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
120                                     LPWSTR pPathName, LPWSTR pPrintProcessorName);
121  WINBOOL (WINAPI *fpEnumPrintProcessors)(LPWSTR pName, LPWSTR pEnvironment,
122                                       DWORD Level, LPBYTE pPrintProcessorInfo,
123                                       DWORD cbBuf, LPDWORD pcbNeeded,
124                                       LPDWORD pcbReturned);
125  WINBOOL (WINAPI *fpGetPrintProcessorDirectory)(LPWSTR pName, LPWSTR pEnvironment,
126                                              DWORD Level, LPBYTE pPrintProcessorInfo,
127                                              DWORD cbBuf, LPDWORD pcbNeeded);
128  WINBOOL (WINAPI *fpDeletePrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
129                 LPWSTR pPrintProcessorName);
130  WINBOOL (WINAPI *fpEnumPrintProcessorDatatypes)(LPWSTR pName,
131                                               LPWSTR pPrintProcessorName,
132                                               DWORD Level, LPBYTE pDatatypes,
133                                               DWORD cbBuf, LPDWORD pcbNeeded,
134                                               LPDWORD pcbReturned);
135  DWORD (WINAPI *fpStartDocPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pDocInfo);
136  WINBOOL (WINAPI *fpStartPagePrinter)(HANDLE hPrinter);
137  WINBOOL (WINAPI *fpWritePrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
138                                LPDWORD pcWritten);
139  WINBOOL (WINAPI *fpEndPagePrinter)(HANDLE hPrinter);
140  WINBOOL (WINAPI *fpAbortPrinter)(HANDLE hPrinter);
141  WINBOOL (WINAPI *fpReadPrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
142                               LPDWORD pNoBytesRead);
143  WINBOOL (WINAPI *fpEndDocPrinter)(HANDLE hPrinter);
144  WINBOOL (WINAPI *fpAddJob)(HANDLE hPrinter, DWORD Level, LPBYTE pData,
145                          DWORD cbBuf, LPDWORD pcbNeeded);
146  WINBOOL (WINAPI *fpScheduleJob)(HANDLE hPrinter, DWORD JobID);
147  DWORD (WINAPI *fpGetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
148                                   LPDWORD pType, LPBYTE pData, DWORD nSize,
149                                   LPDWORD pcbNeeded);
150  DWORD (WINAPI *fpSetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
151                                   DWORD Type, LPBYTE pData, DWORD cbData);
152  DWORD (WINAPI *fpWaitForPrinterChange)(HANDLE hPrinter, DWORD Flags);
153  WINBOOL (WINAPI *fpClosePrinter)(HANDLE phPrinter);
154  WINBOOL (WINAPI *fpAddForm)(HANDLE hPrinter, DWORD Level, LPBYTE pForm);
155  WINBOOL (WINAPI *fpDeleteForm)(HANDLE hPrinter, LPWSTR pFormName);
156  WINBOOL (WINAPI *fpGetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
157                           LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded);
158  WINBOOL (WINAPI *fpSetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
159                           LPBYTE pForm);
160  WINBOOL (WINAPI *fpEnumForms)(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
161                             DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
162  WINBOOL (WINAPI *fpEnumMonitors)(LPWSTR pName, DWORD Level, LPBYTE pMonitors,
163                                DWORD cbBuf, LPDWORD pcbNeeded,
164                                LPDWORD pcReturned);
165  WINBOOL (WINAPI *fpEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
166                             DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
167  WINBOOL (WINAPI *fpAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
168  WINBOOL (WINAPI *fpConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
169  WINBOOL (WINAPI *fpDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
170  HANDLE (WINAPI *fpCreatePrinterIC)(HANDLE hPrinter, LPDEVMODEW pDevMode);
171  WINBOOL (WINAPI *fpPlayGdiScriptOnPrinterIC)(HANDLE hPrinterIC, LPBYTE pIn,
172                                            DWORD cIn, LPBYTE pOut, DWORD cOut,
173                                            DWORD ul);
174  WINBOOL (WINAPI *fpDeletePrinterIC)(HANDLE hPrinterIC);
175  WINBOOL (WINAPI *fpAddPrinterConnection)(LPWSTR pName);
176  WINBOOL (WINAPI *fpDeletePrinterConnection)(LPWSTR pName);
177  DWORD (WINAPI *fpPrinterMessageBox)(HANDLE hPrinter, DWORD Error, HWND hWnd,
178                                      LPWSTR pText, LPWSTR pCaption,
179                                      DWORD dwType);
180  WINBOOL (WINAPI *fpAddMonitor)(LPWSTR pName, DWORD Level, LPBYTE pMonitors);
181  WINBOOL (WINAPI *fpDeleteMonitor)(LPWSTR pName, LPWSTR pEnvironment,
182                                 LPWSTR pMonitorName);
183  WINBOOL (WINAPI *fpResetPrinter)(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault);
184  WINBOOL (WINAPI *fpGetPrinterDriverEx)(HANDLE hPrinter, LPWSTR pEnvironment,
185                                      DWORD Level, LPBYTE pDriverInfo,
186                                      DWORD cbBuf, LPDWORD pcbNeeded,
187                                      DWORD dwClientMajorVersion,
188                                      DWORD dwClientMinorVersion,
189                                      PDWORD pdwServerMajorVersion,
190                                      PDWORD pdwServerMinorVersion);
191  HANDLE (WINAPI *fpFindFirstPrinterChangeNotification)(HANDLE hPrinter,
192                                                        DWORD fdwFlags,
193                                                        DWORD fdwOptions,
194                                                        LPVOID pPrinterNotifyOptions);
195  WINBOOL (WINAPI *fpFindClosePrinterChangeNotification)(HANDLE hChange);
196  WINBOOL (WINAPI *fpAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
197                             LPWSTR lpMonitorName);
198  WINBOOL (WINAPI *fpShutDown)(LPVOID pvReserved);
199  WINBOOL (WINAPI *fpRefreshPrinterChangeNotification)(HANDLE hPrinter,
200                                                    DWORD Reserved,
201                                                    PVOID pvReserved,
202                                                    PVOID pPrinterNotifyInfo);
203  WINBOOL (WINAPI *fpOpenPrinterEx)(LPWSTR pPrinterName, LPHANDLE phPrinter,
204                                 LPPRINTER_DEFAULTSW pDefault, LPBYTE pClientInfo,
205                                 DWORD Level);
206  HANDLE (WINAPI *fpAddPrinterEx)(LPWSTR pName, DWORD Level, LPBYTE pPrinter,
207                                  LPBYTE pClientInfo, DWORD ClientInfoLevel);
208  WINBOOL (WINAPI *fpSetPort)(LPWSTR pName, LPWSTR pPortName, DWORD dwLevel,
209                           LPBYTE pPortInfo);
210  DWORD (WINAPI *fpEnumPrinterData)(HANDLE hPrinter, DWORD dwIndex,
211                                    LPWSTR pValueName, DWORD cbValueName,
212                                    LPDWORD pcbValueName, LPDWORD pType,
213                                    LPBYTE pData, DWORD cbData, LPDWORD pcbData);
214  DWORD (WINAPI *fpDeletePrinterData)(HANDLE hPrinter, LPWSTR pValueName);
215  DWORD (WINAPI *fpClusterSplOpen)(LPCWSTR pszServer, LPCWSTR pszResource,
216                                   PHANDLE phSpooler, LPCWSTR pszName,
217                                   LPCWSTR pszAddress);
218  DWORD (WINAPI *fpClusterSplClose)(HANDLE hSpooler);
219  DWORD (WINAPI *fpClusterSplIsAlive)(HANDLE hSpooler);
220  DWORD (WINAPI *fpSetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
221                                     LPCWSTR pValueName, DWORD Type,
222                                     LPBYTE pData, DWORD cbData);
223  DWORD (WINAPI *fpGetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
224                                     LPCWSTR pValueName, LPDWORD pType,
225                                     LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
226  DWORD (WINAPI *fpEnumPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
227                                      LPBYTE pEnumValues, DWORD cbEnumValues,
228                                      LPDWORD pcbEnumValues, LPDWORD pnEnumValues);
229  DWORD (WINAPI *fpEnumPrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName,
230                                   LPWSTR pSubkey, DWORD cbSubkey, LPDWORD pcbSubkey);
231  DWORD (WINAPI *fpDeletePrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
232                                        LPCWSTR pValueName);
233  DWORD (WINAPI *fpDeletePrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName);
234  WINBOOL (WINAPI *fpSeekPrinter)(HANDLE hPrinter, LARGE_INTEGER liDistanceToMove,
235                               PLARGE_INTEGER pliNewPointer, DWORD dwMoveMethod,
236                               WINBOOL bWrite);
237  WINBOOL (WINAPI *fpDeletePrinterDriverEx)(LPWSTR pName, LPWSTR pEnvironment,
238                                         LPWSTR pDriverName, DWORD dwDeleteFlag,
239                                         DWORD dwVersionNum);
240  WINBOOL (WINAPI *fpAddPerMachineConnection)(LPCWSTR pServer,
241                                           LPCWSTR pPrinterName, LPCWSTR pPrintServer,
242                                           LPCWSTR pProvider);
243  WINBOOL (WINAPI *fpDeletePerMachineConnection)(LPCWSTR pServer,
244                                              LPCWSTR pPrinterName);
245  WINBOOL (WINAPI *fpEnumPerMachineConnections)(LPCWSTR pServer,
246                                             LPBYTE pPrinterEnum, DWORD cbBuf,
247                                             LPDWORD pcbNeeded,
248                 LPDWORD pcReturned);
249  WINBOOL (WINAPI *fpXcvData)(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
250                           DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData,
251                           PDWORD pcbOutputNeeded, PDWORD pdwStatus);
252  WINBOOL (WINAPI *fpAddPrinterDriverEx)(LPWSTR pName, DWORD Level,
253                                      LPBYTE pDriverInfo, DWORD dwFileCopyFlags);
254  WINBOOL (WINAPI *fpSplReadPrinter)(HANDLE hPrinter, LPBYTE *pBuf, DWORD cbBuf);
255  WINBOOL (WINAPI *fpDriverUnloadComplete)(LPWSTR pDriverFile);
256  WINBOOL (WINAPI *fpGetSpoolFileInfo)(HANDLE hPrinter, LPWSTR *pSpoolDir,
257                                    LPHANDLE phFile, HANDLE hSpoolerProcess,
258                                    HANDLE hAppProcess);
259  WINBOOL (WINAPI *fpCommitSpoolData)(HANDLE hPrinter, DWORD cbCommit);
260  WINBOOL (WINAPI *fpCloseSpoolFileHandle)(HANDLE hPrinter);
261  WINBOOL (WINAPI *fpFlushPrinter)(HANDLE hPrinter, LPBYTE pBuf, DWORD cbBuf,
262                                LPDWORD pcWritten, DWORD cSleep);
263  DWORD (WINAPI *fpSendRecvBidiData)(HANDLE hPort, LPCWSTR pAction,
264                                     LPBIDI_REQUEST_CONTAINER pReqData,
265                                     LPBIDI_RESPONSE_CONTAINER *ppResData);
266  WINBOOL (WINAPI *fpAddDriverCatalog)(HANDLE hPrinter, DWORD dwLevel,
267                                    VOID *pvDriverInfCatInfo, DWORD dwCatalogCopyFlags);
268} PRINTPROVIDOR, *LPPRINTPROVIDOR;
269
270typedef struct _PRINTPROCESSOROPENDATA {
271  PDEVMODEW pDevMode;
272  LPWSTR pDatatype;
273  LPWSTR pParameters;
274  LPWSTR pDocumentName;
275  DWORD JobId;
276  LPWSTR pOutputFile;
277  LPWSTR pPrinterName;
278} PRINTPROCESSOROPENDATA, *LPPRINTPROCESSOROPENDATA, *PPRINTPROCESSOROPENDATA;
279
280typedef struct _MONITORREG {
281  DWORD cbSize;
282  LONG (WINAPI *fpCreateKey)(HANDLE hcKey, LPCWSTR pszSubKey, DWORD dwOptions,
283                             REGSAM samDesired,
284                             PSECURITY_ATTRIBUTES pSecurityAttributes,
285                             PHANDLE phckResult, PDWORD pdwDisposition,
286                             HANDLE hSpooler);
287  LONG (WINAPI *fpOpenKey)(HANDLE hcKey, LPCWSTR pszSubKey, REGSAM samDesired,
288                           PHANDLE phkResult, HANDLE hSpooler);
289  LONG (WINAPI *fpCloseKey)(HANDLE hcKey, HANDLE hSpooler);
290  LONG (WINAPI *fpDeleteKey)(HANDLE hcKey, LPCWSTR pszSubKey, HANDLE hSpooler);
291  LONG (WINAPI *fpEnumKey)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszName,
292                           PDWORD pcchName, PFILETIME pftLastWriteTime,
293                           HANDLE hSpooler);
294  LONG (WINAPI *fpQueryInfoKey)(HANDLE hcKey, PDWORD pcSubKeys, PDWORD pcbKey,
295                                PDWORD pcValues, PDWORD pcbValue, PDWORD pcbData,
296                                PDWORD pcbSecurityDescriptor,
297                                PFILETIME pftLastWriteTime,
298                                HANDLE hSpooler);
299  LONG (WINAPI *fpSetValue)(HANDLE hcKey, LPCWSTR pszValue, DWORD dwType,
300                const BYTE* pData, DWORD cbData, HANDLE hSpooler);
301  LONG (WINAPI *fpDeleteValue)(HANDLE hcKey, LPCWSTR pszValue, HANDLE hSpooler);
302  LONG (WINAPI *fpEnumValue)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszValue,
303                             PDWORD pcbValue, PDWORD pType, PBYTE pData, PDWORD pcbData,
304                             HANDLE hSpooler);
305  LONG (WINAPI *fpQueryValue)(HANDLE hcKey, LPCWSTR pszValue, PDWORD pType,
306                              PBYTE pData, PDWORD pcbData, HANDLE hSpooler);
307} MONITORREG, *PMONITORREG;
308
309typedef struct _MONITORINIT {
310  DWORD cbSize;
311  HANDLE hSpooler;
312  HKEYMONITOR hckRegistryRoot;
313  PMONITORREG pMonitorReg;
314  WINBOOL bLocal;
315  LPCWSTR pszServerName;
316} MONITORINIT, *PMONITORINIT;
317
318typedef struct _MONITOR {
319  WINBOOL (WINAPI *pfnEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
320                              DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
321  WINBOOL (WINAPI *pfnOpenPort)(LPWSTR pName, PHANDLE pHandle);
322  WINBOOL (WINAPI *pfnOpenPortEx)(LPWSTR pPortName, LPWSTR pPrinterName,
323                               PHANDLE pHandle, struct _MONITOR *pMonitor);
324  WINBOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
325                                 DWORD JobId, DWORD Level, LPBYTE pDocInfo);
326  WINBOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
327                              LPDWORD pcbWritten);
328  WINBOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
329                             LPDWORD pcbRead);
330  WINBOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
331  WINBOOL (WINAPI *pfnClosePort)(HANDLE hPort);
332  WINBOOL (WINAPI *pfnAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
333  WINBOOL (WINAPI *pfnAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
334                              LPWSTR lpMonitorName);
335  WINBOOL (WINAPI *pfnConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
336  WINBOOL (WINAPI *pfnDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
337  WINBOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
338                                           LPWSTR pValueName, LPWSTR lpInBuffer,
339                                           DWORD cbInBuffer, LPWSTR lpOutBuffer,
340                                           DWORD cbOutBuffer, LPDWORD lpcbReturned);
341  WINBOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
342                                    DWORD reserved);
343  WINBOOL (WINAPI *pfnXcvOpenPort)(LPCWSTR pszObject, ACCESS_MASK GrantedAccess, PHANDLE phXcv);
344  DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
345                                 PBYTE pInputData, DWORD cbInputData,
346                                 PBYTE pOutputData, DWORD cbOutputData,
347                                 PDWORD pcbOutputNeeded);
348  WINBOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
349} MONITOR, *LPMONITOR;
350
351typedef struct _MONITOREX {
352  DWORD dwMonitorSize;
353  MONITOR Monitor;
354} MONITOREX, *LPMONITOREX;
355
356typedef struct _MONITOR2 {
357  DWORD cbSize;
358  WINBOOL (WINAPI *pfnEnumPorts)(HANDLE hMonitor, LPWSTR pName, DWORD Level, LPBYTE pPorts,
359                              DWORD cbBuf, LPDWORD pcbNeeded,
360                              LPDWORD pcReturned);
361  WINBOOL (WINAPI *pfnOpenPort)(HANDLE hMonitor, LPWSTR pName, PHANDLE pHandle);
362  WINBOOL (WINAPI *pfnOpenPortEx)(HANDLE hMonitor, HANDLE hMonitorPort, LPWSTR pPortName, LPWSTR pPrinterName,
363                               PHANDLE pHandle, struct _MONITOR2 *pMonitor2);
364  WINBOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
365                                 DWORD JobId, DWORD Level, LPBYTE pDocInfo);
366  WINBOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
367                              LPDWORD pcbWritten);
368  WINBOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
369                             LPDWORD pcbRead);
370  WINBOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
371  WINBOOL (WINAPI *pfnClosePort)(HANDLE hPort);
372  WINBOOL (WINAPI *pfnAddPort)(HANDLE hMonitor, LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
373  WINBOOL (WINAPI *pfnAddPortEx)(HANDLE hMonitor, LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
374                              LPWSTR lpMonitorName);
375  WINBOOL (WINAPI *pfnConfigurePort)(HANDLE hMonitor, LPWSTR pName, HWND hWnd, LPWSTR pPortName);
376  WINBOOL (WINAPI *pfnDeletePort)(HANDLE hMonitor, LPWSTR pName, HWND hWnd, LPWSTR pPortName);
377  WINBOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
378                                           LPWSTR pValueName, LPWSTR lpInBuffer,
379                                           DWORD cbInBuffer, LPWSTR lpOutBuffer,
380                                           DWORD cbOutBuffer, LPDWORD lpcbReturned);
381  WINBOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
382                                    DWORD reserved);
383  WINBOOL (WINAPI *pfnXcvOpenPort)(HANDLE hMonitor, LPCWSTR pszObject,
384                                ACCESS_MASK GrantedAccess, PHANDLE phXcv);
385  DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
386                                 PBYTE pInputData, DWORD cbInputData,
387                                 PBYTE pOutputData, DWORD cbOutputData,
388                                 PDWORD pcbOutputNeeded);
389  WINBOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
390  VOID (WINAPI *pfnShutdown)(HANDLE hMonitor);
391#if (NTDDI_VERSION >= NTDDI_WINXP)
392 DWORD (WINAPI *pfnSendRecvBidiDataFromPort)(HANDLE hPort, DWORD dwAccessBit,
393                                             LPCWSTR pAction,
394                                             PBIDI_REQUEST_CONTAINER pReqData,
395                                             PBIDI_RESPONSE_CONTAINER *ppResData);
396#endif
397#if (NTDDI_VERSION >= NTDDI_WIN7)
398  DWORD (WINAPI *pfnNotifyUsedPorts)(HANDLE hMonitor, DWORD cPorts,
399                                   PCWSTR *ppszPorts);
400
401  DWORD (WINAPI *pfnNotifyUnusedPorts)(HANDLE hMonitor, DWORD cPorts,
402                                       PCWSTR *ppszPorts);
403#endif
404} MONITOR2, *LPMONITOR2, *PMONITOR2;
405
406typedef struct _MONITORUI {
407  DWORD dwMonitorUISize;
408  WINBOOL (WINAPI *pfnAddPortUI)(PCWSTR pszServer, HWND hWnd,
409                              PCWSTR pszPortNameIn, PWSTR *ppszPortNameOut);
410  WINBOOL (WINAPI *pfnConfigurePortUI)(PCWSTR pName, HWND hWnd, PCWSTR pPortName);
411  WINBOOL (WINAPI *pfnDeletePortUI)(PCWSTR pszServer, HWND hWnd, PCWSTR pszPortName);
412} MONITORUI, *PMONITORUI;
413
414#if (NTDDI_VERSION >= NTDDI_WINXP)
415
416typedef enum {
417  kMessageBox = 0
418} UI_TYPE;
419
420typedef struct {
421  DWORD cbSize;
422  LPWSTR pTitle;
423  LPWSTR pMessage;
424  DWORD Style;
425  DWORD dwTimeout;
426  WINBOOL bWait;
427} MESSAGEBOX_PARAMS, *PMESSAGEBOX_PARAMS;
428
429typedef struct {
430  UI_TYPE UIType;
431  MESSAGEBOX_PARAMS MessageBoxParams;
432} SHOWUIPARAMS, *PSHOWUIPARAMS;
433
434#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
435
436#if (NTDDI_VERSION >= NTDDI_WS03)
437#ifndef __ATTRIBUTE_INFO_3__
438#define __ATTRIBUTE_INFO_3__
439typedef struct _ATTRIBUTE_INFO_3 {
440  DWORD dwJobNumberOfPagesPerSide;
441  DWORD dwDrvNumberOfPagesPerSide;
442  DWORD dwNupBorderFlags;
443  DWORD dwJobPageOrderFlags;
444  DWORD dwDrvPageOrderFlags;
445  DWORD dwJobNumberOfCopies;
446  DWORD dwDrvNumberOfCopies;
447  DWORD dwColorOptimization;
448  short dmPrintQuality;
449  short dmYResolution;
450} ATTRIBUTE_INFO_3, *PATTRIBUTE_INFO_3;
451#endif /* __ATTRIBUTE_INFO_3__ */
452#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
453
454#if (NTDDI_VERSION >= NTDDI_VISTA)
455
456typedef WINBOOL
457(CALLBACK *ROUTER_NOTIFY_CALLBACK)(
458  DWORD dwCommand,
459  PVOID pContext,
460  DWORD dwColor,
461  PPRINTER_NOTIFY_INFO pNofityInfo,
462  DWORD fdwFlags,
463  PDWORD pdwResult);
464
465typedef enum _NOTIFICATION_CALLBACK_COMMANDS {
466  NOTIFICATION_COMMAND_NOTIFY,
467  NOTIFICATION_COMMAND_CONTEXT_ACQUIRE,
468  NOTIFICATION_COMMAND_CONTEXT_RELEASE
469} NOTIFICATION_CALLBACK_COMMANDS;
470
471typedef struct _NOTIFICATION_CONFIG_1 {
472  UINT cbSize;
473  DWORD fdwFlags;
474  ROUTER_NOTIFY_CALLBACK pfnNotifyCallback;
475  PVOID pContext;
476} NOTIFICATION_CONFIG_1, *PNOTIFICATION_CONFIG_1;
477
478typedef enum _NOTIFICATION_CONFIG_FLAGS {
479  NOTIFICATION_CONFIG_CREATE_EVENT = 1 << 0,
480  NOTIFICATION_CONFIG_REGISTER_CALLBACK = 1 << 1,
481  NOTIFICATION_CONFIG_EVENT_TRIGGER = 1 << 2,
482  NOTIFICATION_CONFIG_ASYNC_CHANNEL = 1 << 3
483} NOTIFICATION_CONFIG_FLAGS;
484
485typedef struct _SPLCLIENT_INFO_3 {
486  UINT cbSize;
487  DWORD dwFlags;
488  DWORD dwSize;
489  PWSTR pMachineName;
490  PWSTR pUserName;
491  DWORD dwBuildNum;
492  DWORD dwMajorVersion;
493  DWORD dwMinorVersion;
494  WORD wProcessorArchitecture;
495  UINT64 hSplPrinter;
496} SPLCLIENT_INFO_3, *PSPLCLIENT_INFO_3, *LPSPLCLIENT_INFO_3;
497
498#ifndef __ATTRIBUTE_INFO_4__
499#define __ATTRIBUTE_INFO_4__
500
501typedef struct _ATTRIBUTE_INFO_4 {
502  DWORD dwJobNumberOfPagesPerSide;
503  DWORD dwDrvNumberOfPagesPerSide;
504  DWORD dwNupBorderFlags;
505  DWORD dwJobPageOrderFlags;
506  DWORD dwDrvPageOrderFlags;
507  DWORD dwJobNumberOfCopies;
508  DWORD dwDrvNumberOfCopies;
509  DWORD dwColorOptimization;
510  short dmPrintQuality;
511  short dmYResolution;
512  DWORD dwDuplexFlags;
513  DWORD dwNupDirection;
514  DWORD dwBookletFlags;
515  DWORD dwScalingPercentX;
516  DWORD dwScalingPercentY;
517} ATTRIBUTE_INFO_4, *PATTRIBUTE_INFO_4;
518
519#define REVERSE_PAGES_FOR_REVERSE_DUPLEX (0x00000001)
520#define DONT_SEND_EXTRA_PAGES_FOR_DUPLEX (0x00000001 << 1)
521
522#define RIGHT_THEN_DOWN                  (0x00000001)
523#define DOWN_THEN_RIGHT                  (0x00000001 << 1)
524#define LEFT_THEN_DOWN                   (0x00000001 << 2)
525#define DOWN_THEN_LEFT                   (0x00000001 << 3)
526
527#define BOOKLET_EDGE_LEFT                0x00000000
528#define BOOKLET_EDGE_RIGHT               0x00000001
529
530#endif /* __ATTRIBUTE_INFO_4__ */
531
532#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
533
534#if (OSVER(NTDDI_VERSION) == NTDDI_W2K)
535typedef SPLCLIENT_INFO_2_W2K SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
536#elif ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) || (OSVER(NTDDI_VERSION) == NTDDI_WS03))
537typedef SPLCLIENT_INFO_2_WINXP SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
538#else
539typedef SPLCLIENT_INFO_2_LONGHORN SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
540#endif /* (OSVER(NTDDI_VERSION) == NTDDI_W2K) */
541
542WINBOOL
543WINAPI
544InitializePrintProvidor(
545  LPPRINTPROVIDOR pPrintProvidor,
546  DWORD cbPrintProvidor,
547  LPWSTR pFullRegistryPath);
548
549HANDLE
550WINAPI
551OpenPrintProcessor(
552  LPWSTR pPrinterName,
553  PPRINTPROCESSOROPENDATA pPrintProcessorOpenData);
554
555WINBOOL
556WINAPI
557PrintDocumentOnPrintProcessor(
558  HANDLE hPrintProcessor,
559  LPWSTR pDocumentName);
560
561WINBOOL
562WINAPI
563ClosePrintProcessor(
564  HANDLE hPrintProcessor);
565
566WINBOOL
567WINAPI
568ControlPrintProcessor(
569  HANDLE hPrintProcessor,
570  DWORD Command);
571
572DWORD
573WINAPI
574GetPrintProcessorCapabilities(
575  LPTSTR pValueName,
576  DWORD dwAttributes,
577  LPBYTE pData,
578  DWORD nSize,
579  LPDWORD pcbNeeded);
580
581WINBOOL
582WINAPI
583InitializeMonitor(
584  LPWSTR pRegistryRoot);
585
586WINBOOL
587WINAPI
588OpenPort(
589  LPWSTR pName,
590  PHANDLE pHandle);
591
592WINBOOL
593WINAPI
594WritePort(
595  HANDLE hPort,
596  LPBYTE pBuffer,
597  DWORD cbBuf,
598  LPDWORD pcbWritten);
599
600WINBOOL
601WINAPI
602ReadPort(
603  HANDLE hPort,
604  LPBYTE pBuffer,
605  DWORD cbBuffer,
606  LPDWORD pcbRead);
607
608WINBOOL
609WINAPI
610ClosePort(
611  HANDLE hPort);
612
613WINBOOL
614WINAPI
615XcvOpenPort(
616  LPCWSTR pszObject,
617  ACCESS_MASK GrantedAccess,
618  PHANDLE phXcv);
619
620DWORD
621WINAPI
622XcvDataPort(
623  HANDLE hXcv,
624  LPCWSTR pszDataName,
625  PBYTE pInputData,
626  DWORD cbInputData,
627  PBYTE pOutputData,
628  DWORD cbOutputData,
629  PDWORD pcbOutputNeeded);
630
631WINBOOL
632WINAPI
633XcvClosePort(
634  HANDLE hXcv);
635
636WINBOOL
637WINAPI
638AddPortUI(
639  PCWSTR pszServer,
640  HWND hWnd,
641  PCWSTR pszMonitorNameIn,
642  PWSTR *ppszPortNameOut);
643
644WINBOOL
645WINAPI
646ConfigurePortUI(
647  PCWSTR pszServer,
648  HWND hWnd,
649  PCWSTR pszPortName);
650
651WINBOOL
652WINAPI
653DeletePortUI(
654  PCWSTR pszServer,
655  HWND hWnd,
656  PCWSTR pszPortName);
657
658WINBOOL
659WINAPI
660SplDeleteSpoolerPortStart(
661  PCWSTR pPortName);
662
663WINBOOL
664WINAPI
665SplDeleteSpoolerPortEnd(
666  PCWSTR pName,
667  WINBOOL bDeletePort);
668
669WINBOOL
670WINAPI
671SpoolerCopyFileEvent(
672  LPWSTR pszPrinterName,
673  LPWSTR pszKey,
674  DWORD dwCopyFileEvent);
675
676DWORD
677WINAPI
678GenerateCopyFilePaths(
679  LPCWSTR pszPrinterName,
680  LPCWSTR pszDirectory,
681  LPBYTE pSplClientInfo,
682  DWORD dwLevel,
683  LPWSTR pszSourceDir,
684  LPDWORD pcchSourceDirSize,
685  LPWSTR pszTargetDir,
686  LPDWORD pcchTargetDirSize,
687  DWORD dwFlags);
688
689HANDLE WINAPI CreatePrinterIC(HANDLE hPrinter, LPDEVMODEW pDevMode);
690WINBOOL WINAPI PlayGdiScriptOnPrinterIC(HANDLE hPrinterIC, LPBYTE pIn,
691                                     DWORD cIn, LPBYTE pOut, DWORD cOut, DWORD ul);
692WINBOOL WINAPI DeletePrinterIC(HANDLE hPrinterIC);
693WINBOOL WINAPI DevQueryPrint(HANDLE hPrinter, LPDEVMODEW pDevMode, DWORD *pResID);
694HANDLE WINAPI RevertToPrinterSelf(VOID);
695WINBOOL WINAPI ImpersonatePrinterClient(HANDLE hToken);
696WINBOOL WINAPI ReplyPrinterChangeNotification(HANDLE hNotify, DWORD fdwFlags,
697                                           PDWORD pdwResult, PVOID pPrinterNotifyInfo);
698WINBOOL WINAPI ReplyPrinterChangeNotificationEx(HANDLE hNotify, DWORD dwColor,
699                                             DWORD fdwFlags, PDWORD pdwResult,
700                                             PVOID pPrinterNotifyInfo);
701WINBOOL WINAPI PartialReplyPrinterChangeNotification(HANDLE hNotify,
702                                                  PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc);
703PPRINTER_NOTIFY_INFO WINAPI RouterAllocPrinterNotifyInfo(DWORD cPrinterNotifyInfoData);
704WINBOOL WINAPI RouterFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
705
706WINBOOL WINAPI AppendPrinterNotifyInfoData(PPRINTER_NOTIFY_INFO pInfoDest,
707                                        PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc,
708                                        DWORD fdwFlags);
709DWORD WINAPI CallRouterFindFirstPrinterChangeNotification(HANDLE hPrinter,
710                                                          DWORD fdwFlags,
711                                                          DWORD fdwOptions,
712                                                          HANDLE hNotify,
713                                                          PPRINTER_NOTIFY_OPTIONS pPrinterNotifyOptions);
714WINBOOL WINAPI ProvidorFindFirstPrinterChangeNotification(HANDLE hPrinter,
715                                                       DWORD fdwFlags,
716                                                       DWORD fdwOptions,
717                                                       HANDLE hNotify,
718                                                       PVOID pvReserved0,
719                                                       PVOID pvReserved1);
720WINBOOL WINAPI ProvidorFindClosePrinterChangeNotification(HANDLE hPrinter);
721
722/* Spooler */
723WINBOOL WINAPI SpoolerFindFirstPrinterChangeNotification(HANDLE hPrinter,
724                                                      DWORD fdwFlags,
725                                                      DWORD fdwOptions,
726                                                      PHANDLE phEvent,
727                                                      PVOID pPrinterNotifyOptions,
728                                                      PVOID pvReserved);
729WINBOOL WINAPI SpoolerFindNextPrinterChangeNotification(HANDLE hPrinter,
730                                                     LPDWORD pfdwChange,
731                                                     PVOID pvReserved0,
732                                                     PVOID ppPrinterNotifyInfo);
733VOID WINAPI SpoolerFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
734WINBOOL WINAPI SpoolerFindClosePrinterChangeNotification(HANDLE hPrinter);
735
736/* Port monitor / Language monitor / Print monitor */
737LPMONITOR2 WINAPI InitializePrintMonitor2(PMONITORINIT pMonitorInit,
738                                          PHANDLE phMonitor);
739PMONITORUI WINAPI InitializePrintMonitorUI(VOID);
740LPMONITOREX WINAPI InitializePrintMonitor(LPWSTR pRegistryRoot);
741WINBOOL WINAPI InitializeMonitorEx(LPWSTR pRegistryRoot, LPMONITOR pMonitor);
742
743#if (NTDDI_VERSION >= NTDDI_WINXP)
744
745PBIDI_RESPONSE_CONTAINER WINAPI RouterAllocBidiResponseContainer(DWORD Count);
746PVOID WINAPI RouterAllocBidiMem(size_t NumBytes);
747DWORD WINAPI RouterFreeBidiResponseContainer(PBIDI_RESPONSE_CONTAINER pData);
748VOID WINAPI RouterFreeBidiMem(PVOID pMemPointer);
749
750WINBOOL
751WINAPI
752SplPromptUIInUsersSession(
753  HANDLE hPrinter,
754  DWORD JobId,
755  PSHOWUIPARAMS pUIParams,
756  DWORD *pResponse);
757
758DWORD
759WINAPI
760SplIsSessionZero(
761  HANDLE hPrinter,
762  DWORD JobId,
763  WINBOOL *pIsSessionZero);
764
765#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
766
767#if (NTDDI_VERSION >= NTDDI_WS03)
768WINBOOL
769WINAPI
770GetJobAttributes(
771  LPWSTR pPrinterName,
772  LPDEVMODEW pDevmode,
773  PATTRIBUTE_INFO_3 pAttributeInfo);
774#endif
775
776#if (NTDDI_VERSION >= NTDDI_VISTA)
777
778#define FILL_WITH_DEFAULTS   0x1
779
780WINBOOL
781WINAPI
782GetJobAttributesEx(
783  LPWSTR pPrinterName,
784  LPDEVMODEW pDevmode,
785  DWORD dwLevel,
786  LPBYTE pAttributeInfo,
787  DWORD nSize,
788  DWORD dwFlags);
789
790WINBOOL WINAPI SpoolerRefreshPrinterChangeNotification(HANDLE hPrinter,
791                                                    DWORD dwColor,
792                                                    PPRINTER_NOTIFY_OPTIONS pOptions,
793                                                    PPRINTER_NOTIFY_INFO *ppInfo);
794
795#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
796
797/* FIXME : The following declarations are not present in the official header */
798
799WINBOOL WINAPI OpenPrinterToken(PHANDLE phToken);
800WINBOOL WINAPI SetPrinterToken(HANDLE hToken);
801WINBOOL WINAPI ClosePrinterToken(HANDLE hToken);
802WINBOOL WINAPI InstallPrintProcessor(HWND hWnd);
803
804#ifdef __cplusplus
805}
806#endif
807