winapi_ui_automation/um/
winspool.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Winspool header file
7use shared::guiddef::GUID;
8use shared::minwindef::{
9    BOOL, BYTE, DWORD, FILETIME, FLOAT, LPBYTE, LPDWORD, LPHANDLE, LPVOID, MAX_PATH, PBYTE, PDWORD,
10    PULONG, PWORD, UINT, ULONG, WORD,
11};
12use shared::windef::{HWND, RECTL, SIZEL};
13use shared::winerror::ERROR_NOT_SUPPORTED;
14use um::minwinbase::SYSTEMTIME;
15use um::wingdi::{LPDEVMODEA, LPDEVMODEW, PDEVMODEA, PDEVMODEW};
16use um::winnt::{
17    ACCESS_MASK, CHAR, DWORDLONG, HANDLE, HRESULT, LANGID, LONG, LONGLONG, LPCSTR, LPCWSTR, LPSTR,
18    LPWSTR, PCWSTR, PSECURITY_DESCRIPTOR, PVOID, PWSTR, STANDARD_RIGHTS_EXECUTE,
19    STANDARD_RIGHTS_READ, STANDARD_RIGHTS_REQUIRED, STANDARD_RIGHTS_WRITE, WCHAR,
20};
21use vc::vcruntime::size_t;
22STRUCT!{struct PRINTER_INFO_1A {
23    Flags: DWORD,
24    pDescription: LPSTR,
25    pName: LPSTR,
26    pComment: LPSTR,
27}}
28pub type PPRINTER_INFO_1A = *mut PRINTER_INFO_1A;
29pub type LPPRINTER_INFO_1A = *mut PRINTER_INFO_1A;
30STRUCT!{struct PRINTER_INFO_1W {
31    Flags: DWORD,
32    pDescription: LPWSTR,
33    pName: LPWSTR,
34    pComment: LPWSTR,
35}}
36pub type PPRINTER_INFO_1W = *mut PRINTER_INFO_1W;
37pub type LPPRINTER_INFO_1W = *mut PRINTER_INFO_1W;
38STRUCT!{struct PRINTER_INFO_2A {
39    pServerName: LPSTR,
40    pPrinterName: LPSTR,
41    pShareName: LPSTR,
42    pPortName: LPSTR,
43    pDriverName: LPSTR,
44    pComment: LPSTR,
45    pLocation: LPSTR,
46    pDevMode: LPDEVMODEA,
47    pSepFile: LPSTR,
48    pPrintProcessor: LPSTR,
49    pDatatype: LPSTR,
50    pParameters: LPSTR,
51    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
52    Attributes: DWORD,
53    Priority: DWORD,
54    DefaultPriority: DWORD,
55    StartTime: DWORD,
56    UntilTime: DWORD,
57    Status: DWORD,
58    cJobs: DWORD,
59    AveragePPM: DWORD,
60}}
61pub type PPRINTER_INFO_2A = *mut PRINTER_INFO_2A;
62pub type LPPRINTER_INFO_2A = *mut PRINTER_INFO_2A;
63STRUCT!{struct PRINTER_INFO_2W {
64    pServerName: LPWSTR,
65    pPrinterName: LPWSTR,
66    pShareName: LPWSTR,
67    pPortName: LPWSTR,
68    pDriverName: LPWSTR,
69    pComment: LPWSTR,
70    pLocation: LPWSTR,
71    pDevMode: LPDEVMODEW,
72    pSepFile: LPWSTR,
73    pPrintProcessor: LPWSTR,
74    pDatatype: LPWSTR,
75    pParameters: LPWSTR,
76    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
77    Attributes: DWORD,
78    Priority: DWORD,
79    DefaultPriority: DWORD,
80    StartTime: DWORD,
81    UntilTime: DWORD,
82    Status: DWORD,
83    cJobs: DWORD,
84    AveragePPM: DWORD,
85}}
86pub type PPRINTER_INFO_2W = *mut PRINTER_INFO_2W;
87pub type LPPRINTER_INFO_2W = *mut PRINTER_INFO_2W;
88STRUCT!{struct PRINTER_INFO_3 {
89    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
90}}
91pub type PPRINTER_INFO_3 = *mut PRINTER_INFO_3;
92pub type LPPRINTER_INFO_3 = *mut PRINTER_INFO_3;
93STRUCT!{struct PRINTER_INFO_4A {
94    pPrinterName: LPSTR,
95    pServerName: LPSTR,
96    Attributes: DWORD,
97}}
98pub type PPRINTER_INFO_4A = *mut PRINTER_INFO_4A;
99pub type LPPRINTER_INFO_4A = *mut PRINTER_INFO_4A;
100STRUCT!{struct PRINTER_INFO_4W {
101    pPrinterName: LPWSTR,
102    pServerName: LPWSTR,
103    Attributes: DWORD,
104}}
105pub type PPRINTER_INFO_4W = *mut PRINTER_INFO_4W;
106pub type LPPRINTER_INFO_4W = *mut PRINTER_INFO_4W;
107STRUCT!{struct PRINTER_INFO_5A {
108    pPrinterName: LPSTR,
109    pPortName: LPSTR,
110    Attributes: DWORD,
111    DeviceNotSelectedTimeout: DWORD,
112    TransmissionRetryTimeout: DWORD,
113}}
114pub type PPRINTER_INFO_5A = *mut PRINTER_INFO_5A;
115pub type LPPRINTER_INFO_5A = *mut PRINTER_INFO_5A;
116STRUCT!{struct PRINTER_INFO_5W {
117    pPrinterName: LPWSTR,
118    pPortName: LPWSTR,
119    Attributes: DWORD,
120    DeviceNotSelectedTimeout: DWORD,
121    TransmissionRetryTimeout: DWORD,
122}}
123pub type PPRINTER_INFO_5W = *mut PRINTER_INFO_5W;
124pub type LPPRINTER_INFO_5W = *mut PRINTER_INFO_5W;
125STRUCT!{struct PRINTER_INFO_6 {
126    dwStatus: DWORD,
127}}
128pub type PPRINTER_INFO_6 = *mut PRINTER_INFO_6;
129pub type LPPRINTER_INFO_6 = *mut PRINTER_INFO_6;
130STRUCT!{struct PRINTER_INFO_7A {
131    pszObjectGUID: LPSTR,
132    dwAction: DWORD,
133}}
134pub type PPRINTER_INFO_7A = *mut PRINTER_INFO_7A;
135pub type LPPRINTER_INFO_7A = *mut PRINTER_INFO_7A;
136STRUCT!{struct PRINTER_INFO_7W {
137    pszObjectGUID: LPWSTR,
138    dwAction: DWORD,
139}}
140pub type PPRINTER_INFO_7W = *mut PRINTER_INFO_7W;
141pub type LPPRINTER_INFO_7W = *mut PRINTER_INFO_7W;
142pub const DSPRINT_PUBLISH: DWORD = 0x00000001;
143pub const DSPRINT_UPDATE: DWORD = 0x00000002;
144pub const DSPRINT_UNPUBLISH: DWORD = 0x00000004;
145pub const DSPRINT_REPUBLISH: DWORD = 0x00000008;
146pub const DSPRINT_PENDING: DWORD = 0x80000000;
147STRUCT!{struct PRINTER_INFO_8A {
148    pDevMode: LPDEVMODEA,
149}}
150pub type PPRINTER_INFO_8A = *mut PRINTER_INFO_8A;
151pub type LPPRINTER_INFO_8A = *mut PRINTER_INFO_8A;
152STRUCT!{struct PRINTER_INFO_8W {
153    pDevMode: LPDEVMODEW,
154}}
155pub type PPRINTER_INFO_8W = *mut PRINTER_INFO_8W;
156pub type LPPRINTER_INFO_8W = *mut PRINTER_INFO_8W;
157STRUCT!{struct PRINTER_INFO_9A {
158    pDevMode: LPDEVMODEA,
159}}
160pub type PPRINTER_INFO_9A = *mut PRINTER_INFO_9A;
161pub type LPPRINTER_INFO_9A = *mut PRINTER_INFO_9A;
162STRUCT!{struct PRINTER_INFO_9W {
163    pDevMode: LPDEVMODEW,
164}}
165pub type PPRINTER_INFO_9W = *mut PRINTER_INFO_9W;
166pub type LPPRINTER_INFO_9W = *mut PRINTER_INFO_9W;
167pub const PRINTER_CONTROL_PAUSE: DWORD = 1;
168pub const PRINTER_CONTROL_RESUME: DWORD = 2;
169pub const PRINTER_CONTROL_PURGE: DWORD = 3;
170pub const PRINTER_CONTROL_SET_STATUS: DWORD = 4;
171pub const PRINTER_STATUS_PAUSED: DWORD = 0x00000001;
172pub const PRINTER_STATUS_ERROR: DWORD = 0x00000002;
173pub const PRINTER_STATUS_PENDING_DELETION: DWORD = 0x00000004;
174pub const PRINTER_STATUS_PAPER_JAM: DWORD = 0x00000008;
175pub const PRINTER_STATUS_PAPER_OUT: DWORD = 0x00000010;
176pub const PRINTER_STATUS_MANUAL_FEED: DWORD = 0x00000020;
177pub const PRINTER_STATUS_PAPER_PROBLEM: DWORD = 0x00000040;
178pub const PRINTER_STATUS_OFFLINE: DWORD = 0x00000080;
179pub const PRINTER_STATUS_IO_ACTIVE: DWORD = 0x00000100;
180pub const PRINTER_STATUS_BUSY: DWORD = 0x00000200;
181pub const PRINTER_STATUS_PRINTING: DWORD = 0x00000400;
182pub const PRINTER_STATUS_OUTPUT_BIN_FULL: DWORD = 0x00000800;
183pub const PRINTER_STATUS_NOT_AVAILABLE: DWORD = 0x00001000;
184pub const PRINTER_STATUS_WAITING: DWORD = 0x00002000;
185pub const PRINTER_STATUS_PROCESSING: DWORD = 0x00004000;
186pub const PRINTER_STATUS_INITIALIZING: DWORD = 0x00008000;
187pub const PRINTER_STATUS_WARMING_UP: DWORD = 0x00010000;
188pub const PRINTER_STATUS_TONER_LOW: DWORD = 0x00020000;
189pub const PRINTER_STATUS_NO_TONER: DWORD = 0x00040000;
190pub const PRINTER_STATUS_PAGE_PUNT: DWORD = 0x00080000;
191pub const PRINTER_STATUS_USER_INTERVENTION: DWORD = 0x00100000;
192pub const PRINTER_STATUS_OUT_OF_MEMORY: DWORD = 0x00200000;
193pub const PRINTER_STATUS_DOOR_OPEN: DWORD = 0x00400000;
194pub const PRINTER_STATUS_SERVER_UNKNOWN: DWORD = 0x00800000;
195pub const PRINTER_STATUS_POWER_SAVE: DWORD = 0x01000000;
196pub const PRINTER_STATUS_SERVER_OFFLINE: DWORD = 0x02000000;
197pub const PRINTER_STATUS_DRIVER_UPDATE_NEEDED: DWORD = 0x04000000;
198pub const PRINTER_ATTRIBUTE_QUEUED: DWORD = 0x00000001;
199pub const PRINTER_ATTRIBUTE_DIRECT: DWORD = 0x00000002;
200pub const PRINTER_ATTRIBUTE_DEFAULT: DWORD = 0x00000004;
201pub const PRINTER_ATTRIBUTE_SHARED: DWORD = 0x00000008;
202pub const PRINTER_ATTRIBUTE_NETWORK: DWORD = 0x00000010;
203pub const PRINTER_ATTRIBUTE_HIDDEN: DWORD = 0x00000020;
204pub const PRINTER_ATTRIBUTE_LOCAL: DWORD = 0x00000040;
205pub const PRINTER_ATTRIBUTE_ENABLE_DEVQ: DWORD = 0x00000080;
206pub const PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS: DWORD = 0x00000100;
207pub const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST: DWORD = 0x00000200;
208pub const PRINTER_ATTRIBUTE_WORK_OFFLINE: DWORD = 0x00000400;
209pub const PRINTER_ATTRIBUTE_ENABLE_BIDI: DWORD = 0x00000800;
210pub const PRINTER_ATTRIBUTE_RAW_ONLY: DWORD = 0x00001000;
211pub const PRINTER_ATTRIBUTE_PUBLISHED: DWORD = 0x00002000;
212pub const PRINTER_ATTRIBUTE_FAX: DWORD = 0x00004000;
213pub const PRINTER_ATTRIBUTE_TS: DWORD = 0x00008000;
214pub const PRINTER_ATTRIBUTE_PUSHED_USER: DWORD = 0x00020000;
215pub const PRINTER_ATTRIBUTE_PUSHED_MACHINE: DWORD = 0x00040000;
216pub const PRINTER_ATTRIBUTE_MACHINE: DWORD = 0x00080000;
217pub const PRINTER_ATTRIBUTE_FRIENDLY_NAME: DWORD = 0x00100000;
218pub const PRINTER_ATTRIBUTE_TS_GENERIC_DRIVER: DWORD = 0x00200000;
219pub const PRINTER_ATTRIBUTE_PER_USER: DWORD = 0x00400000;
220pub const PRINTER_ATTRIBUTE_ENTERPRISE_CLOUD: DWORD = 0x00800000;
221pub const NO_PRIORITY: DWORD = 0;
222pub const MAX_PRIORITY: DWORD = 99;
223pub const MIN_PRIORITY: DWORD = 1;
224pub const DEF_PRIORITY: DWORD = 1;
225STRUCT!{struct JOB_INFO_1A {
226    JobId: DWORD,
227    pPrinterName: LPSTR,
228    pMachineName: LPSTR,
229    pUserName: LPSTR,
230    pDocument: LPSTR,
231    pDatatype: LPSTR,
232    pStatus: LPSTR,
233    Status: DWORD,
234    Priority: DWORD,
235    Position: DWORD,
236    TotalPages: DWORD,
237    PagesPrinted: DWORD,
238    Submitted: SYSTEMTIME,
239}}
240pub type PJOB_INFO_1A = *mut JOB_INFO_1A;
241pub type LPJOB_INFO_1A = *mut JOB_INFO_1A;
242STRUCT!{struct JOB_INFO_1W {
243    JobId: DWORD,
244    pPrinterName: LPWSTR,
245    pMachineName: LPWSTR,
246    pUserName: LPWSTR,
247    pDocument: LPWSTR,
248    pDatatype: LPWSTR,
249    pStatus: LPWSTR,
250    Status: DWORD,
251    Priority: DWORD,
252    Position: DWORD,
253    TotalPages: DWORD,
254    PagesPrinted: DWORD,
255    Submitted: SYSTEMTIME,
256}}
257pub type PJOB_INFO_1W = *mut JOB_INFO_1W;
258pub type LPJOB_INFO_1W = *mut JOB_INFO_1W;
259STRUCT!{struct JOB_INFO_2A {
260    JobId: DWORD,
261    pPrinterName: LPSTR,
262    pMachineName: LPSTR,
263    pUserName: LPSTR,
264    pDocument: LPSTR,
265    pNotifyName: LPSTR,
266    pDatatype: LPSTR,
267    pPrintProcessor: LPSTR,
268    pParameters: LPSTR,
269    pDriverName: LPSTR,
270    pDevMode: LPDEVMODEA,
271    pStatus: LPSTR,
272    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
273    Status: DWORD,
274    Priority: DWORD,
275    Position: DWORD,
276    StartTime: DWORD,
277    UntilTime: DWORD,
278    TotalPages: DWORD,
279    Size: DWORD,
280    Submitted: SYSTEMTIME,
281    Time: DWORD,
282    PagesPrinted: DWORD,
283}}
284pub type PJOB_INFO_2A = *mut JOB_INFO_2A;
285pub type LPJOB_INFO_2A = *mut JOB_INFO_2A;
286STRUCT!{struct JOB_INFO_2W {
287    JobId: DWORD,
288    pPrinterName: LPWSTR,
289    pMachineName: LPWSTR,
290    pUserName: LPWSTR,
291    pDocument: LPWSTR,
292    pNotifyName: LPWSTR,
293    pDatatype: LPWSTR,
294    pPrintProcessor: LPWSTR,
295    pParameters: LPWSTR,
296    pDriverName: LPWSTR,
297    pDevMode: LPDEVMODEW,
298    pStatus: LPWSTR,
299    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
300    Status: DWORD,
301    Priority: DWORD,
302    Position: DWORD,
303    StartTime: DWORD,
304    UntilTime: DWORD,
305    TotalPages: DWORD,
306    Size: DWORD,
307    Submitted: SYSTEMTIME,
308    Time: DWORD,
309    PagesPrinted: DWORD,
310}}
311pub type PJOB_INFO_2W = *mut JOB_INFO_2W;
312pub type LPJOB_INFO_2W = *mut JOB_INFO_2W;
313STRUCT!{struct JOB_INFO_3 {
314    JobId: DWORD,
315    NextJobId: DWORD,
316    Reserved: DWORD,
317}}
318pub type PJOB_INFO_3 = *mut JOB_INFO_3;
319pub type LPJOB_INFO_3 = *mut JOB_INFO_3;
320STRUCT!{struct JOB_INFO_4A {
321    JobId: DWORD,
322    pPrinterName: LPSTR,
323    pMachineName: LPSTR,
324    pUserName: LPSTR,
325    pDocument: LPSTR,
326    pNotifyName: LPSTR,
327    pDatatype: LPSTR,
328    pPrintProcessor: LPSTR,
329    pParameters: LPSTR,
330    pDriverName: LPSTR,
331    pDevMode: LPDEVMODEA,
332    pStatus: LPSTR,
333    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
334    Status: DWORD,
335    Priority: DWORD,
336    Position: DWORD,
337    StartTime: DWORD,
338    UntilTime: DWORD,
339    TotalPages: DWORD,
340    Size: DWORD,
341    Submitted: SYSTEMTIME,
342    Time: DWORD,
343    PagesPrinted: DWORD,
344    SizeHigh: LONG,
345}}
346pub type PJOB_INFO_4A = *mut JOB_INFO_4A;
347pub type LPJOB_INFO_4A = *mut JOB_INFO_4A;
348STRUCT!{struct JOB_INFO_4W {
349    JobId: DWORD,
350    pPrinterName: LPWSTR,
351    pMachineName: LPWSTR,
352    pUserName: LPWSTR,
353    pDocument: LPWSTR,
354    pNotifyName: LPWSTR,
355    pDatatype: LPWSTR,
356    pPrintProcessor: LPWSTR,
357    pParameters: LPWSTR,
358    pDriverName: LPWSTR,
359    pDevMode: LPDEVMODEW,
360    pStatus: LPWSTR,
361    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
362    Status: DWORD,
363    Priority: DWORD,
364    Position: DWORD,
365    StartTime: DWORD,
366    UntilTime: DWORD,
367    TotalPages: DWORD,
368    Size: DWORD,
369    Submitted: SYSTEMTIME,
370    Time: DWORD,
371    PagesPrinted: DWORD,
372    SizeHigh: LONG,
373}}
374pub type PJOB_INFO_4W = *mut JOB_INFO_4W;
375pub type LPJOB_INFO_4W = *mut JOB_INFO_4W;
376pub const JOB_CONTROL_PAUSE: DWORD = 1;
377pub const JOB_CONTROL_RESUME: DWORD = 2;
378pub const JOB_CONTROL_CANCEL: DWORD = 3;
379pub const JOB_CONTROL_RESTART: DWORD = 4;
380pub const JOB_CONTROL_DELETE: DWORD = 5;
381pub const JOB_CONTROL_SENT_TO_PRINTER: DWORD = 6;
382pub const JOB_CONTROL_LAST_PAGE_EJECTED: DWORD = 7;
383pub const JOB_STATUS_PAUSED: DWORD = 0x00000001;
384pub const JOB_STATUS_ERROR: DWORD = 0x00000002;
385pub const JOB_STATUS_DELETING: DWORD = 0x00000004;
386pub const JOB_STATUS_SPOOLING: DWORD = 0x00000008;
387pub const JOB_STATUS_PRINTING: DWORD = 0x00000010;
388pub const JOB_STATUS_OFFLINE: DWORD = 0x00000020;
389pub const JOB_STATUS_PAPEROUT: DWORD = 0x00000040;
390pub const JOB_STATUS_PRINTED: DWORD = 0x00000080;
391pub const JOB_STATUS_DELETED: DWORD = 0x00000100;
392pub const JOB_STATUS_BLOCKED_DEVQ: DWORD = 0x00000200;
393pub const JOB_STATUS_USER_INTERVENTION: DWORD = 0x00000400;
394pub const JOB_STATUS_RESTART: DWORD = 0x00000800;
395pub const JOB_POSITION_UNSPECIFIED: DWORD = 0;
396STRUCT!{struct ADDJOB_INFO_1A {
397    Path: LPSTR,
398    JobId: DWORD,
399}}
400pub type PADDJOB_INFO_1A = *mut ADDJOB_INFO_1A;
401pub type LPADDJOB_INFO_1A = *mut ADDJOB_INFO_1A;
402STRUCT!{struct ADDJOB_INFO_1W {
403    Path: LPWSTR,
404    JobId: DWORD,
405}}
406pub type PADDJOB_INFO_1W = *mut ADDJOB_INFO_1W;
407pub type LPADDJOB_INFO_1W = *mut ADDJOB_INFO_1W;
408STRUCT!{struct DRIVER_INFO_1A {
409    pName: LPSTR,
410}}
411pub type PDRIVER_INFO_1A = *mut DRIVER_INFO_1A;
412pub type LPDRIVER_INFO_1A = *mut DRIVER_INFO_1A;
413STRUCT!{struct DRIVER_INFO_1W {
414    pName: LPWSTR,
415}}
416pub type PDRIVER_INFO_1W = *mut DRIVER_INFO_1W;
417pub type LPDRIVER_INFO_1W = *mut DRIVER_INFO_1W;
418STRUCT!{struct DRIVER_INFO_2A {
419    cVersion: DWORD,
420    pName: LPSTR,
421    pEnvironment: LPSTR,
422    pDriverPath: LPSTR,
423    pDataFile: LPSTR,
424    pConfigFile: LPSTR,
425}}
426pub type PDRIVER_INFO_2A = *mut DRIVER_INFO_2A;
427pub type LPDRIVER_INFO_2A = *mut DRIVER_INFO_2A;
428STRUCT!{struct DRIVER_INFO_2W {
429    cVersion: DWORD,
430    pName: LPWSTR,
431    pEnvironment: LPWSTR,
432    pDriverPath: LPWSTR,
433    pDataFile: LPWSTR,
434    pConfigFile: LPWSTR,
435}}
436pub type PDRIVER_INFO_2W = *mut DRIVER_INFO_2W;
437pub type LPDRIVER_INFO_2W = *mut DRIVER_INFO_2W;
438STRUCT!{struct DRIVER_INFO_3A {
439    cVersion: DWORD,
440    pName: LPSTR,
441    pEnvironment: LPSTR,
442    pDriverPath: LPSTR,
443    pDataFile: LPSTR,
444    pConfigFile: LPSTR,
445    pHelpFile: LPSTR,
446    pDependentFiles: LPSTR,
447    pMonitorName: LPSTR,
448    pDefaultDataType: LPSTR,
449}}
450pub type PDRIVER_INFO_3A = *mut DRIVER_INFO_3A;
451pub type LPDRIVER_INFO_3A = *mut DRIVER_INFO_3A;
452STRUCT!{struct DRIVER_INFO_3W {
453    cVersion: DWORD,
454    pName: LPWSTR,
455    pEnvironment: LPWSTR,
456    pDriverPath: LPWSTR,
457    pDataFile: LPWSTR,
458    pConfigFile: LPWSTR,
459    pHelpFile: LPWSTR,
460    pDependentFiles: LPWSTR,
461    pMonitorName: LPWSTR,
462    pDefaultDataType: LPWSTR,
463}}
464pub type PDRIVER_INFO_3W = *mut DRIVER_INFO_3W;
465pub type LPDRIVER_INFO_3W = *mut DRIVER_INFO_3W;
466STRUCT!{struct DRIVER_INFO_4A {
467    cVersion: DWORD,
468    pName: LPSTR,
469    pEnvironment: LPSTR,
470    pDriverPath: LPSTR,
471    pDataFile: LPSTR,
472    pConfigFile: LPSTR,
473    pHelpFile: LPSTR,
474    pDependentFiles: LPSTR,
475    pMonitorName: LPSTR,
476    pDefaultDataType: LPSTR,
477    pszzPreviousNames: LPSTR,
478}}
479pub type PDRIVER_INFO_4A = *mut DRIVER_INFO_4A;
480pub type LPDRIVER_INFO_4A = *mut DRIVER_INFO_4A;
481STRUCT!{struct DRIVER_INFO_4W {
482    cVersion: DWORD,
483    pName: LPWSTR,
484    pEnvironment: LPWSTR,
485    pDriverPath: LPWSTR,
486    pDataFile: LPWSTR,
487    pConfigFile: LPWSTR,
488    pHelpFile: LPWSTR,
489    pDependentFiles: LPWSTR,
490    pMonitorName: LPWSTR,
491    pDefaultDataType: LPWSTR,
492    pszzPreviousNames: LPWSTR,
493}}
494pub type PDRIVER_INFO_4W = *mut DRIVER_INFO_4W;
495pub type LPDRIVER_INFO_4W = *mut DRIVER_INFO_4W;
496STRUCT!{struct DRIVER_INFO_5A {
497    cVersion: DWORD,
498    pName: LPSTR,
499    pEnvironment: LPSTR,
500    pDriverPath: LPSTR,
501    pDataFile: LPSTR,
502    pConfigFile: LPSTR,
503    dwDriverAttributes: DWORD,
504    dwConfigVersion: DWORD,
505    dwDriverVersion: DWORD,
506}}
507pub type PDRIVER_INFO_5A = *mut DRIVER_INFO_5A;
508pub type LPDRIVER_INFO_5A = *mut DRIVER_INFO_5A;
509STRUCT!{struct DRIVER_INFO_5W {
510    cVersion: DWORD,
511    pName: LPWSTR,
512    pEnvironment: LPWSTR,
513    pDriverPath: LPWSTR,
514    pDataFile: LPWSTR,
515    pConfigFile: LPWSTR,
516    dwDriverAttributes: DWORD,
517    dwConfigVersion: DWORD,
518    dwDriverVersion: DWORD,
519}}
520pub type PDRIVER_INFO_5W = *mut DRIVER_INFO_5W;
521pub type LPDRIVER_INFO_5W = *mut DRIVER_INFO_5W;
522STRUCT!{struct DRIVER_INFO_6A {
523    cVersion: DWORD,
524    pName: LPSTR,
525    pEnvironment: LPSTR,
526    pDriverPath: LPSTR,
527    pDataFile: LPSTR,
528    pConfigFile: LPSTR,
529    pHelpFile: LPSTR,
530    pDependentFiles: LPSTR,
531    pMonitorName: LPSTR,
532    pDefaultDataType: LPSTR,
533    pszzPreviousNames: LPSTR,
534    ftDriverDate: FILETIME,
535    dwlDriverVersion: DWORDLONG,
536    pszMfgName: LPSTR,
537    pszOEMUrl: LPSTR,
538    pszHardwareID: LPSTR,
539    pszProvider: LPSTR,
540}}
541pub type PDRIVER_INFO_6A = *mut DRIVER_INFO_6A;
542pub type LPDRIVER_INFO_6A = *mut DRIVER_INFO_6A;
543STRUCT!{struct DRIVER_INFO_6W {
544    cVersion: DWORD,
545    pName: LPWSTR,
546    pEnvironment: LPWSTR,
547    pDriverPath: LPWSTR,
548    pDataFile: LPWSTR,
549    pConfigFile: LPWSTR,
550    pHelpFile: LPWSTR,
551    pDependentFiles: LPWSTR,
552    pMonitorName: LPWSTR,
553    pDefaultDataType: LPWSTR,
554    pszzPreviousNames: LPWSTR,
555    ftDriverDate: FILETIME,
556    dwlDriverVersion: DWORDLONG,
557    pszMfgName: LPWSTR,
558    pszOEMUrl: LPWSTR,
559    pszHardwareID: LPWSTR,
560    pszProvider: LPWSTR,
561}}
562pub type PDRIVER_INFO_6W = *mut DRIVER_INFO_6W;
563pub type LPDRIVER_INFO_6W = *mut DRIVER_INFO_6W;
564pub const PRINTER_DRIVER_PACKAGE_AWARE: DWORD = 0x00000001;
565pub const PRINTER_DRIVER_XPS: DWORD = 0x00000002;
566pub const PRINTER_DRIVER_SANDBOX_ENABLED: DWORD = 0x00000004;
567pub const PRINTER_DRIVER_CLASS: DWORD = 0x00000008;
568pub const PRINTER_DRIVER_DERIVED: DWORD = 0x00000010;
569pub const PRINTER_DRIVER_NOT_SHAREABLE: DWORD = 0x00000020;
570pub const PRINTER_DRIVER_CATEGORY_FAX: DWORD = 0x00000040;
571pub const PRINTER_DRIVER_CATEGORY_FILE: DWORD = 0x00000080;
572pub const PRINTER_DRIVER_CATEGORY_VIRTUAL: DWORD = 0x00000100;
573pub const PRINTER_DRIVER_CATEGORY_SERVICE: DWORD = 0x00000200;
574pub const PRINTER_DRIVER_SOFT_RESET_REQUIRED: DWORD = 0x00000400;
575pub const PRINTER_DRIVER_SANDBOX_DISABLED: DWORD = 0x00000800;
576pub const PRINTER_DRIVER_CATEGORY_3D: DWORD = 0x00001000;
577pub const PRINTER_DRIVER_CATEGORY_CLOUD: DWORD = 0x00002000;
578STRUCT!{struct DRIVER_INFO_8A {
579    cVersion: DWORD,
580    pName: LPSTR,
581    pEnvironment: LPSTR,
582    pDriverPath: LPSTR,
583    pDataFile: LPSTR,
584    pConfigFile: LPSTR,
585    pHelpFile: LPSTR,
586    pDependentFiles: LPSTR,
587    pMonitorName: LPSTR,
588    pDefaultDataType: LPSTR,
589    pszzPreviousNames: LPSTR,
590    ftDriverDate: FILETIME,
591    dwlDriverVersion: DWORDLONG,
592    pszMfgName: LPSTR,
593    pszOEMUrl: LPSTR,
594    pszHardwareID: LPSTR,
595    pszProvider: LPSTR,
596    pszPrintProcessor: LPSTR,
597    pszVendorSetup: LPSTR,
598    pszzColorProfiles: LPSTR,
599    pszInfPath: LPSTR,
600    dwPrinterDriverAttributes: DWORD,
601    pszzCoreDriverDependencies: LPSTR,
602    ftMinInboxDriverVerDate: FILETIME,
603    dwlMinInboxDriverVerVersion: DWORDLONG,
604}}
605pub type PDRIVER_INFO_8A = *mut DRIVER_INFO_8A;
606pub type LPDRIVER_INFO_8A = *mut DRIVER_INFO_8A;
607STRUCT!{struct DRIVER_INFO_8W {
608    cVersion: DWORD,
609    pName: LPWSTR,
610    pEnvironment: LPWSTR,
611    pDriverPath: LPWSTR,
612    pDataFile: LPWSTR,
613    pConfigFile: LPWSTR,
614    pHelpFile: LPWSTR,
615    pDependentFiles: LPWSTR,
616    pMonitorName: LPWSTR,
617    pDefaultDataType: LPWSTR,
618    pszzPreviousNames: LPWSTR,
619    ftDriverDate: FILETIME,
620    dwlDriverVersion: DWORDLONG,
621    pszMfgName: LPWSTR,
622    pszOEMUrl: LPWSTR,
623    pszHardwareID: LPWSTR,
624    pszProvider: LPWSTR,
625    pszPrintProcessor: LPWSTR,
626    pszVendorSetup: LPWSTR,
627    pszzColorProfiles: LPWSTR,
628    pszInfPath: LPWSTR,
629    dwPrinterDriverAttributes: DWORD,
630    pszzCoreDriverDependencies: LPWSTR,
631    ftMinInboxDriverVerDate: FILETIME,
632    dwlMinInboxDriverVerVersion: DWORDLONG,
633}}
634pub type PDRIVER_INFO_8W = *mut DRIVER_INFO_8W;
635pub type LPDRIVER_INFO_8W = *mut DRIVER_INFO_8W;
636pub const DRIVER_KERNELMODE: DWORD = 0x00000001;
637pub const DRIVER_USERMODE: DWORD = 0x00000002;
638pub const DPD_DELETE_UNUSED_FILES: DWORD = 0x00000001;
639pub const DPD_DELETE_SPECIFIC_VERSION: DWORD = 0x00000002;
640pub const DPD_DELETE_ALL_FILES: DWORD = 0x00000004;
641pub const APD_STRICT_UPGRADE: DWORD = 0x00000001;
642pub const APD_STRICT_DOWNGRADE: DWORD = 0x00000002;
643pub const APD_COPY_ALL_FILES: DWORD = 0x00000004;
644pub const APD_COPY_NEW_FILES: DWORD = 0x00000008;
645pub const APD_COPY_FROM_DIRECTORY: DWORD = 0x00000010;
646STRUCT!{struct DOC_INFO_1A {
647    pDocName: LPSTR,
648    pOutputFile: LPSTR,
649    pDatatype: LPSTR,
650}}
651pub type PDOC_INFO_1A = *mut DOC_INFO_1A;
652pub type LPDOC_INFO_1A = *mut DOC_INFO_1A;
653STRUCT!{struct DOC_INFO_1W {
654    pDocName: LPWSTR,
655    pOutputFile: LPWSTR,
656    pDatatype: LPWSTR,
657}}
658pub type PDOC_INFO_1W = *mut DOC_INFO_1W;
659pub type LPDOC_INFO_1W = *mut DOC_INFO_1W;
660STRUCT!{struct FORM_INFO_1A {
661    Flags: DWORD,
662    pName: LPSTR,
663    Size: SIZEL,
664    ImageableArea: RECTL,
665}}
666pub type PFORM_INFO_1A = *mut FORM_INFO_1A;
667pub type LPFORM_INFO_1A = *mut FORM_INFO_1A;
668STRUCT!{struct FORM_INFO_1W {
669    Flags: DWORD,
670    pName: LPWSTR,
671    Size: SIZEL,
672    ImageableArea: RECTL,
673}}
674pub type PFORM_INFO_1W = *mut FORM_INFO_1W;
675pub type LPFORM_INFO_1W = *mut FORM_INFO_1W;
676pub const STRING_NONE: DWORD = 0x00000001;
677pub const STRING_MUIDLL: DWORD = 0x00000002;
678pub const STRING_LANGPAIR: DWORD = 0x00000004;
679pub const MAX_FORM_KEYWORD_LENGTH: usize = 63 + 1;
680STRUCT!{struct FORM_INFO_2A {
681    Flags: DWORD,
682    pName: LPCSTR,
683    Size: SIZEL,
684    ImageableArea: RECTL,
685    pKeyword: LPCSTR,
686    StringType: DWORD,
687    pMuiDll: LPCSTR,
688    dwResourceId: DWORD,
689    pDisplayName: LPCSTR,
690    wLangId: LANGID,
691}}
692pub type PFORM_INFO_2A = *mut FORM_INFO_2A;
693pub type LPFORM_INFO_2A = *mut FORM_INFO_2A;
694STRUCT!{struct FORM_INFO_2W {
695    Flags: DWORD,
696    pName: LPCWSTR,
697    Size: SIZEL,
698    ImageableArea: RECTL,
699    pKeyword: LPCSTR,
700    StringType: DWORD,
701    pMuiDll: LPCWSTR,
702    dwResourceId: DWORD,
703    pDisplayName: LPCWSTR,
704    wLangId: LANGID,
705}}
706pub type PFORM_INFO_2W = *mut FORM_INFO_2W;
707pub type LPFORM_INFO_2W = *mut FORM_INFO_2W;
708STRUCT!{struct DOC_INFO_2A {
709    pDocName: LPSTR,
710    pOutputFile: LPSTR,
711    pDatatype: LPSTR,
712    dwMode: DWORD,
713    JobId: DWORD,
714}}
715pub type PDOC_INFO_2A = *mut DOC_INFO_2A;
716pub type LPDOC_INFO_2A = *mut DOC_INFO_2A;
717STRUCT!{struct DOC_INFO_2W {
718    pDocName: LPWSTR,
719    pOutputFile: LPWSTR,
720    pDatatype: LPWSTR,
721    dwMode: DWORD,
722    JobId: DWORD,
723}}
724pub type PDOC_INFO_2W = *mut DOC_INFO_2W;
725pub type LPDOC_INFO_2W = *mut DOC_INFO_2W;
726pub const DI_CHANNEL: DWORD = 1;
727pub const DI_READ_SPOOL_JOB: DWORD = 3;
728STRUCT!{struct DOC_INFO_3A {
729    pDocName: LPSTR,
730    pOutputFile: LPSTR,
731    pDatatype: LPSTR,
732    dwFlags: DWORD,
733}}
734pub type PDOC_INFO_3A = *mut DOC_INFO_3A;
735pub type LPDOC_INFO_3A = *mut DOC_INFO_3A;
736STRUCT!{struct DOC_INFO_3W {
737    pDocName: LPWSTR,
738    pOutputFile: LPWSTR,
739    pDatatype: LPWSTR,
740    dwFlags: DWORD,
741}}
742pub type PDOC_INFO_3W = *mut DOC_INFO_3W;
743pub type LPDOC_INFO_3W = *mut DOC_INFO_3W;
744pub const DI_MEMORYMAP_WRITE: DWORD = 0x00000001;
745pub const FORM_USER: DWORD = 0x00000000;
746pub const FORM_BUILTIN: DWORD = 0x00000001;
747pub const FORM_PRINTER: DWORD = 0x00000002;
748STRUCT!{struct PRINTPROCESSOR_INFO_1A {
749    pName: LPSTR,
750}}
751pub type PPRINTPROCESSOR_INFO_1A = *mut PRINTPROCESSOR_INFO_1A;
752pub type LPPRINTPROCESSOR_INFO_1A = *mut PRINTPROCESSOR_INFO_1A;
753STRUCT!{struct PRINTPROCESSOR_INFO_1W {
754    pName: LPWSTR,
755}}
756pub type PPRINTPROCESSOR_INFO_1W = *mut PRINTPROCESSOR_INFO_1W;
757pub type LPPRINTPROCESSOR_INFO_1W = *mut PRINTPROCESSOR_INFO_1W;
758STRUCT!{struct PRINTPROCESSOR_CAPS_1 {
759    dwLevel: DWORD,
760    dwNupOptions: DWORD,
761    dwPageOrderFlags: DWORD,
762    dwNumberOfCopies: DWORD,
763}}
764pub type PPRINTPROCESSOR_CAPS_1 = *mut PRINTPROCESSOR_CAPS_1;
765STRUCT!{struct PRINTPROCESSOR_CAPS_2 {
766    dwLevel: DWORD,
767    dwNupOptions: DWORD,
768    dwPageOrderFlags: DWORD,
769    dwNumberOfCopies: DWORD,
770    dwDuplexHandlingCaps: DWORD,
771    dwNupDirectionCaps: DWORD,
772    dwNupBorderCaps: DWORD,
773    dwBookletHandlingCaps: DWORD,
774    dwScalingCaps: DWORD,
775}}
776pub type PPRINTPROCESSOR_CAPS_2 = *mut PRINTPROCESSOR_CAPS_2;
777pub const PPCAPS_RIGHT_THEN_DOWN: DWORD = 0x00000001;
778pub const PPCAPS_DOWN_THEN_RIGHT: DWORD = 0x00000001 << 1;
779pub const PPCAPS_LEFT_THEN_DOWN: DWORD = 0x00000001 << 2;
780pub const PPCAPS_DOWN_THEN_LEFT: DWORD = 0x00000001 << 3;
781pub const PPCAPS_BORDER_PRINT: DWORD = 0x00000001;
782pub const PPCAPS_BOOKLET_EDGE: DWORD = 0x00000001;
783pub const PPCAPS_REVERSE_PAGES_FOR_REVERSE_DUPLEX: DWORD = 0x00000001;
784pub const PPCAPS_DONT_SEND_EXTRA_PAGES_FOR_DUPLEX: DWORD = 0x00000001 << 1;
785pub const PPCAPS_SQUARE_SCALING: DWORD = 0x00000001;
786STRUCT!{struct PORT_INFO_1A {
787    pName: LPSTR,
788}}
789pub type PPORT_INFO_1A = *mut PORT_INFO_1A;
790pub type LPPORT_INFO_1A = *mut PORT_INFO_1A;
791STRUCT!{struct PORT_INFO_1W {
792    pName: LPWSTR,
793}}
794pub type PPORT_INFO_1W = *mut PORT_INFO_1W;
795pub type LPPORT_INFO_1W = *mut PORT_INFO_1W;
796STRUCT!{struct PORT_INFO_2A {
797    pPortName: LPSTR,
798    pMonitorName: LPSTR,
799    pDescription: LPSTR,
800    fPortType: DWORD,
801    Reserved: DWORD,
802}}
803pub type PPORT_INFO_2A = *mut PORT_INFO_2A;
804pub type LPPORT_INFO_2A = *mut PORT_INFO_2A;
805STRUCT!{struct PORT_INFO_2W {
806    pPortName: LPWSTR,
807    pMonitorName: LPWSTR,
808    pDescription: LPWSTR,
809    fPortType: DWORD,
810    Reserved: DWORD,
811}}
812pub type PPORT_INFO_2W = *mut PORT_INFO_2W;
813pub type LPPORT_INFO_2W = *mut PORT_INFO_2W;
814pub const PORT_TYPE_WRITE: DWORD = 0x0001;
815pub const PORT_TYPE_READ: DWORD = 0x0002;
816pub const PORT_TYPE_REDIRECTED: DWORD = 0x0004;
817pub const PORT_TYPE_NET_ATTACHED: DWORD = 0x0008;
818STRUCT!{struct PORT_INFO_3A {
819    dwStatus: DWORD,
820    pszStatus: LPSTR,
821    dwSeverity: DWORD,
822}}
823pub type PPORT_INFO_3A = *mut PORT_INFO_3A;
824pub type LPPORT_INFO_3A = *mut PORT_INFO_3A;
825STRUCT!{struct PORT_INFO_3W {
826    dwStatus: DWORD,
827    pszStatus: LPWSTR,
828    dwSeverity: DWORD,
829}}
830pub type PPORT_INFO_3W = *mut PORT_INFO_3W;
831pub type LPPORT_INFO_3W = *mut PORT_INFO_3W;
832pub const PORT_STATUS_TYPE_ERROR: DWORD = 1;
833pub const PORT_STATUS_TYPE_WARNING: DWORD = 2;
834pub const PORT_STATUS_TYPE_INFO: DWORD = 3;
835pub const PORT_STATUS_OFFLINE: DWORD = 1;
836pub const PORT_STATUS_PAPER_JAM: DWORD = 2;
837pub const PORT_STATUS_PAPER_OUT: DWORD = 3;
838pub const PORT_STATUS_OUTPUT_BIN_FULL: DWORD = 4;
839pub const PORT_STATUS_PAPER_PROBLEM: DWORD = 5;
840pub const PORT_STATUS_NO_TONER: DWORD = 6;
841pub const PORT_STATUS_DOOR_OPEN: DWORD = 7;
842pub const PORT_STATUS_USER_INTERVENTION: DWORD = 8;
843pub const PORT_STATUS_OUT_OF_MEMORY: DWORD = 9;
844pub const PORT_STATUS_TONER_LOW: DWORD = 10;
845pub const PORT_STATUS_WARMING_UP: DWORD = 11;
846pub const PORT_STATUS_POWER_SAVE: DWORD = 12;
847STRUCT!{struct MONITOR_INFO_1A {
848    pName: LPSTR,
849}}
850pub type PMONITOR_INFO_1A = *mut MONITOR_INFO_1A;
851pub type LPMONITOR_INFO_1A = *mut MONITOR_INFO_1A;
852STRUCT!{struct MONITOR_INFO_1W {
853    pName: LPWSTR,
854}}
855pub type PMONITOR_INFO_1W = *mut MONITOR_INFO_1W;
856pub type LPMONITOR_INFO_1W = *mut MONITOR_INFO_1W;
857STRUCT!{struct MONITOR_INFO_2A {
858    pName: LPSTR,
859    pEnvironment: LPSTR,
860    pDLLName: LPSTR,
861}}
862pub type PMONITOR_INFO_2A = *mut MONITOR_INFO_2A;
863pub type LPMONITOR_INFO_2A = *mut MONITOR_INFO_2A;
864STRUCT!{struct MONITOR_INFO_2W {
865    pName: LPWSTR,
866    pEnvironment: LPWSTR,
867    pDLLName: LPWSTR,
868}}
869pub type PMONITOR_INFO_2W = *mut MONITOR_INFO_2W;
870pub type LPMONITOR_INFO_2W = *mut MONITOR_INFO_2W;
871STRUCT!{struct DATATYPES_INFO_1A {
872    pName: LPSTR,
873}}
874pub type PDATATYPES_INFO_1A = *mut DATATYPES_INFO_1A;
875pub type LPDATATYPES_INFO_1A = *mut DATATYPES_INFO_1A;
876STRUCT!{struct DATATYPES_INFO_1W {
877    pName: LPWSTR,
878}}
879pub type PDATATYPES_INFO_1W = *mut DATATYPES_INFO_1W;
880pub type LPDATATYPES_INFO_1W = *mut DATATYPES_INFO_1W;
881STRUCT!{struct PRINTER_DEFAULTSA {
882    pDataType: LPSTR,
883    pDevMode: LPDEVMODEA,
884    DesiredAccess: ACCESS_MASK,
885}}
886pub type PPRINTER_DEFAULTSA = *mut PRINTER_DEFAULTSA;
887pub type LPPRINTER_DEFAULTSA = *mut PRINTER_DEFAULTSA;
888STRUCT!{struct PRINTER_DEFAULTSW {
889    pDataType: LPWSTR,
890    pDevMode: LPDEVMODEW,
891    DesiredAccess: ACCESS_MASK,
892}}
893pub type PPRINTER_DEFAULTSW = *mut PRINTER_DEFAULTSW;
894pub type LPPRINTER_DEFAULTSW = *mut PRINTER_DEFAULTSW;
895STRUCT!{struct PRINTER_ENUM_VALUESA {
896    pValueName: LPSTR,
897    cbValueName: DWORD,
898    dwType: DWORD,
899    pData: LPBYTE,
900    cbData: DWORD,
901}}
902pub type PPRINTER_ENUM_VALUESA = *mut PRINTER_ENUM_VALUESA;
903pub type LPPRINTER_ENUM_VALUESA = *mut PRINTER_ENUM_VALUESA;
904STRUCT!{struct PRINTER_ENUM_VALUESW {
905    pValueName: LPWSTR,
906    cbValueName: DWORD,
907    dwType: DWORD,
908    pData: LPBYTE,
909    cbData: DWORD,
910}}
911pub type PPRINTER_ENUM_VALUESW = *mut PRINTER_ENUM_VALUESW;
912pub type LPPRINTER_ENUM_VALUESW = *mut PRINTER_ENUM_VALUESW;
913extern "system" {
914    pub fn EnumPrintersA(
915        Flags: DWORD,
916        Name: LPSTR,
917        Level: DWORD,
918        pPrinterEnum: LPBYTE,
919        cbBuf: DWORD,
920        pcbNeeded: LPDWORD,
921        pcReturned: LPDWORD,
922    ) -> BOOL;
923    pub fn EnumPrintersW(
924        Flags: DWORD,
925        Name: LPWSTR,
926        Level: DWORD,
927        pPrinterEnum: LPBYTE,
928        cbBuf: DWORD,
929        pcbNeeded: LPDWORD,
930        pcReturned: LPDWORD,
931    ) -> BOOL;
932}
933pub const PRINTER_ENUM_DEFAULT: DWORD = 0x00000001;
934pub const PRINTER_ENUM_LOCAL: DWORD = 0x00000002;
935pub const PRINTER_ENUM_CONNECTIONS: DWORD = 0x00000004;
936pub const PRINTER_ENUM_FAVORITE: DWORD = 0x00000004;
937pub const PRINTER_ENUM_NAME: DWORD = 0x00000008;
938pub const PRINTER_ENUM_REMOTE: DWORD = 0x00000010;
939pub const PRINTER_ENUM_SHARED: DWORD = 0x00000020;
940pub const PRINTER_ENUM_NETWORK: DWORD = 0x00000040;
941pub const PRINTER_ENUM_EXPAND: DWORD = 0x00004000;
942pub const PRINTER_ENUM_CONTAINER: DWORD = 0x00008000;
943pub const PRINTER_ENUM_ICONMASK: DWORD = 0x00ff0000;
944pub const PRINTER_ENUM_ICON1: DWORD = 0x00010000;
945pub const PRINTER_ENUM_ICON2: DWORD = 0x00020000;
946pub const PRINTER_ENUM_ICON3: DWORD = 0x00040000;
947pub const PRINTER_ENUM_ICON4: DWORD = 0x00080000;
948pub const PRINTER_ENUM_ICON5: DWORD = 0x00100000;
949pub const PRINTER_ENUM_ICON6: DWORD = 0x00200000;
950pub const PRINTER_ENUM_ICON7: DWORD = 0x00400000;
951pub const PRINTER_ENUM_ICON8: DWORD = 0x00800000;
952pub const PRINTER_ENUM_HIDE: DWORD = 0x01000000;
953pub const PRINTER_ENUM_CATEGORY_ALL: DWORD = 0x02000000;
954pub const PRINTER_ENUM_CATEGORY_3D: DWORD = 0x04000000;
955pub const SPOOL_FILE_PERSISTENT: DWORD = 0x00000001;
956pub const SPOOL_FILE_TEMPORARY: DWORD = 0x00000002;
957extern "system" {
958    pub fn GetSpoolFileHandle(
959        hPrinter: HANDLE,
960    ) -> HANDLE;
961    pub fn CommitSpoolData(
962        hPrinter: HANDLE,
963        hSpoolFile: HANDLE,
964        cbCommit: DWORD,
965    ) -> HANDLE;
966    pub fn CloseSpoolFileHandle(
967        hPrinter: HANDLE,
968        hSpoolFile: HANDLE,
969    ) -> BOOL;
970    pub fn OpenPrinterA(
971        pPrinterName: LPSTR,
972        phPrinter: LPHANDLE,
973        pDefault: LPPRINTER_DEFAULTSA,
974    ) -> BOOL;
975    pub fn OpenPrinterW(
976        pPrinterName: LPWSTR,
977        phPrinter: LPHANDLE,
978        pDefault: LPPRINTER_DEFAULTSW,
979    ) -> BOOL;
980    pub fn ResetPrinterA(
981        hPrinter: HANDLE,
982        pDefault: LPPRINTER_DEFAULTSA,
983    ) -> BOOL;
984    pub fn ResetPrinterW(
985        hPrinter: HANDLE,
986        pDefault: LPPRINTER_DEFAULTSW,
987    ) -> BOOL;
988    pub fn SetJobA(
989        hPrinter: HANDLE,
990        JobId: DWORD,
991        Level: DWORD,
992        pJob: LPBYTE,
993        Command: DWORD,
994    ) -> BOOL;
995    pub fn SetJobW(
996        hPrinter: HANDLE,
997        JobId: DWORD,
998        Level: DWORD,
999        pJob: LPBYTE,
1000        Command: DWORD,
1001    ) -> BOOL;
1002    pub fn GetJobA(
1003        hPrinter: HANDLE,
1004        JobId: DWORD,
1005        Level: DWORD,
1006        pJob: LPBYTE,
1007        cbBuf: DWORD,
1008        pcbNeeded: LPDWORD,
1009    ) -> BOOL;
1010    pub fn GetJobW(
1011        hPrinter: HANDLE,
1012        JobId: DWORD,
1013        Level: DWORD,
1014        pJob: LPBYTE,
1015        cbBuf: DWORD,
1016        pcbNeeded: LPDWORD,
1017    ) -> BOOL;
1018    pub fn EnumJobsA(
1019        hPrinter: HANDLE,
1020        FirstJob: DWORD,
1021        NoJobs: DWORD,
1022        Level: DWORD,
1023        pJob: LPBYTE,
1024        cbBuf: DWORD,
1025        pcbNeeded: LPDWORD,
1026        pcReturned: LPDWORD,
1027    ) -> BOOL;
1028    pub fn EnumJobsW(
1029        hPrinter: HANDLE,
1030        FirstJob: DWORD,
1031        NoJobs: DWORD,
1032        Level: DWORD,
1033        pJob: LPBYTE,
1034        cbBuf: DWORD,
1035        pcbNeeded: LPDWORD,
1036        pcReturned: LPDWORD,
1037    ) -> BOOL;
1038    pub fn AddPrinterA(
1039        pName: LPSTR,
1040        Level: DWORD,
1041        pPrinter: LPBYTE,
1042    ) -> HANDLE;
1043    pub fn AddPrinterW(
1044        pName: LPWSTR,
1045        Level: DWORD,
1046        pPrinter: LPBYTE,
1047    ) -> HANDLE;
1048    pub fn DeletePrinter(
1049        hPrinter: HANDLE,
1050    ) -> BOOL;
1051    pub fn SetPrinterA(
1052        hPrinter: HANDLE,
1053        Level: DWORD,
1054        pPrinter: LPBYTE,
1055        Command: DWORD,
1056    ) -> BOOL;
1057    pub fn SetPrinterW(
1058        hPrinter: HANDLE,
1059        Level: DWORD,
1060        pPrinter: LPBYTE,
1061        Command: DWORD,
1062    ) -> BOOL;
1063    pub fn GetPrinterA(
1064        hPrinter: HANDLE,
1065        Level: DWORD,
1066        pPrinter: LPBYTE,
1067        cbBuf: DWORD,
1068        pcbNeeded: LPDWORD,
1069    ) -> BOOL;
1070    pub fn GetPrinterW(
1071        hPrinter: HANDLE,
1072        Level: DWORD,
1073        pPrinter: LPBYTE,
1074        cbBuf: DWORD,
1075        pcbNeeded: LPDWORD,
1076    ) -> BOOL;
1077    pub fn AddPrinterDriverA(
1078        pName: LPSTR,
1079        Level: DWORD,
1080        pDriverInfo: LPBYTE,
1081    ) -> BOOL;
1082    pub fn AddPrinterDriverW(
1083        pName: LPWSTR,
1084        Level: DWORD,
1085        pDriverInfo: LPBYTE,
1086    ) -> BOOL;
1087    pub fn AddPrinterDriverExA(
1088        pName: LPSTR,
1089        Level: DWORD,
1090        pDriverInfo: PBYTE,
1091        dwFileCopyFlags: DWORD,
1092    ) -> BOOL;
1093    pub fn AddPrinterDriverExW(
1094        pName: LPWSTR,
1095        Level: DWORD,
1096        pDriverInfo: PBYTE,
1097        dwFileCopyFlags: DWORD,
1098    ) -> BOOL;
1099    pub fn EnumPrinterDriversA(
1100        pName: LPSTR,
1101        pEnvironment: LPSTR,
1102        Level: DWORD,
1103        pDriverInfo: LPBYTE,
1104        cbBuf: DWORD,
1105        pcbNeeded: LPDWORD,
1106        pcReturned: LPDWORD,
1107    ) -> BOOL;
1108    pub fn EnumPrinterDriversW(
1109        pName: LPWSTR,
1110        pEnvironment: LPWSTR,
1111        Level: DWORD,
1112        pDriverInfo: LPBYTE,
1113        cbBuf: DWORD,
1114        pcbNeeded: LPDWORD,
1115        pcReturned: LPDWORD,
1116    ) -> BOOL;
1117    pub fn GetPrinterDriverA(
1118        hPrinter: HANDLE,
1119        pEnvironment: LPSTR,
1120        Level: DWORD,
1121        pDriverInfo: LPBYTE,
1122        cbBuf: DWORD,
1123        pcbNeeded: LPDWORD,
1124    ) -> BOOL;
1125    pub fn GetPrinterDriverW(
1126        hPrinter: HANDLE,
1127        pEnvironment: LPWSTR,
1128        Level: DWORD,
1129        pDriverInfo: LPBYTE,
1130        cbBuf: DWORD,
1131        pcbNeeded: LPDWORD,
1132    ) -> BOOL;
1133    pub fn GetPrinterDriverDirectoryA(
1134        pName: LPSTR,
1135        pEnvironment: LPSTR,
1136        Level: DWORD,
1137        pDriverDirectory: LPBYTE,
1138        cbBuf: DWORD,
1139        pcbNeeded: LPDWORD,
1140    ) -> BOOL;
1141    pub fn GetPrinterDriverDirectoryW(
1142        pName: LPWSTR,
1143        pEnvironment: LPWSTR,
1144        Level: DWORD,
1145        pDriverDirectory: LPBYTE,
1146        cbBuf: DWORD,
1147        pcbNeeded: LPDWORD,
1148    ) -> BOOL;
1149    pub fn DeletePrinterDriverA(
1150        pName: LPSTR,
1151        pEnvironment: LPSTR,
1152        pDriverName: LPSTR,
1153    ) -> BOOL;
1154    pub fn DeletePrinterDriverW(
1155        pName: LPWSTR,
1156        pEnvironment: LPWSTR,
1157        pDriverName: LPWSTR,
1158    ) -> BOOL;
1159    pub fn DeletePrinterDriverExA(
1160        pName: LPSTR,
1161        pEnvironment: LPSTR,
1162        pDriverName: LPSTR,
1163        dwDeleteFlag: DWORD,
1164        dwVersionFlag: DWORD,
1165    ) -> BOOL;
1166    pub fn DeletePrinterDriverExW(
1167        pName: LPWSTR,
1168        pEnvironment: LPWSTR,
1169        pDriverName: LPWSTR,
1170        dwDeleteFlag: DWORD,
1171        dwVersionFlag: DWORD,
1172    ) -> BOOL;
1173    pub fn AddPrintProcessorA(
1174        pName: LPSTR,
1175        pEnvironment: LPSTR,
1176        pPathName: LPSTR,
1177        pPrintProcessorName: LPSTR,
1178    ) -> BOOL;
1179    pub fn AddPrintProcessorW(
1180        pName: LPWSTR,
1181        pEnvironment: LPWSTR,
1182        pPathName: LPWSTR,
1183        pPrintProcessorName: LPWSTR,
1184    ) -> BOOL;
1185    pub fn EnumPrintProcessorsA(
1186        pName: LPSTR,
1187        pEnvironment: LPSTR,
1188        Level: DWORD,
1189        pPrintProcessorInfo: LPBYTE,
1190        cbBuf: DWORD,
1191        pcbNeeded: LPDWORD,
1192        pcReturned: LPDWORD,
1193    ) -> BOOL;
1194    pub fn EnumPrintProcessorsW(
1195        pName: LPWSTR,
1196        pEnvironment: LPWSTR,
1197        Level: DWORD,
1198        pPrintProcessorInfo: LPBYTE,
1199        cbBuf: DWORD,
1200        pcbNeeded: LPDWORD,
1201        pcReturned: LPDWORD,
1202    ) -> BOOL;
1203    pub fn GetPrintProcessorDirectoryA(
1204        pName: LPSTR,
1205        pEnvironment: LPSTR,
1206        Level: DWORD,
1207        pPrintProcessorInfo: LPBYTE,
1208        cbBuf: DWORD,
1209        pcbNeeded: LPDWORD,
1210    ) -> BOOL;
1211    pub fn GetPrintProcessorDirectoryW(
1212        pName: LPWSTR,
1213        pEnvironment: LPWSTR,
1214        Level: DWORD,
1215        pPrintProcessorInfo: LPBYTE,
1216        cbBuf: DWORD,
1217        pcbNeeded: LPDWORD,
1218    ) -> BOOL;
1219    pub fn EnumPrintProcessorDatatypesA(
1220        pName: LPSTR,
1221        pPrintProcessorName: LPSTR,
1222        Level: DWORD,
1223        pDatatypes: LPBYTE,
1224        cbBuf: DWORD,
1225        pcbNeeded: LPDWORD,
1226        pcReturned: LPDWORD,
1227    ) -> BOOL;
1228    pub fn EnumPrintProcessorDatatypesW(
1229        pName: LPWSTR,
1230        pPrintProcessorName: LPWSTR,
1231        Level: DWORD,
1232        pDatatypes: LPBYTE,
1233        cbBuf: DWORD,
1234        pcbNeeded: LPDWORD,
1235        pcReturned: LPDWORD,
1236    ) -> BOOL;
1237    pub fn DeletePrintProcessorA(
1238        pName: LPSTR,
1239        pEnvironment: LPSTR,
1240        pPrintProcessorName: LPSTR,
1241    ) -> BOOL;
1242    pub fn DeletePrintProcessorW(
1243        pName: LPWSTR,
1244        pEnvironment: LPWSTR,
1245        pPrintProcessorName: LPWSTR,
1246    ) -> BOOL;
1247    pub fn StartDocPrinterA(
1248        hPrinter: HANDLE,
1249        Level: DWORD,
1250        pDocInfo: LPBYTE,
1251    ) -> DWORD;
1252    pub fn StartDocPrinterW(
1253        hPrinter: HANDLE,
1254        Level: DWORD,
1255        pDocInfo: LPBYTE,
1256    ) -> DWORD;
1257    pub fn StartPagePrinter(
1258        hPrinter: HANDLE,
1259    ) -> BOOL;
1260    pub fn WritePrinter(
1261        hPrinter: HANDLE,
1262        pBuf: LPVOID,
1263        cbBuf: DWORD,
1264        pcWritten: LPDWORD,
1265    ) -> BOOL;
1266    pub fn FlushPrinter(
1267        hPrinter: HANDLE,
1268        pBuf: LPVOID,
1269        cbBuf: DWORD,
1270        pcWritten: LPDWORD,
1271        cSleep: DWORD,
1272    ) -> BOOL;
1273    pub fn EndPagePrinter(
1274        hPrinter: HANDLE,
1275    ) -> BOOL;
1276    pub fn AbortPrinter(
1277        hPrinter: HANDLE,
1278    ) -> BOOL;
1279    pub fn ReadPrinter(
1280        hPrinter: HANDLE,
1281        pBuf: LPVOID,
1282        cbBuf: DWORD,
1283        pNoBytesRead: LPDWORD,
1284    ) -> BOOL;
1285    pub fn EndDocPrinter(
1286        hPrinter: HANDLE,
1287    ) -> BOOL;
1288    pub fn AddJobA(
1289        hPrinter: HANDLE,
1290        Level: DWORD,
1291        pData: LPBYTE,
1292        cbBuf: DWORD,
1293        pcbNeeded: LPDWORD,
1294    ) -> BOOL;
1295    pub fn AddJobW(
1296        hPrinter: HANDLE,
1297        Level: DWORD,
1298        pData: LPBYTE,
1299        cbBuf: DWORD,
1300        pcbNeeded: LPDWORD,
1301    ) -> BOOL;
1302    pub fn ScheduleJob(
1303        hPrinter: HANDLE,
1304        JobId: DWORD,
1305    ) -> BOOL;
1306    pub fn PrinterProperties(
1307        hWnd: HWND,
1308        hPrinter: HANDLE,
1309    ) -> BOOL;
1310    pub fn DocumentPropertiesA(
1311        hWnd: HWND,
1312        hPrinter: HANDLE,
1313        pDeviceName: LPSTR,
1314        pDevModeOutput: PDEVMODEA,
1315        pDevModeInput: PDEVMODEA,
1316        fMode: DWORD,
1317    ) -> LONG;
1318    pub fn DocumentPropertiesW(
1319        hWnd: HWND,
1320        hPrinter: HANDLE,
1321        pDeviceName: LPWSTR,
1322        pDevModeOutput: PDEVMODEW,
1323        pDevModeInput: PDEVMODEW,
1324        fMode: DWORD,
1325    ) -> LONG;
1326    pub fn AdvancedDocumentPropertiesA(
1327        hWnd: HWND,
1328        hPrinter: HANDLE,
1329        pDeviceName: LPSTR,
1330        pDevModeOutput: PDEVMODEA,
1331        pDevModeInput: PDEVMODEA,
1332    ) -> LONG;
1333    pub fn AdvancedDocumentPropertiesW(
1334        hWnd: HWND,
1335        hPrinter: HANDLE,
1336        pDeviceName: LPWSTR,
1337        pDevModeOutput: PDEVMODEW,
1338        pDevModeInput: PDEVMODEW,
1339    ) -> LONG;
1340    pub fn ExtDeviceMode(
1341        hWnd: HWND,
1342        hInst: HANDLE,
1343        pDevModeOutput: LPDEVMODEA,
1344        pDeviceName: LPSTR,
1345        pPort: LPSTR,
1346        pDevModeInput: LPDEVMODEA,
1347        pProfile: LPSTR,
1348        fMode: DWORD,
1349    ) -> LONG;
1350    pub fn GetPrinterDataA(
1351        hPrinter: HANDLE,
1352        pValueName: LPSTR,
1353        pType: LPDWORD,
1354        pData: LPBYTE,
1355        nSize: DWORD,
1356        pcbNeeded: LPDWORD,
1357    ) -> DWORD;
1358    pub fn GetPrinterDataW(
1359        hPrinter: HANDLE,
1360        pValueName: LPWSTR,
1361        pType: LPDWORD,
1362        pData: LPBYTE,
1363        nSize: DWORD,
1364        pcbNeeded: LPDWORD,
1365    ) -> DWORD;
1366    pub fn GetPrinterDataExA(
1367        hPrinter: HANDLE,
1368        pKeyName: LPCSTR,
1369        pValueName: LPCSTR,
1370        pType: LPDWORD,
1371        pData: LPBYTE,
1372        nSize: DWORD,
1373        pcbNeeded: LPDWORD,
1374    ) -> DWORD;
1375    pub fn GetPrinterDataExW(
1376        hPrinter: HANDLE,
1377        pKeyName: LPCWSTR,
1378        pValueName: LPCWSTR,
1379        pType: LPDWORD,
1380        pData: LPBYTE,
1381        nSize: DWORD,
1382        pcbNeeded: LPDWORD,
1383    ) -> DWORD;
1384    pub fn EnumPrinterDataA(
1385        hPrinter: HANDLE,
1386        dwIndex: DWORD,
1387        pValueName: LPSTR,
1388        cbValueName: DWORD,
1389        pcbValueName: LPDWORD,
1390        pType: LPDWORD,
1391        pData: LPBYTE,
1392        cbData: DWORD,
1393        pcbData: LPDWORD,
1394    ) -> DWORD;
1395    pub fn EnumPrinterDataW(
1396        hPrinter: HANDLE,
1397        dwIndex: DWORD,
1398        pValueName: LPWSTR,
1399        cbValueName: DWORD,
1400        pcbValueName: LPDWORD,
1401        pType: LPDWORD,
1402        pData: LPBYTE,
1403        cbData: DWORD,
1404        pcbData: LPDWORD,
1405    ) -> DWORD;
1406    pub fn EnumPrinterDataExA(
1407        hPrinter: HANDLE,
1408        pKeyName: LPCSTR,
1409        pEnumValues: LPBYTE,
1410        cbEnumValues: DWORD,
1411        pcbEnumValues: LPDWORD,
1412        pnEnumValues: LPDWORD,
1413    ) -> DWORD;
1414    pub fn EnumPrinterDataExW(
1415        hPrinter: HANDLE,
1416        pKeyName: LPCWSTR,
1417        pEnumValues: LPBYTE,
1418        cbEnumValues: DWORD,
1419        pcbEnumValues: LPDWORD,
1420        pnEnumValues: LPDWORD,
1421    ) -> DWORD;
1422    pub fn EnumPrinterKeyA(
1423        hPrinter: HANDLE,
1424        pKeyName: LPCSTR,
1425        pSubKey: LPSTR,
1426        cbSubkey: DWORD,
1427        pcbSubkey: LPDWORD,
1428    ) -> DWORD;
1429    pub fn EnumPrinterKeyW(
1430        hPrinter: HANDLE,
1431        pKeyName: LPCWSTR,
1432        pSubKey: LPWSTR,
1433        cbSubkey: DWORD,
1434        pcbSubkey: LPDWORD,
1435    ) -> DWORD;
1436    pub fn SetPrinterDataA(
1437        hPrinter: HANDLE,
1438        pValueName: LPSTR,
1439        Type: DWORD,
1440        pData: LPBYTE,
1441        cbData: DWORD,
1442    ) -> DWORD;
1443    pub fn SetPrinterDataW(
1444        hPrinter: HANDLE,
1445        pValueName: LPWSTR,
1446        Type: DWORD,
1447        pData: LPBYTE,
1448        cbData: DWORD,
1449    ) -> DWORD;
1450    pub fn SetPrinterDataExA(
1451        hPrinter: HANDLE,
1452        pKeyName: LPCSTR,
1453        pValueName: LPCSTR,
1454        Type: DWORD,
1455        pData: LPBYTE,
1456        cbData: DWORD,
1457    ) -> DWORD;
1458    pub fn SetPrinterDataExW(
1459        hPrinter: HANDLE,
1460        pKeyName: LPCWSTR,
1461        pValueName: LPCWSTR,
1462        Type: DWORD,
1463        pData: LPBYTE,
1464        cbData: DWORD,
1465    ) -> DWORD;
1466    pub fn DeletePrinterDataA(
1467        hPrinter: HANDLE,
1468        pValueName: LPSTR,
1469    ) -> DWORD;
1470    pub fn DeletePrinterDataW(
1471        hPrinter: HANDLE,
1472        pValueName: LPWSTR,
1473    ) -> DWORD;
1474    pub fn DeletePrinterDataExA(
1475        hPrinter: HANDLE,
1476        pKeyName: LPCSTR,
1477        pValueName: LPCSTR,
1478    ) -> DWORD;
1479    pub fn DeletePrinterDataExW(
1480        hPrinter: HANDLE,
1481        pKeyName: LPCWSTR,
1482        pValueName: LPCWSTR,
1483    ) -> DWORD;
1484    pub fn DeletePrinterKeyA(
1485        hPrinter: HANDLE,
1486        pKeyName: LPCSTR,
1487    ) -> DWORD;
1488    pub fn DeletePrinterKeyW(
1489        hPrinter: HANDLE,
1490        pKeyName: LPCWSTR,
1491    ) -> DWORD;
1492}
1493pub const PRINTER_NOTIFY_TYPE: DWORD = 0x00;
1494pub const JOB_NOTIFY_TYPE: DWORD = 0x01;
1495pub const SERVER_NOTIFY_TYPE: DWORD = 0x02;
1496pub const PRINTER_NOTIFY_FIELD_SERVER_NAME: DWORD = 0x00;
1497pub const PRINTER_NOTIFY_FIELD_PRINTER_NAME: DWORD = 0x01;
1498pub const PRINTER_NOTIFY_FIELD_SHARE_NAME: DWORD = 0x02;
1499pub const PRINTER_NOTIFY_FIELD_PORT_NAME: DWORD = 0x03;
1500pub const PRINTER_NOTIFY_FIELD_DRIVER_NAME: DWORD = 0x04;
1501pub const PRINTER_NOTIFY_FIELD_COMMENT: DWORD = 0x05;
1502pub const PRINTER_NOTIFY_FIELD_LOCATION: DWORD = 0x06;
1503pub const PRINTER_NOTIFY_FIELD_DEVMODE: DWORD = 0x07;
1504pub const PRINTER_NOTIFY_FIELD_SEPFILE: DWORD = 0x08;
1505pub const PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR: DWORD = 0x09;
1506pub const PRINTER_NOTIFY_FIELD_PARAMETERS: DWORD = 0x0A;
1507pub const PRINTER_NOTIFY_FIELD_DATATYPE: DWORD = 0x0B;
1508pub const PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR: DWORD = 0x0C;
1509pub const PRINTER_NOTIFY_FIELD_ATTRIBUTES: DWORD = 0x0D;
1510pub const PRINTER_NOTIFY_FIELD_PRIORITY: DWORD = 0x0E;
1511pub const PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY: DWORD = 0x0F;
1512pub const PRINTER_NOTIFY_FIELD_START_TIME: DWORD = 0x10;
1513pub const PRINTER_NOTIFY_FIELD_UNTIL_TIME: DWORD = 0x11;
1514pub const PRINTER_NOTIFY_FIELD_STATUS: DWORD = 0x12;
1515pub const PRINTER_NOTIFY_FIELD_STATUS_STRING: DWORD = 0x13;
1516pub const PRINTER_NOTIFY_FIELD_CJOBS: DWORD = 0x14;
1517pub const PRINTER_NOTIFY_FIELD_AVERAGE_PPM: DWORD = 0x15;
1518pub const PRINTER_NOTIFY_FIELD_TOTAL_PAGES: DWORD = 0x16;
1519pub const PRINTER_NOTIFY_FIELD_PAGES_PRINTED: DWORD = 0x17;
1520pub const PRINTER_NOTIFY_FIELD_TOTAL_BYTES: DWORD = 0x18;
1521pub const PRINTER_NOTIFY_FIELD_BYTES_PRINTED: DWORD = 0x19;
1522pub const PRINTER_NOTIFY_FIELD_OBJECT_GUID: DWORD = 0x1A;
1523pub const PRINTER_NOTIFY_FIELD_FRIENDLY_NAME: DWORD = 0x1B;
1524pub const PRINTER_NOTIFY_FIELD_BRANCH_OFFICE_PRINTING: DWORD = 0x1C;
1525pub const JOB_NOTIFY_FIELD_PRINTER_NAME: DWORD = 0x00;
1526pub const JOB_NOTIFY_FIELD_MACHINE_NAME: DWORD = 0x01;
1527pub const JOB_NOTIFY_FIELD_PORT_NAME: DWORD = 0x02;
1528pub const JOB_NOTIFY_FIELD_USER_NAME: DWORD = 0x03;
1529pub const JOB_NOTIFY_FIELD_NOTIFY_NAME: DWORD = 0x04;
1530pub const JOB_NOTIFY_FIELD_DATATYPE: DWORD = 0x05;
1531pub const JOB_NOTIFY_FIELD_PRINT_PROCESSOR: DWORD = 0x06;
1532pub const JOB_NOTIFY_FIELD_PARAMETERS: DWORD = 0x07;
1533pub const JOB_NOTIFY_FIELD_DRIVER_NAME: DWORD = 0x08;
1534pub const JOB_NOTIFY_FIELD_DEVMODE: DWORD = 0x09;
1535pub const JOB_NOTIFY_FIELD_STATUS: DWORD = 0x0A;
1536pub const JOB_NOTIFY_FIELD_STATUS_STRING: DWORD = 0x0B;
1537pub const JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR: DWORD = 0x0C;
1538pub const JOB_NOTIFY_FIELD_DOCUMENT: DWORD = 0x0D;
1539pub const JOB_NOTIFY_FIELD_PRIORITY: DWORD = 0x0E;
1540pub const JOB_NOTIFY_FIELD_POSITION: DWORD = 0x0F;
1541pub const JOB_NOTIFY_FIELD_SUBMITTED: DWORD = 0x10;
1542pub const JOB_NOTIFY_FIELD_START_TIME: DWORD = 0x11;
1543pub const JOB_NOTIFY_FIELD_UNTIL_TIME: DWORD = 0x12;
1544pub const JOB_NOTIFY_FIELD_TIME: DWORD = 0x13;
1545pub const JOB_NOTIFY_FIELD_TOTAL_PAGES: DWORD = 0x14;
1546pub const JOB_NOTIFY_FIELD_PAGES_PRINTED: DWORD = 0x15;
1547pub const JOB_NOTIFY_FIELD_TOTAL_BYTES: DWORD = 0x16;
1548pub const JOB_NOTIFY_FIELD_BYTES_PRINTED: DWORD = 0x17;
1549pub const JOB_NOTIFY_FIELD_REMOTE_JOB_ID: DWORD = 0x18;
1550pub const SERVER_NOTIFY_FIELD_PRINT_DRIVER_ISOLATION_GROUP: DWORD = 0x00;
1551pub const PRINTER_NOTIFY_CATEGORY_ALL: DWORD = 0x001000;
1552pub const PRINTER_NOTIFY_CATEGORY_3D: DWORD = 0x002000;
1553STRUCT!{struct PRINTER_NOTIFY_OPTIONS_TYPE {
1554    Type: WORD,
1555    Reserved0: WORD,
1556    Reserved1: DWORD,
1557    Reserved2: DWORD,
1558    Count: DWORD,
1559    pFields: PWORD,
1560}}
1561pub type PPRINTER_NOTIFY_OPTIONS_TYPE = *mut PRINTER_NOTIFY_OPTIONS_TYPE;
1562pub type LPPRINTER_NOTIFY_OPTIONS_TYPE = *mut PRINTER_NOTIFY_OPTIONS_TYPE;
1563pub const PRINTER_NOTIFY_OPTIONS_REFRESH: DWORD = 0x01;
1564STRUCT!{struct PRINTER_NOTIFY_OPTIONS {
1565    Version: DWORD,
1566    Flags: DWORD,
1567    Count: DWORD,
1568    pTypes: PPRINTER_NOTIFY_OPTIONS_TYPE,
1569}}
1570pub type PPRINTER_NOTIFY_OPTIONS = *mut PRINTER_NOTIFY_OPTIONS;
1571pub type LPPRINTER_NOTIFY_OPTIONS = *mut PRINTER_NOTIFY_OPTIONS;
1572pub const PRINTER_NOTIFY_INFO_DISCARDED: DWORD = 0x01;
1573STRUCT!{struct PRINTER_NOTIFY_INFO_DATA_NotifyData_Data {
1574    cbBuf: DWORD,
1575    pBuf: LPVOID,
1576}}
1577UNION!{union PRINTER_NOTIFY_INFO_DATA_NotifyData {
1578    [usize; 2],
1579    adwData adwData_mut: [DWORD; 2],
1580    Data Data_mut: PRINTER_NOTIFY_INFO_DATA_NotifyData_Data,
1581}}
1582STRUCT!{struct PRINTER_NOTIFY_INFO_DATA {
1583    Type: WORD,
1584    Field: WORD,
1585    Reserved: DWORD,
1586    Id: DWORD,
1587    NotifyData: PRINTER_NOTIFY_INFO_DATA_NotifyData,
1588}}
1589pub type PPRINTER_NOTIFY_INFO_DATA = *mut PRINTER_NOTIFY_INFO_DATA;
1590pub type LPPRINTER_NOTIFY_INFO_DATA = *mut PRINTER_NOTIFY_INFO_DATA;
1591STRUCT!{struct PRINTER_NOTIFY_INFO {
1592    Version: DWORD,
1593    Flags: DWORD,
1594    Count: DWORD,
1595    aData: [PRINTER_NOTIFY_INFO_DATA; 1],
1596}}
1597pub type PPRINTER_NOTIFY_INFO = *mut PRINTER_NOTIFY_INFO;
1598pub type LPPRINTER_NOTIFY_INFO = *mut PRINTER_NOTIFY_INFO;
1599STRUCT!{struct BINARY_CONTAINER {
1600    cbBuf: DWORD,
1601    pData: LPBYTE,
1602}}
1603pub type PBINARY_CONTAINER = *mut BINARY_CONTAINER;
1604UNION!{union BIDI_DATA_u {
1605    [usize; 2],
1606    bData bData_mut: BOOL,
1607    iData iData_mut: LONG,
1608    sData sData_mut: LPWSTR,
1609    fData fData_mut: FLOAT,
1610    biData biData_mut: BINARY_CONTAINER,
1611}}
1612STRUCT!{struct BIDI_DATA {
1613    dwBidiType: DWORD,
1614    u: BIDI_DATA_u,
1615}}
1616pub type PBIDI_DATA = *mut BIDI_DATA;
1617pub type LPBIDI_DATA = *mut BIDI_DATA;
1618STRUCT!{struct BIDI_REQUEST_DATA {
1619    dwReqNumber: DWORD,
1620    pSchema: LPWSTR,
1621    data: BIDI_DATA,
1622}}
1623pub type PBIDI_REQUEST_DATA = *mut BIDI_REQUEST_DATA;
1624pub type LPBIDI_REQUEST_DATA = *mut BIDI_REQUEST_DATA;
1625STRUCT!{struct BIDI_REQUEST_CONTAINER {
1626    Version: DWORD,
1627    Flags: DWORD,
1628    Count: DWORD,
1629    aData: [BIDI_REQUEST_DATA; 1],
1630}}
1631pub type PBIDI_REQUEST_CONTAINER = *mut BIDI_REQUEST_CONTAINER;
1632pub type LPBIDI_REQUEST_CONTAINER = *mut BIDI_REQUEST_CONTAINER;
1633STRUCT!{struct BIDI_RESPONSE_DATA {
1634    dwResult: DWORD,
1635    dwReqNumber: DWORD,
1636    pSchema: LPWSTR,
1637    data: BIDI_DATA,
1638}}
1639pub type PBIDI_RESPONSE_DATA = *mut BIDI_RESPONSE_DATA;
1640pub type LPBIDI_RESPONSE_DATA = *mut BIDI_RESPONSE_DATA;
1641STRUCT!{struct BIDI_RESPONSE_CONTAINER {
1642    Version: DWORD,
1643    Flags: DWORD,
1644    Count: DWORD,
1645    aData: [BIDI_RESPONSE_DATA; 1],
1646}}
1647pub type PBIDI_RESPONSE_CONTAINER = *mut BIDI_RESPONSE_CONTAINER;
1648pub type LPBIDI_RESPONSE_CONTAINER = *mut BIDI_RESPONSE_CONTAINER;
1649pub const BIDI_ACTION_ENUM_SCHEMA: &'static str = "EnumSchema";
1650pub const BIDI_ACTION_GET: &'static str = "Get";
1651pub const BIDI_ACTION_SET: &'static str = "Set";
1652pub const BIDI_ACTION_GET_ALL: &'static str = "GetAll";
1653pub const BIDI_ACTION_GET_WITH_ARGUMENT: &'static str = "GetWithArgument";
1654ENUM!{enum BIDI_TYPE {
1655    BIDI_NULL = 0,
1656    BIDI_INT = 1,
1657    BIDI_FLOAT = 2,
1658    BIDI_BOOL = 3,
1659    BIDI_STRING = 4,
1660    BIDI_TEXT = 5,
1661    BIDI_ENUM = 6,
1662    BIDI_BLOB = 7,
1663}}
1664pub const BIDI_ACCESS_ADMINISTRATOR: DWORD = 0x1;
1665pub const BIDI_ACCESS_USER: DWORD = 0x2;
1666pub const ERROR_BIDI_STATUS_OK: DWORD = 0;
1667pub const ERROR_BIDI_NOT_SUPPORTED: DWORD = ERROR_NOT_SUPPORTED;
1668pub const ERROR_BIDI_ERROR_BASE: DWORD = 13000;
1669pub const ERROR_BIDI_STATUS_WARNING: DWORD = ERROR_BIDI_ERROR_BASE + 1;
1670pub const ERROR_BIDI_SCHEMA_READ_ONLY: DWORD = ERROR_BIDI_ERROR_BASE + 2;
1671pub const ERROR_BIDI_SERVER_OFFLINE: DWORD = ERROR_BIDI_ERROR_BASE + 3;
1672pub const ERROR_BIDI_DEVICE_OFFLINE: DWORD = ERROR_BIDI_ERROR_BASE + 4;
1673pub const ERROR_BIDI_SCHEMA_NOT_SUPPORTED: DWORD = ERROR_BIDI_ERROR_BASE + 5;
1674pub const ERROR_BIDI_SET_DIFFERENT_TYPE: DWORD = ERROR_BIDI_ERROR_BASE + 6;
1675pub const ERROR_BIDI_SET_MULTIPLE_SCHEMAPATH: DWORD = ERROR_BIDI_ERROR_BASE + 7;
1676pub const ERROR_BIDI_SET_INVALID_SCHEMAPATH: DWORD = ERROR_BIDI_ERROR_BASE + 8;
1677pub const ERROR_BIDI_SET_UNKNOWN_FAILURE: DWORD = ERROR_BIDI_ERROR_BASE + 9;
1678pub const ERROR_BIDI_SCHEMA_WRITE_ONLY: DWORD = ERROR_BIDI_ERROR_BASE + 10;
1679pub const ERROR_BIDI_GET_REQUIRES_ARGUMENT: DWORD = ERROR_BIDI_ERROR_BASE + 11;
1680pub const ERROR_BIDI_GET_ARGUMENT_NOT_SUPPORTED: DWORD = ERROR_BIDI_ERROR_BASE + 12;
1681pub const ERROR_BIDI_GET_MISSING_ARGUMENT: DWORD = ERROR_BIDI_ERROR_BASE + 13;
1682pub const ERROR_BIDI_DEVICE_CONFIG_UNCHANGED: DWORD = ERROR_BIDI_ERROR_BASE + 14;
1683pub const ERROR_BIDI_NO_LOCALIZED_RESOURCES: DWORD = ERROR_BIDI_ERROR_BASE + 15;
1684pub const ERROR_BIDI_NO_BIDI_SCHEMA_EXTENSIONS: DWORD = ERROR_BIDI_ERROR_BASE + 16;
1685pub const ERROR_BIDI_UNSUPPORTED_CLIENT_LANGUAGE: DWORD = ERROR_BIDI_ERROR_BASE + 17;
1686pub const ERROR_BIDI_UNSUPPORTED_RESOURCE_FORMAT: DWORD = ERROR_BIDI_ERROR_BASE + 18;
1687extern "system" {
1688    pub fn WaitForPrinterChange(
1689        hPrinter: HANDLE,
1690        Flags: DWORD,
1691    ) -> DWORD;
1692    pub fn FindFirstPrinterChangeNotification(
1693        hPrinter: HANDLE,
1694        fdwFilter: DWORD,
1695        fdwOptions: DWORD,
1696        pPrinterNotifyOptions: LPVOID,
1697    ) -> HANDLE;
1698    pub fn FindNextPrinterChangeNotification(
1699        hChange: HANDLE,
1700        pdwChange: PDWORD,
1701        pPrinterNotifyOptions: LPVOID,
1702        ppPrinterNotifyInfo: *mut LPVOID,
1703    ) -> BOOL;
1704    pub fn FreePrinterNotifyInfo(
1705        pPrinterNotifyInfo: PPRINTER_NOTIFY_INFO,
1706    ) -> BOOL;
1707    pub fn FindClosePrinterChangeNotification(
1708        hChange: HANDLE,
1709    ) -> BOOL;
1710}
1711pub const PRINTER_CHANGE_ADD_PRINTER: DWORD = 0x00000001;
1712pub const PRINTER_CHANGE_SET_PRINTER: DWORD = 0x00000002;
1713pub const PRINTER_CHANGE_DELETE_PRINTER: DWORD = 0x00000004;
1714pub const PRINTER_CHANGE_FAILED_CONNECTION_PRINTER: DWORD = 0x00000008;
1715pub const PRINTER_CHANGE_PRINTER: DWORD = 0x000000FF;
1716pub const PRINTER_CHANGE_ADD_JOB: DWORD = 0x00000100;
1717pub const PRINTER_CHANGE_SET_JOB: DWORD = 0x00000200;
1718pub const PRINTER_CHANGE_DELETE_JOB: DWORD = 0x00000400;
1719pub const PRINTER_CHANGE_WRITE_JOB: DWORD = 0x00000800;
1720pub const PRINTER_CHANGE_JOB: DWORD = 0x0000FF00;
1721pub const PRINTER_CHANGE_ADD_FORM: DWORD = 0x00010000;
1722pub const PRINTER_CHANGE_SET_FORM: DWORD = 0x00020000;
1723pub const PRINTER_CHANGE_DELETE_FORM: DWORD = 0x00040000;
1724pub const PRINTER_CHANGE_FORM: DWORD = 0x00070000;
1725pub const PRINTER_CHANGE_ADD_PORT: DWORD = 0x00100000;
1726pub const PRINTER_CHANGE_CONFIGURE_PORT: DWORD = 0x00200000;
1727pub const PRINTER_CHANGE_DELETE_PORT: DWORD = 0x00400000;
1728pub const PRINTER_CHANGE_PORT: DWORD = 0x00700000;
1729pub const PRINTER_CHANGE_ADD_PRINT_PROCESSOR: DWORD = 0x01000000;
1730pub const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR: DWORD = 0x04000000;
1731pub const PRINTER_CHANGE_PRINT_PROCESSOR: DWORD = 0x07000000;
1732pub const PRINTER_CHANGE_SERVER: DWORD = 0x08000000;
1733pub const PRINTER_CHANGE_ADD_PRINTER_DRIVER: DWORD = 0x10000000;
1734pub const PRINTER_CHANGE_SET_PRINTER_DRIVER: DWORD = 0x20000000;
1735pub const PRINTER_CHANGE_DELETE_PRINTER_DRIVER: DWORD = 0x40000000;
1736pub const PRINTER_CHANGE_PRINTER_DRIVER: DWORD = 0x70000000;
1737pub const PRINTER_CHANGE_TIMEOUT: DWORD = 0x80000000;
1738pub const PRINTER_CHANGE_ALL: DWORD = 0x7F77FFFF;
1739extern "system" {
1740    pub fn PrinterMessageBoxA(
1741        hPrinter: HANDLE,
1742        Error: DWORD,
1743        hWnd: HWND,
1744        pText: LPSTR,
1745        pCaption: LPSTR,
1746        dwType: DWORD,
1747    ) -> DWORD;
1748    pub fn PrinterMessageBoxW(
1749        hPrinter: HANDLE,
1750        Error: DWORD,
1751        hWnd: HWND,
1752        pText: LPWSTR,
1753        pCaption: LPWSTR,
1754        dwType: DWORD,
1755    ) -> DWORD;
1756}
1757pub const PRINTER_ERROR_INFORMATION: DWORD = 0x80000000;
1758pub const PRINTER_ERROR_WARNING: DWORD = 0x40000000;
1759pub const PRINTER_ERROR_SEVERE: DWORD = 0x20000000;
1760pub const PRINTER_ERROR_OUTOFPAPER: DWORD = 0x00000001;
1761pub const PRINTER_ERROR_JAM: DWORD = 0x00000002;
1762pub const PRINTER_ERROR_OUTOFTONER: DWORD = 0x00000004;
1763extern "system" {
1764    pub fn ClosePrinter(
1765        hPrinter: HANDLE,
1766    ) -> BOOL;
1767    pub fn AddFormA(
1768        hPrinter: HANDLE,
1769        Level: DWORD,
1770        pForm: LPBYTE,
1771    ) -> BOOL;
1772    pub fn AddFormW(
1773        hPrinter: HANDLE,
1774        Level: DWORD,
1775        pForm: LPBYTE,
1776    ) -> BOOL;
1777    pub fn DeleteFormA(
1778        hPrinter: HANDLE,
1779        pFormName: LPSTR,
1780    ) -> BOOL;
1781    pub fn DeleteFormW(
1782        hPrinter: HANDLE,
1783        pFormName: LPWSTR,
1784    ) -> BOOL;
1785    pub fn GetFormA(
1786        hPrinter: HANDLE,
1787        pFormName: LPSTR,
1788        Level: DWORD,
1789        pForm: LPBYTE,
1790        cbBuf: DWORD,
1791        pcbNeeded: LPDWORD,
1792    ) -> BOOL;
1793    pub fn GetFormW(
1794        hPrinter: HANDLE,
1795        pFormName: LPWSTR,
1796        Level: DWORD,
1797        pForm: LPBYTE,
1798        cbBuf: DWORD,
1799        pcbNeeded: LPDWORD,
1800    ) -> BOOL;
1801    pub fn SetFormA(
1802        hPrinter: HANDLE,
1803        pFormName: LPSTR,
1804        Level: DWORD,
1805        pForm: LPBYTE,
1806    ) -> BOOL;
1807    pub fn SetFormW(
1808        hPrinter: HANDLE,
1809        pFormName: LPWSTR,
1810        Level: DWORD,
1811        pForm: LPBYTE,
1812    ) -> BOOL;
1813    pub fn EnumFormsA(
1814        hPrinter: HANDLE,
1815        Level: DWORD,
1816        pForm: LPBYTE,
1817        cbBuf: DWORD,
1818        pcbNeeded: LPDWORD,
1819        pcReturned: LPDWORD,
1820    ) -> BOOL;
1821    pub fn EnumFormsW(
1822        hPrinter: HANDLE,
1823        Level: DWORD,
1824        pForm: LPBYTE,
1825        cbBuf: DWORD,
1826        pcbNeeded: LPDWORD,
1827        pcReturned: LPDWORD,
1828    ) -> BOOL;
1829    pub fn EnumMonitorsA(
1830        pName: LPSTR,
1831        Level: DWORD,
1832        pMonitor: LPBYTE,
1833        cbBuf: DWORD,
1834        pcbNeeded: LPDWORD,
1835        pcReturned: LPDWORD,
1836    ) -> BOOL;
1837    pub fn EnumMonitorsW(
1838        pName: LPWSTR,
1839        Level: DWORD,
1840        pMonitor: LPBYTE,
1841        cbBuf: DWORD,
1842        pcbNeeded: LPDWORD,
1843        pcReturned: LPDWORD,
1844    ) -> BOOL;
1845    pub fn AddMonitorA(
1846        pName: LPSTR,
1847        Level: DWORD,
1848        pMonitors: LPBYTE,
1849    ) -> BOOL;
1850    pub fn AddMonitorW(
1851        pName: LPWSTR,
1852        Level: DWORD,
1853        pMonitors: LPBYTE,
1854    ) -> BOOL;
1855    pub fn DeleteMonitorA(
1856        pName: LPSTR,
1857        pEnvironment: LPSTR,
1858        pMonitorName: LPSTR,
1859    ) -> BOOL;
1860    pub fn DeleteMonitorW(
1861        pName: LPWSTR,
1862        pEnvironment: LPWSTR,
1863        pMonitorName: LPWSTR,
1864    ) -> BOOL;
1865    pub fn EnumPortsA(
1866        pName: LPSTR,
1867        Level: DWORD,
1868        pPort: LPBYTE,
1869        cbBuf: DWORD,
1870        pcbNeeded: LPDWORD,
1871        pcReturned: LPDWORD,
1872    ) -> BOOL;
1873    pub fn EnumPortsW(
1874        pName: LPWSTR,
1875        Level: DWORD,
1876        pPort: LPBYTE,
1877        cbBuf: DWORD,
1878        pcbNeeded: LPDWORD,
1879        pcReturned: LPDWORD,
1880    ) -> BOOL;
1881    pub fn AddPortA(
1882        pName: LPSTR,
1883        hWnd: HWND,
1884        pMonitorName: LPSTR,
1885    ) -> BOOL;
1886    pub fn AddPortW(
1887        pName: LPWSTR,
1888        hWnd: HWND,
1889        pMonitorName: LPWSTR,
1890    ) -> BOOL;
1891    pub fn ConfigurePortA(
1892        pName: LPSTR,
1893        hWnd: HWND,
1894        pPortName: LPSTR,
1895    ) -> BOOL;
1896    pub fn ConfigurePortW(
1897        pName: LPWSTR,
1898        hWnd: HWND,
1899        pPortName: LPWSTR,
1900    ) -> BOOL;
1901    pub fn DeletePortA(
1902        pName: LPSTR,
1903        hWnd: HWND,
1904        pPortName: LPSTR,
1905    ) -> BOOL;
1906    pub fn DeletePortW(
1907        pName: LPWSTR,
1908        hWnd: HWND,
1909        pPortName: LPWSTR,
1910    ) -> BOOL;
1911    pub fn XcvDataW(
1912        hXcv: HANDLE,
1913        pszDataName: PCWSTR,
1914        pInputData: PBYTE,
1915        cbInputData: DWORD,
1916        pOutputData: PBYTE,
1917        cbOutputData: DWORD,
1918        pcbOutputNeeded: PDWORD,
1919        pdwStatus: PDWORD,
1920    ) -> BOOL;
1921    pub fn GetDefaultPrinterA(
1922        pszBuffer: LPSTR,
1923        pcchBuffer: LPDWORD,
1924    ) -> BOOL;
1925    pub fn GetDefaultPrinterW(
1926        pszBuffer: LPWSTR,
1927        pcchBuffer: LPDWORD,
1928    ) -> BOOL;
1929    pub fn SetDefaultPrinterA(
1930        pszPrinter: LPCSTR,
1931    ) -> BOOL;
1932    pub fn SetDefaultPrinterW(
1933        pszPrinter: LPCWSTR,
1934    ) -> BOOL;
1935    pub fn SetPortA(
1936        pName: LPSTR,
1937        pPortName: LPSTR,
1938        dwLevel: DWORD,
1939        pPortInfo: LPBYTE,
1940    ) -> BOOL;
1941    pub fn SetPortW(pName: LPWSTR,
1942        pPortName: LPWSTR,
1943        dwLevel: DWORD,
1944        pPortInfo: LPBYTE,
1945    ) -> BOOL;
1946    pub fn AddPrinterConnectionA(
1947        pName: LPSTR,
1948    ) -> BOOL;
1949    pub fn AddPrinterConnectionW(
1950        pName: LPWSTR,
1951    ) -> BOOL;
1952    pub fn DeletePrinterConnectionA(
1953        pName: LPSTR,
1954    ) -> BOOL;
1955    pub fn DeletePrinterConnectionW(
1956        pName: LPWSTR,
1957    ) -> BOOL;
1958    pub fn ConnectToPrinterDlg(
1959        hwnd: HWND,
1960        Flags: DWORD,
1961    ) -> HANDLE;
1962}
1963STRUCT!{struct PROVIDOR_INFO_1A {
1964    pName: LPSTR,
1965    pEnvironment: LPSTR,
1966    pDLLName: LPSTR,
1967}}
1968pub type PPROVIDOR_INFO_1A = *mut PROVIDOR_INFO_1A;
1969pub type LPPROVIDOR_INFO_1A = *mut PROVIDOR_INFO_1A;
1970STRUCT!{struct PROVIDOR_INFO_1W {
1971    pName: LPWSTR,
1972    pEnvironment: LPWSTR,
1973    pDLLName: LPWSTR,
1974}}
1975pub type PPROVIDOR_INFO_1W = *mut PROVIDOR_INFO_1W;
1976pub type LPPROVIDOR_INFO_1W = *mut PROVIDOR_INFO_1W;
1977STRUCT!{struct PROVIDOR_INFO_2A {
1978    pOrder: LPSTR,
1979}}
1980pub type PPROVIDOR_INFO_2A = *mut PROVIDOR_INFO_2A;
1981pub type LPPROVIDOR_INFO_2A = *mut PROVIDOR_INFO_2A;
1982STRUCT!{struct PROVIDOR_INFO_2W {
1983    pOrder: LPWSTR,
1984}}
1985pub type PPROVIDOR_INFO_2W = *mut PROVIDOR_INFO_2W;
1986pub type LPPROVIDOR_INFO_2W = *mut PROVIDOR_INFO_2W;
1987extern "system" {
1988    pub fn AddPrintProvidorA(
1989        pName: LPSTR,
1990        Level: DWORD,
1991        pProvidorInfo: LPBYTE,
1992    ) -> BOOL;
1993    pub fn AddPrintProvidorW(
1994        pName: LPWSTR,
1995        Level: DWORD,
1996        pProvidorInfo: LPBYTE,
1997    ) -> BOOL;
1998    pub fn DeletePrintProvidorA(
1999        pName: LPSTR,
2000        pEnvironment: LPSTR,
2001        pPrintProvidorName: LPSTR,
2002    ) -> BOOL;
2003    pub fn DeletePrintProvidorW(
2004        pName: LPWSTR,
2005        pEnvironment: LPWSTR,
2006        pPrintProvidorName: LPWSTR,
2007    ) -> BOOL;
2008    pub fn IsValidDevmodeA(
2009        pDevmode: PDEVMODEA,
2010        DevmodeSize: size_t,
2011    ) -> BOOL;
2012    pub fn IsValidDevmodeW(
2013        pDevmode: PDEVMODEW,
2014        DevmodeSize: size_t,
2015    ) -> BOOL;
2016}
2017pub const SPLREG_DEFAULT_SPOOL_DIRECTORY: &'static str = "DefaultSpoolDirectory";
2018pub const SPLREG_PORT_THREAD_PRIORITY_DEFAULT: &'static str = "PortThreadPriorityDefault";
2019pub const SPLREG_PORT_THREAD_PRIORITY: &'static str = "PortThreadPriority";
2020pub const SPLREG_SCHEDULER_THREAD_PRIORITY_DEFAULT: &'static str
2021    = "SchedulerThreadPriorityDefault";
2022pub const SPLREG_SCHEDULER_THREAD_PRIORITY: &'static str = "SchedulerThreadPriority";
2023pub const SPLREG_BEEP_ENABLED: &'static str = "BeepEnabled";
2024pub const SPLREG_NET_POPUP: &'static str = "NetPopup";
2025pub const SPLREG_RETRY_POPUP: &'static str = "RetryPopup";
2026pub const SPLREG_NET_POPUP_TO_COMPUTER: &'static str = "NetPopupToComputer";
2027pub const SPLREG_EVENT_LOG: &'static str = "EventLog";
2028pub const SPLREG_MAJOR_VERSION: &'static str = "MajorVersion";
2029pub const SPLREG_MINOR_VERSION: &'static str = "MinorVersion";
2030pub const SPLREG_ARCHITECTURE: &'static str = "Architecture";
2031pub const SPLREG_OS_VERSION: &'static str = "OSVersion";
2032pub const SPLREG_OS_VERSIONEX: &'static str = "OSVersionEx";
2033pub const SPLREG_DS_PRESENT: &'static str = "DsPresent";
2034pub const SPLREG_DS_PRESENT_FOR_USER: &'static str = "DsPresentForUser";
2035pub const SPLREG_REMOTE_FAX: &'static str = "RemoteFax";
2036pub const SPLREG_RESTART_JOB_ON_POOL_ERROR: &'static str = "RestartJobOnPoolError";
2037pub const SPLREG_RESTART_JOB_ON_POOL_ENABLED: &'static str = "RestartJobOnPoolEnabled";
2038pub const SPLREG_DNS_MACHINE_NAME: &'static str = "DNSMachineName";
2039pub const SPLREG_ALLOW_USER_MANAGEFORMS: &'static str = "AllowUserManageForms";
2040pub const SPLREG_WEBSHAREMGMT: &'static str = "WebShareMgmt";
2041pub const SPLREG_PRINT_DRIVER_ISOLATION_GROUPS_SEPARATOR: &'static str = "\\";
2042pub const SPLREG_PRINT_DRIVER_ISOLATION_GROUPS: &'static str = "PrintDriverIsolationGroups";
2043pub const SPLREG_PRINT_DRIVER_ISOLATION_TIME_BEFORE_RECYCLE: &'static str
2044    = "PrintDriverIsolationTimeBeforeRecycle";
2045pub const SPLREG_PRINT_DRIVER_ISOLATION_MAX_OBJECTS_BEFORE_RECYCLE: &'static str
2046    = "PrintDriverIsolationMaxobjsBeforeRecycle";
2047pub const SPLREG_PRINT_DRIVER_ISOLATION_IDLE_TIMEOUT: &'static str
2048    = "PrintDriverIsolationIdleTimeout";
2049pub const SPLREG_PRINT_DRIVER_ISOLATION_EXECUTION_POLICY: &'static str
2050    = "PrintDriverIsolationExecutionPolicy";
2051pub const SPLREG_PRINT_DRIVER_ISOLATION_OVERRIDE_POLICY: &'static str
2052    = "PrintDriverIsolationOverrideCompat";
2053pub const SPLREG_PRINT_QUEUE_V4_DRIVER_DIRECTORY: &'static str = "PrintQueueV4DriverDirectory";
2054pub const SERVER_ACCESS_ADMINISTER: DWORD = 0x00000001;
2055pub const SERVER_ACCESS_ENUMERATE: DWORD = 0x00000002;
2056pub const PRINTER_ACCESS_ADMINISTER: DWORD = 0x00000004;
2057pub const PRINTER_ACCESS_USE: DWORD = 0x00000008;
2058pub const JOB_ACCESS_ADMINISTER: DWORD = 0x00000010;
2059pub const JOB_ACCESS_READ: DWORD = 0x00000020;
2060pub const PRINTER_ACCESS_MANAGE_LIMITED: DWORD = 0x00000040;
2061pub const SERVER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | SERVER_ACCESS_ADMINISTER
2062    | SERVER_ACCESS_ENUMERATE;
2063pub const SERVER_READ: DWORD = STANDARD_RIGHTS_READ | SERVER_ACCESS_ENUMERATE;
2064pub const SERVER_WRITE: DWORD = STANDARD_RIGHTS_WRITE | SERVER_ACCESS_ADMINISTER
2065    | SERVER_ACCESS_ENUMERATE;
2066pub const SERVER_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | SERVER_ACCESS_ENUMERATE;
2067pub const PRINTER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | PRINTER_ACCESS_ADMINISTER
2068    | PRINTER_ACCESS_USE;
2069pub const PRINTER_READ: DWORD = STANDARD_RIGHTS_READ | PRINTER_ACCESS_USE;
2070pub const PRINTER_WRITE: DWORD = STANDARD_RIGHTS_WRITE | PRINTER_ACCESS_USE;
2071pub const PRINTER_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | PRINTER_ACCESS_USE;
2072pub const JOB_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | JOB_ACCESS_ADMINISTER
2073    | JOB_ACCESS_READ;
2074pub const JOB_READ: DWORD = STANDARD_RIGHTS_READ | JOB_ACCESS_READ;
2075pub const JOB_WRITE: DWORD = STANDARD_RIGHTS_WRITE | JOB_ACCESS_ADMINISTER;
2076pub const JOB_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | JOB_ACCESS_ADMINISTER;
2077pub const SPLDS_SPOOLER_KEY: &'static str = "DsSpooler";
2078pub const SPLDS_DRIVER_KEY: &'static str = "DsDriver";
2079pub const SPLDS_USER_KEY: &'static str = "DsUser";
2080pub const SPLDS_ASSET_NUMBER: &'static str = "assetNumber";
2081pub const SPLDS_BYTES_PER_MINUTE: &'static str = "bytesPerMinute";
2082pub const SPLDS_DESCRIPTION: &'static str = "description";
2083pub const SPLDS_DRIVER_NAME: &'static str = "driverName";
2084pub const SPLDS_DRIVER_VERSION: &'static str = "driverVersion";
2085pub const SPLDS_LOCATION: &'static str = "location";
2086pub const SPLDS_PORT_NAME: &'static str = "portName";
2087pub const SPLDS_PRINT_ATTRIBUTES: &'static str = "printAttributes";
2088pub const SPLDS_PRINT_BIN_NAMES: &'static str = "printBinNames";
2089pub const SPLDS_PRINT_COLLATE: &'static str = "printCollate";
2090pub const SPLDS_PRINT_COLOR: &'static str = "printColor";
2091pub const SPLDS_PRINT_DUPLEX_SUPPORTED: &'static str = "printDuplexSupported";
2092pub const SPLDS_PRINT_END_TIME: &'static str = "printEndTime";
2093pub const SPLDS_PRINTER_CLASS: &'static str = "printQueue";
2094pub const SPLDS_PRINTER_NAME: &'static str = "printerName";
2095pub const SPLDS_PRINT_KEEP_PRINTED_JOBS: &'static str = "printKeepPrintedJobs";
2096pub const SPLDS_PRINT_LANGUAGE: &'static str = "printLanguage";
2097pub const SPLDS_PRINT_MAC_ADDRESS: &'static str = "printMACAddress";
2098pub const SPLDS_PRINT_MAX_X_EXTENT: &'static str = "printMaxXExtent";
2099pub const SPLDS_PRINT_MAX_Y_EXTENT: &'static str = "printMaxYExtent";
2100pub const SPLDS_PRINT_MAX_RESOLUTION_SUPPORTED: &'static str = "printMaxResolutionSupported";
2101pub const SPLDS_PRINT_MEDIA_READY: &'static str = "printMediaReady";
2102pub const SPLDS_PRINT_MEDIA_SUPPORTED: &'static str = "printMediaSupported";
2103pub const SPLDS_PRINT_MEMORY: &'static str = "printMemory";
2104pub const SPLDS_PRINT_MIN_X_EXTENT: &'static str = "printMinXExtent";
2105pub const SPLDS_PRINT_MIN_Y_EXTENT: &'static str = "printMinYExtent";
2106pub const SPLDS_PRINT_NETWORK_ADDRESS: &'static str = "printNetworkAddress";
2107pub const SPLDS_PRINT_NOTIFY: &'static str = "printNotify";
2108pub const SPLDS_PRINT_NUMBER_UP: &'static str = "printNumberUp";
2109pub const SPLDS_PRINT_ORIENTATIONS_SUPPORTED: &'static str = "printOrientationsSupported";
2110pub const SPLDS_PRINT_OWNER: &'static str = "printOwner";
2111pub const SPLDS_PRINT_PAGES_PER_MINUTE: &'static str = "printPagesPerMinute";
2112pub const SPLDS_PRINT_RATE: &'static str = "printRate";
2113pub const SPLDS_PRINT_RATE_UNIT: &'static str = "printRateUnit";
2114pub const SPLDS_PRINT_SEPARATOR_FILE: &'static str = "printSeparatorFile";
2115pub const SPLDS_PRINT_SHARE_NAME: &'static str = "printShareName";
2116pub const SPLDS_PRINT_SPOOLING: &'static str = "printSpooling";
2117pub const SPLDS_PRINT_STAPLING_SUPPORTED: &'static str = "printStaplingSupported";
2118pub const SPLDS_PRINT_START_TIME: &'static str = "printStartTime";
2119pub const SPLDS_PRINT_STATUS: &'static str = "printStatus";
2120pub const SPLDS_PRIORITY: &'static str = "priority";
2121pub const SPLDS_SERVER_NAME: &'static str = "serverName";
2122pub const SPLDS_SHORT_SERVER_NAME: &'static str = "shortServerName";
2123pub const SPLDS_UNC_NAME: &'static str = "uNCName";
2124pub const SPLDS_URL: &'static str = "url";
2125pub const SPLDS_FLAGS: &'static str = "flags";
2126pub const SPLDS_VERSION_NUMBER: &'static str = "versionNumber";
2127pub const SPLDS_PRINTER_NAME_ALIASES: &'static str = "printerNameAliases";
2128pub const SPLDS_PRINTER_LOCATIONS: &'static str = "printerLocations";
2129pub const SPLDS_PRINTER_MODEL: &'static str = "printerModel";
2130ENUM!{enum PRINTER_OPTION_FLAGS {
2131    PRINTER_OPTION_NO_CACHE = 1 << 0,
2132    PRINTER_OPTION_CACHE = 1 << 1,
2133    PRINTER_OPTION_CLIENT_CHANGE = 1 << 2,
2134    PRINTER_OPTION_NO_CLIENT_DATA = 1 << 3,
2135}}
2136STRUCT!{struct PRINTER_OPTIONSA {
2137    cbSize: UINT,
2138    dwFlags: DWORD,
2139}}
2140pub type PPRINTER_OPTIONSA = *mut PRINTER_OPTIONSA;
2141pub type LPPRINTER_OPTIONSA = *mut PRINTER_OPTIONSA;
2142STRUCT!{struct PRINTER_OPTIONSW {
2143    cbSize: UINT,
2144    dwFlags: DWORD,
2145}}
2146pub type PPRINTER_OPTIONSW = *mut PRINTER_OPTIONSW;
2147pub type LPPRINTER_OPTIONSW = *mut PRINTER_OPTIONSW;
2148extern "system" {
2149    pub fn OpenPrinter2A(
2150        pPrinterName: LPCSTR,
2151        phPrinter: LPHANDLE,
2152        pDefault: PPRINTER_DEFAULTSA,
2153        pOptions: PPRINTER_OPTIONSA,
2154    ) -> BOOL;
2155    pub fn OpenPrinter2W(
2156        pPrinterName: LPCWSTR,
2157        phPrinter: LPHANDLE,
2158        pDefault: PPRINTER_DEFAULTSW,
2159        pOptions: PPRINTER_OPTIONSW,
2160    ) -> BOOL;
2161}
2162pub const PRINTER_CONNECTION_MISMATCH: DWORD = 0x00000020;
2163pub const PRINTER_CONNECTION_NO_UI: DWORD = 0x00000040;
2164STRUCT!{struct PRINTER_CONNECTION_INFO_1A {
2165    dwFlags: DWORD,
2166    pszDriverName: LPSTR,
2167}}
2168pub type PPRINTER_CONNECTION_INFO_1A = *mut PRINTER_CONNECTION_INFO_1A;
2169pub type LPPRINTER_CONNECTION_INFO_1A = *mut PRINTER_CONNECTION_INFO_1A;
2170STRUCT!{struct PRINTER_CONNECTION_INFO_1W {
2171    dwFlags: DWORD,
2172    pszDriverName: LPWSTR,
2173}}
2174pub type PPRINTER_CONNECTION_INFO_1W = *mut PRINTER_CONNECTION_INFO_1W;
2175pub type LPPRINTER_CONNECTION_INFO_1W = *mut PRINTER_CONNECTION_INFO_1W;
2176extern "system" {
2177    pub fn AddPrinterConnection2A(
2178        hWnd: HWND,
2179        pszName: LPCSTR,
2180        dwLevel: DWORD,
2181        pConnectionInfo: PVOID,
2182    ) -> BOOL;
2183    pub fn AddPrinterConnection2W(
2184        hWnd: HWND,
2185        pszName: LPCWSTR,
2186        dwLevel: DWORD,
2187        pConnectionInfo: PVOID,
2188    ) -> BOOL;
2189}
2190pub const IPDFP_COPY_ALL_FILES: DWORD = 0x00000001;
2191extern "system" {
2192    pub fn InstallPrinterDriverFromPackageA(
2193        pszServer: LPCSTR,
2194        pszInfPath: LPCSTR,
2195        pszDriverName: LPCSTR,
2196        pszEnvironment: LPCSTR,
2197        dwFlags: DWORD,
2198    ) -> HRESULT;
2199    pub fn InstallPrinterDriverFromPackageW(
2200        pszServer: LPCWSTR,
2201        pszInfPath: LPCWSTR,
2202        pszDriverName: LPCWSTR,
2203        pszEnvironment: LPCWSTR,
2204        dwFlags: DWORD,
2205    ) -> HRESULT;
2206}
2207pub const UPDP_SILENT_UPLOAD: DWORD = 0x00000001;
2208pub const UPDP_UPLOAD_ALWAYS: DWORD = 0x00000002;
2209pub const UPDP_CHECK_DRIVERSTORE: DWORD = 0x00000004;
2210extern "system" {
2211    pub fn UploadPrinterDriverPackageA(
2212        pszServer: LPCSTR,
2213        pszInfPath: LPCSTR,
2214        pszEnvironment: LPCSTR,
2215        dwFlags: DWORD,
2216        hwnd: HWND,
2217        pszDestInfPath: LPSTR,
2218        pcchDestInfPath: PULONG,
2219    ) -> HRESULT;
2220    pub fn UploadPrinterDriverPackageW(
2221        pszServer: LPCWSTR,
2222        pszInfPath: LPCWSTR,
2223        pszEnvironment: LPCWSTR,
2224        dwFlags: DWORD,
2225        hwnd: HWND,
2226        pszDestInfPath: LPWSTR,
2227        pcchDestInfPath: PULONG,
2228    ) -> HRESULT;
2229}
2230STRUCT!{struct CORE_PRINTER_DRIVERA {
2231    CoreDriverGUID: GUID,
2232    ftDriverDate: FILETIME,
2233    dwlDriverVersion: DWORDLONG,
2234    szPackageID: [CHAR; MAX_PATH],
2235}}
2236pub type PCORE_PRINTER_DRIVERA = *mut CORE_PRINTER_DRIVERA;
2237STRUCT!{struct CORE_PRINTER_DRIVERW {
2238    CoreDriverGUID: GUID,
2239    ftDriverDate: FILETIME,
2240    dwlDriverVersion: DWORDLONG,
2241    szPackageID: [WCHAR; MAX_PATH],
2242}}
2243pub type PCORE_PRINTER_DRIVERW = *mut CORE_PRINTER_DRIVERW;
2244extern "system" {
2245    pub fn GetCorePrinterDriversA(
2246        pszServer: LPCSTR,
2247        pszEnvironment: LPCSTR,
2248        pszzCoreDriverDependencies: LPCSTR,
2249        cCorePrinterDrivers: DWORD,
2250        pCorePrinterDrivers: PCORE_PRINTER_DRIVERA,
2251    ) -> HRESULT;
2252    pub fn GetCorePrinterDriversW(
2253        pszServer: LPCWSTR,
2254        pszEnvironment: LPCWSTR,
2255        pszzCoreDriverDependencies: LPCWSTR,
2256        cCorePrinterDrivers: DWORD,
2257        pCorePrinterDrivers: PCORE_PRINTER_DRIVERW,
2258    ) -> HRESULT;
2259    pub fn CorePrinterDriverInstalledA(
2260        pszServer: LPCSTR,
2261        pszEnvironment: LPCSTR,
2262        CoreDriverGUID: GUID,
2263        ftDriverDate: FILETIME,
2264        dwlDriverVersion: DWORDLONG,
2265        pbDriverInstalled: *mut BOOL,
2266    ) -> HRESULT;
2267    pub fn CorePrinterDriverInstalledW(
2268        pszServer: LPCWSTR,
2269        pszEnvironment: LPCWSTR,
2270        CoreDriverGUID: GUID,
2271        ftDriverDate: FILETIME,
2272        dwlDriverVersion: DWORDLONG,
2273        pbDriverInstalled: *mut BOOL,
2274    ) -> HRESULT;
2275    pub fn GetPrinterDriverPackagePathA(
2276        pszServer: LPCSTR,
2277        pszEnvironment: LPCSTR,
2278        pszLanguage: LPCSTR,
2279        pszPackageID: LPCSTR,
2280        pszDriverPackageCab: LPSTR,
2281        cchDriverPackageCab: DWORD,
2282        pcchRequiredSize: LPDWORD,
2283    ) -> HRESULT;
2284    pub fn GetPrinterDriverPackagePathW(
2285        pszServer: LPCWSTR,
2286        pszEnvironment: LPCWSTR,
2287        pszLanguage: LPCWSTR,
2288        pszPackageID: LPCWSTR,
2289        pszDriverPackageCab: LPWSTR,
2290        cchDriverPackageCab: DWORD,
2291        pcchRequiredSize: LPDWORD,
2292    ) -> HRESULT;
2293    pub fn DeletePrinterDriverPackageA(
2294        pszServer: LPCSTR,
2295        pszInfPath: LPCSTR,
2296        pszEnvironment: LPCSTR,
2297    ) -> HRESULT;
2298    pub fn DeletePrinterDriverPackageW(
2299        pszServer: LPCWSTR,
2300        pszInfPath: LPCWSTR,
2301        pszEnvironment: LPCWSTR,
2302    ) -> HRESULT;
2303}
2304ENUM!{enum EPrintPropertyType {
2305    kPropertyTypeString = 1,
2306    kPropertyTypeInt32,
2307    kPropertyTypeInt64,
2308    kPropertyTypeByte,
2309    kPropertyTypeTime,
2310    kPropertyTypeDevMode,
2311    kPropertyTypeSD,
2312    kPropertyTypeNotificationReply,
2313    kPropertyTypeNotificationOptions,
2314    kPropertyTypeBuffer,
2315}}
2316ENUM!{enum EPrintXPSJobProgress {
2317    kAddingDocumentSequence = 0,
2318    kDocumentSequenceAdded = 1,
2319    kAddingFixedDocument = 2,
2320    kFixedDocumentAdded = 3,
2321    kAddingFixedPage = 4,
2322    kFixedPageAdded = 5,
2323    kResourceAdded = 6,
2324    kFontAdded = 7,
2325    kImageAdded = 8,
2326    kXpsDocumentCommitted = 9,
2327}}
2328ENUM!{enum EPrintXPSJobOperation {
2329    kJobProduction = 1,
2330    kJobConsumption,
2331}}
2332STRUCT!{struct PrintPropertyValue_value_propertyBlob {
2333    cbBuf: DWORD,
2334    pBuf: LPVOID,
2335}}
2336UNION!{union PrintPropertyValue_value {
2337    [u64; 1] [u64; 2],
2338    propertyByte propertyByte_mut: BYTE,
2339    propertyString propertyString_mut: PWSTR,
2340    propertyInt32 propertyInt32_mut: LONG,
2341    propertyInt64 propertyInt64_mut: LONGLONG,
2342    propertyBlob propertyBlob_mut: PrintPropertyValue_value_propertyBlob,
2343}}
2344STRUCT!{struct PrintPropertyValue {
2345    ePropertyType: EPrintPropertyType,
2346    value: PrintPropertyValue_value,
2347}}
2348STRUCT!{struct PrintNamedProperty {
2349    propertyName: *mut WCHAR,
2350    propertyValue: PrintPropertyValue,
2351}}
2352STRUCT!{struct PrintPropertiesCollection {
2353    numberOfProperties: ULONG,
2354    propertiesCollection: *mut PrintNamedProperty,
2355}}
2356extern "system" {
2357    pub fn ReportJobProcessingProgress(
2358        printerHandle: HANDLE,
2359        jobId: ULONG,
2360        jobOperation: EPrintXPSJobOperation,
2361        jobProgress: EPrintXPSJobProgress,
2362    ) -> HRESULT;
2363    pub fn GetPrinterDriver2A(
2364        hWnd: HWND,
2365        hPrinter: HANDLE,
2366        pEnvironment: LPSTR,
2367        Level: DWORD,
2368        pDriverInfo: LPBYTE,
2369        cbBuf: DWORD,
2370        pcbNeeded: LPDWORD,
2371    ) -> BOOL;
2372    pub fn GetPrinterDriver2W(
2373        hWnd: HWND,
2374        hPrinter: HANDLE,
2375        pEnvironment: LPWSTR,
2376        Level: DWORD,
2377        pDriverInfo: LPBYTE,
2378        cbBuf: DWORD,
2379        pcbNeeded: LPDWORD,
2380    ) -> BOOL;
2381}
2382ENUM!{enum PRINT_EXECUTION_CONTEXT {
2383    PRINT_EXECUTION_CONTEXT_APPLICATION = 0,
2384    PRINT_EXECUTION_CONTEXT_SPOOLER_SERVICE = 1,
2385    PRINT_EXECUTION_CONTEXT_SPOOLER_ISOLATION_HOST = 2,
2386    PRINT_EXECUTION_CONTEXT_FILTER_PIPELINE = 3,
2387    PRINT_EXECUTION_CONTEXT_WOW64 = 4,
2388}}
2389STRUCT!{struct PRINT_EXECUTION_DATA {
2390    context: PRINT_EXECUTION_CONTEXT,
2391    clientAppPID: DWORD,
2392}}
2393extern "system" {
2394    pub fn GetPrintExecutionData(
2395        pData: *mut PRINT_EXECUTION_DATA,
2396    ) -> BOOL;
2397    pub fn GetJobNamedPropertyValue(
2398        hPrinter: HANDLE,
2399        JobId: DWORD,
2400        pszName: PCWSTR,
2401        pValue: *mut PrintPropertyValue,
2402    ) -> DWORD;
2403    pub fn FreePrintPropertyValue(
2404        pValue: *mut PrintPropertyValue,
2405    );
2406    pub fn FreePrintNamedPropertyArray(
2407        cProperties: DWORD,
2408        ppProperties: *mut *mut PrintNamedProperty,
2409    );
2410    pub fn SetJobNamedProperty(
2411        hPrinter: HANDLE,
2412        JobId: DWORD,
2413        pProperty: *const PrintNamedProperty,
2414    ) -> DWORD;
2415    pub fn DeleteJobNamedProperty(
2416        hPrinter: HANDLE,
2417        JobId: DWORD,
2418        pszName: PCWSTR,
2419    ) -> DWORD;
2420    pub fn EnumJobNamedProperties(
2421        hPrinter: HANDLE,
2422        JobId: DWORD,
2423        pcProperties: *mut DWORD,
2424        ppProperties: *mut *mut PrintNamedProperty,
2425    ) -> DWORD;
2426    pub fn GetPrintOutputInfo(
2427        hWnd: HWND,
2428        pszPrinter: PCWSTR,
2429        phFile: *mut HANDLE,
2430        ppszOutputFile: *mut PWSTR,
2431    ) -> HRESULT;
2432}
2433pub const MS_PRINT_JOB_OUTPUT_FILE: &'static str = "MsPrintJobOutputFile";