// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. //! Winspool header file use shared::guiddef::GUID; use shared::minwindef::{ BOOL, BYTE, DWORD, FILETIME, FLOAT, LPBYTE, LPDWORD, LPHANDLE, LPVOID, MAX_PATH, PBYTE, PDWORD, PULONG, PWORD, UINT, ULONG, WORD, }; use shared::windef::{HWND, RECTL, SIZEL}; use shared::winerror::ERROR_NOT_SUPPORTED; use um::minwinbase::SYSTEMTIME; use um::wingdi::{LPDEVMODEA, LPDEVMODEW, PDEVMODEA, PDEVMODEW}; use um::winnt::{ ACCESS_MASK, CHAR, DWORDLONG, HANDLE, HRESULT, LANGID, LONG, LONGLONG, LPCSTR, LPCWSTR, LPSTR, LPWSTR, PCWSTR, PSECURITY_DESCRIPTOR, PVOID, PWSTR, STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_READ, STANDARD_RIGHTS_REQUIRED, STANDARD_RIGHTS_WRITE, WCHAR, }; use vc::vcruntime::size_t; STRUCT!{struct PRINTER_INFO_1A { Flags: DWORD, pDescription: LPSTR, pName: LPSTR, pComment: LPSTR, }} pub type PPRINTER_INFO_1A = *mut PRINTER_INFO_1A; pub type LPPRINTER_INFO_1A = *mut PRINTER_INFO_1A; STRUCT!{struct PRINTER_INFO_1W { Flags: DWORD, pDescription: LPWSTR, pName: LPWSTR, pComment: LPWSTR, }} pub type PPRINTER_INFO_1W = *mut PRINTER_INFO_1W; pub type LPPRINTER_INFO_1W = *mut PRINTER_INFO_1W; STRUCT!{struct PRINTER_INFO_2A { pServerName: LPSTR, pPrinterName: LPSTR, pShareName: LPSTR, pPortName: LPSTR, pDriverName: LPSTR, pComment: LPSTR, pLocation: LPSTR, pDevMode: LPDEVMODEA, pSepFile: LPSTR, pPrintProcessor: LPSTR, pDatatype: LPSTR, pParameters: LPSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Attributes: DWORD, Priority: DWORD, DefaultPriority: DWORD, StartTime: DWORD, UntilTime: DWORD, Status: DWORD, cJobs: DWORD, AveragePPM: DWORD, }} pub type PPRINTER_INFO_2A = *mut PRINTER_INFO_2A; pub type LPPRINTER_INFO_2A = *mut PRINTER_INFO_2A; STRUCT!{struct PRINTER_INFO_2W { pServerName: LPWSTR, pPrinterName: LPWSTR, pShareName: LPWSTR, pPortName: LPWSTR, pDriverName: LPWSTR, pComment: LPWSTR, pLocation: LPWSTR, pDevMode: LPDEVMODEW, pSepFile: LPWSTR, pPrintProcessor: LPWSTR, pDatatype: LPWSTR, pParameters: LPWSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Attributes: DWORD, Priority: DWORD, DefaultPriority: DWORD, StartTime: DWORD, UntilTime: DWORD, Status: DWORD, cJobs: DWORD, AveragePPM: DWORD, }} pub type PPRINTER_INFO_2W = *mut PRINTER_INFO_2W; pub type LPPRINTER_INFO_2W = *mut PRINTER_INFO_2W; STRUCT!{struct PRINTER_INFO_3 { pSecurityDescriptor: PSECURITY_DESCRIPTOR, }} pub type PPRINTER_INFO_3 = *mut PRINTER_INFO_3; pub type LPPRINTER_INFO_3 = *mut PRINTER_INFO_3; STRUCT!{struct PRINTER_INFO_4A { pPrinterName: LPSTR, pServerName: LPSTR, Attributes: DWORD, }} pub type PPRINTER_INFO_4A = *mut PRINTER_INFO_4A; pub type LPPRINTER_INFO_4A = *mut PRINTER_INFO_4A; STRUCT!{struct PRINTER_INFO_4W { pPrinterName: LPWSTR, pServerName: LPWSTR, Attributes: DWORD, }} pub type PPRINTER_INFO_4W = *mut PRINTER_INFO_4W; pub type LPPRINTER_INFO_4W = *mut PRINTER_INFO_4W; STRUCT!{struct PRINTER_INFO_5A { pPrinterName: LPSTR, pPortName: LPSTR, Attributes: DWORD, DeviceNotSelectedTimeout: DWORD, TransmissionRetryTimeout: DWORD, }} pub type PPRINTER_INFO_5A = *mut PRINTER_INFO_5A; pub type LPPRINTER_INFO_5A = *mut PRINTER_INFO_5A; STRUCT!{struct PRINTER_INFO_5W { pPrinterName: LPWSTR, pPortName: LPWSTR, Attributes: DWORD, DeviceNotSelectedTimeout: DWORD, TransmissionRetryTimeout: DWORD, }} pub type PPRINTER_INFO_5W = *mut PRINTER_INFO_5W; pub type LPPRINTER_INFO_5W = *mut PRINTER_INFO_5W; STRUCT!{struct PRINTER_INFO_6 { dwStatus: DWORD, }} pub type PPRINTER_INFO_6 = *mut PRINTER_INFO_6; pub type LPPRINTER_INFO_6 = *mut PRINTER_INFO_6; STRUCT!{struct PRINTER_INFO_7A { pszObjectGUID: LPSTR, dwAction: DWORD, }} pub type PPRINTER_INFO_7A = *mut PRINTER_INFO_7A; pub type LPPRINTER_INFO_7A = *mut PRINTER_INFO_7A; STRUCT!{struct PRINTER_INFO_7W { pszObjectGUID: LPWSTR, dwAction: DWORD, }} pub type PPRINTER_INFO_7W = *mut PRINTER_INFO_7W; pub type LPPRINTER_INFO_7W = *mut PRINTER_INFO_7W; pub const DSPRINT_PUBLISH: DWORD = 0x00000001; pub const DSPRINT_UPDATE: DWORD = 0x00000002; pub const DSPRINT_UNPUBLISH: DWORD = 0x00000004; pub const DSPRINT_REPUBLISH: DWORD = 0x00000008; pub const DSPRINT_PENDING: DWORD = 0x80000000; STRUCT!{struct PRINTER_INFO_8A { pDevMode: LPDEVMODEA, }} pub type PPRINTER_INFO_8A = *mut PRINTER_INFO_8A; pub type LPPRINTER_INFO_8A = *mut PRINTER_INFO_8A; STRUCT!{struct PRINTER_INFO_8W { pDevMode: LPDEVMODEW, }} pub type PPRINTER_INFO_8W = *mut PRINTER_INFO_8W; pub type LPPRINTER_INFO_8W = *mut PRINTER_INFO_8W; STRUCT!{struct PRINTER_INFO_9A { pDevMode: LPDEVMODEA, }} pub type PPRINTER_INFO_9A = *mut PRINTER_INFO_9A; pub type LPPRINTER_INFO_9A = *mut PRINTER_INFO_9A; STRUCT!{struct PRINTER_INFO_9W { pDevMode: LPDEVMODEW, }} pub type PPRINTER_INFO_9W = *mut PRINTER_INFO_9W; pub type LPPRINTER_INFO_9W = *mut PRINTER_INFO_9W; pub const PRINTER_CONTROL_PAUSE: DWORD = 1; pub const PRINTER_CONTROL_RESUME: DWORD = 2; pub const PRINTER_CONTROL_PURGE: DWORD = 3; pub const PRINTER_CONTROL_SET_STATUS: DWORD = 4; pub const PRINTER_STATUS_PAUSED: DWORD = 0x00000001; pub const PRINTER_STATUS_ERROR: DWORD = 0x00000002; pub const PRINTER_STATUS_PENDING_DELETION: DWORD = 0x00000004; pub const PRINTER_STATUS_PAPER_JAM: DWORD = 0x00000008; pub const PRINTER_STATUS_PAPER_OUT: DWORD = 0x00000010; pub const PRINTER_STATUS_MANUAL_FEED: DWORD = 0x00000020; pub const PRINTER_STATUS_PAPER_PROBLEM: DWORD = 0x00000040; pub const PRINTER_STATUS_OFFLINE: DWORD = 0x00000080; pub const PRINTER_STATUS_IO_ACTIVE: DWORD = 0x00000100; pub const PRINTER_STATUS_BUSY: DWORD = 0x00000200; pub const PRINTER_STATUS_PRINTING: DWORD = 0x00000400; pub const PRINTER_STATUS_OUTPUT_BIN_FULL: DWORD = 0x00000800; pub const PRINTER_STATUS_NOT_AVAILABLE: DWORD = 0x00001000; pub const PRINTER_STATUS_WAITING: DWORD = 0x00002000; pub const PRINTER_STATUS_PROCESSING: DWORD = 0x00004000; pub const PRINTER_STATUS_INITIALIZING: DWORD = 0x00008000; pub const PRINTER_STATUS_WARMING_UP: DWORD = 0x00010000; pub const PRINTER_STATUS_TONER_LOW: DWORD = 0x00020000; pub const PRINTER_STATUS_NO_TONER: DWORD = 0x00040000; pub const PRINTER_STATUS_PAGE_PUNT: DWORD = 0x00080000; pub const PRINTER_STATUS_USER_INTERVENTION: DWORD = 0x00100000; pub const PRINTER_STATUS_OUT_OF_MEMORY: DWORD = 0x00200000; pub const PRINTER_STATUS_DOOR_OPEN: DWORD = 0x00400000; pub const PRINTER_STATUS_SERVER_UNKNOWN: DWORD = 0x00800000; pub const PRINTER_STATUS_POWER_SAVE: DWORD = 0x01000000; pub const PRINTER_STATUS_SERVER_OFFLINE: DWORD = 0x02000000; pub const PRINTER_STATUS_DRIVER_UPDATE_NEEDED: DWORD = 0x04000000; pub const PRINTER_ATTRIBUTE_QUEUED: DWORD = 0x00000001; pub const PRINTER_ATTRIBUTE_DIRECT: DWORD = 0x00000002; pub const PRINTER_ATTRIBUTE_DEFAULT: DWORD = 0x00000004; pub const PRINTER_ATTRIBUTE_SHARED: DWORD = 0x00000008; pub const PRINTER_ATTRIBUTE_NETWORK: DWORD = 0x00000010; pub const PRINTER_ATTRIBUTE_HIDDEN: DWORD = 0x00000020; pub const PRINTER_ATTRIBUTE_LOCAL: DWORD = 0x00000040; pub const PRINTER_ATTRIBUTE_ENABLE_DEVQ: DWORD = 0x00000080; pub const PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS: DWORD = 0x00000100; pub const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST: DWORD = 0x00000200; pub const PRINTER_ATTRIBUTE_WORK_OFFLINE: DWORD = 0x00000400; pub const PRINTER_ATTRIBUTE_ENABLE_BIDI: DWORD = 0x00000800; pub const PRINTER_ATTRIBUTE_RAW_ONLY: DWORD = 0x00001000; pub const PRINTER_ATTRIBUTE_PUBLISHED: DWORD = 0x00002000; pub const PRINTER_ATTRIBUTE_FAX: DWORD = 0x00004000; pub const PRINTER_ATTRIBUTE_TS: DWORD = 0x00008000; pub const PRINTER_ATTRIBUTE_PUSHED_USER: DWORD = 0x00020000; pub const PRINTER_ATTRIBUTE_PUSHED_MACHINE: DWORD = 0x00040000; pub const PRINTER_ATTRIBUTE_MACHINE: DWORD = 0x00080000; pub const PRINTER_ATTRIBUTE_FRIENDLY_NAME: DWORD = 0x00100000; pub const PRINTER_ATTRIBUTE_TS_GENERIC_DRIVER: DWORD = 0x00200000; pub const PRINTER_ATTRIBUTE_PER_USER: DWORD = 0x00400000; pub const PRINTER_ATTRIBUTE_ENTERPRISE_CLOUD: DWORD = 0x00800000; pub const NO_PRIORITY: DWORD = 0; pub const MAX_PRIORITY: DWORD = 99; pub const MIN_PRIORITY: DWORD = 1; pub const DEF_PRIORITY: DWORD = 1; STRUCT!{struct JOB_INFO_1A { JobId: DWORD, pPrinterName: LPSTR, pMachineName: LPSTR, pUserName: LPSTR, pDocument: LPSTR, pDatatype: LPSTR, pStatus: LPSTR, Status: DWORD, Priority: DWORD, Position: DWORD, TotalPages: DWORD, PagesPrinted: DWORD, Submitted: SYSTEMTIME, }} pub type PJOB_INFO_1A = *mut JOB_INFO_1A; pub type LPJOB_INFO_1A = *mut JOB_INFO_1A; STRUCT!{struct JOB_INFO_1W { JobId: DWORD, pPrinterName: LPWSTR, pMachineName: LPWSTR, pUserName: LPWSTR, pDocument: LPWSTR, pDatatype: LPWSTR, pStatus: LPWSTR, Status: DWORD, Priority: DWORD, Position: DWORD, TotalPages: DWORD, PagesPrinted: DWORD, Submitted: SYSTEMTIME, }} pub type PJOB_INFO_1W = *mut JOB_INFO_1W; pub type LPJOB_INFO_1W = *mut JOB_INFO_1W; STRUCT!{struct JOB_INFO_2A { JobId: DWORD, pPrinterName: LPSTR, pMachineName: LPSTR, pUserName: LPSTR, pDocument: LPSTR, pNotifyName: LPSTR, pDatatype: LPSTR, pPrintProcessor: LPSTR, pParameters: LPSTR, pDriverName: LPSTR, pDevMode: LPDEVMODEA, pStatus: LPSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Status: DWORD, Priority: DWORD, Position: DWORD, StartTime: DWORD, UntilTime: DWORD, TotalPages: DWORD, Size: DWORD, Submitted: SYSTEMTIME, Time: DWORD, PagesPrinted: DWORD, }} pub type PJOB_INFO_2A = *mut JOB_INFO_2A; pub type LPJOB_INFO_2A = *mut JOB_INFO_2A; STRUCT!{struct JOB_INFO_2W { JobId: DWORD, pPrinterName: LPWSTR, pMachineName: LPWSTR, pUserName: LPWSTR, pDocument: LPWSTR, pNotifyName: LPWSTR, pDatatype: LPWSTR, pPrintProcessor: LPWSTR, pParameters: LPWSTR, pDriverName: LPWSTR, pDevMode: LPDEVMODEW, pStatus: LPWSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Status: DWORD, Priority: DWORD, Position: DWORD, StartTime: DWORD, UntilTime: DWORD, TotalPages: DWORD, Size: DWORD, Submitted: SYSTEMTIME, Time: DWORD, PagesPrinted: DWORD, }} pub type PJOB_INFO_2W = *mut JOB_INFO_2W; pub type LPJOB_INFO_2W = *mut JOB_INFO_2W; STRUCT!{struct JOB_INFO_3 { JobId: DWORD, NextJobId: DWORD, Reserved: DWORD, }} pub type PJOB_INFO_3 = *mut JOB_INFO_3; pub type LPJOB_INFO_3 = *mut JOB_INFO_3; STRUCT!{struct JOB_INFO_4A { JobId: DWORD, pPrinterName: LPSTR, pMachineName: LPSTR, pUserName: LPSTR, pDocument: LPSTR, pNotifyName: LPSTR, pDatatype: LPSTR, pPrintProcessor: LPSTR, pParameters: LPSTR, pDriverName: LPSTR, pDevMode: LPDEVMODEA, pStatus: LPSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Status: DWORD, Priority: DWORD, Position: DWORD, StartTime: DWORD, UntilTime: DWORD, TotalPages: DWORD, Size: DWORD, Submitted: SYSTEMTIME, Time: DWORD, PagesPrinted: DWORD, SizeHigh: LONG, }} pub type PJOB_INFO_4A = *mut JOB_INFO_4A; pub type LPJOB_INFO_4A = *mut JOB_INFO_4A; STRUCT!{struct JOB_INFO_4W { JobId: DWORD, pPrinterName: LPWSTR, pMachineName: LPWSTR, pUserName: LPWSTR, pDocument: LPWSTR, pNotifyName: LPWSTR, pDatatype: LPWSTR, pPrintProcessor: LPWSTR, pParameters: LPWSTR, pDriverName: LPWSTR, pDevMode: LPDEVMODEW, pStatus: LPWSTR, pSecurityDescriptor: PSECURITY_DESCRIPTOR, Status: DWORD, Priority: DWORD, Position: DWORD, StartTime: DWORD, UntilTime: DWORD, TotalPages: DWORD, Size: DWORD, Submitted: SYSTEMTIME, Time: DWORD, PagesPrinted: DWORD, SizeHigh: LONG, }} pub type PJOB_INFO_4W = *mut JOB_INFO_4W; pub type LPJOB_INFO_4W = *mut JOB_INFO_4W; pub const JOB_CONTROL_PAUSE: DWORD = 1; pub const JOB_CONTROL_RESUME: DWORD = 2; pub const JOB_CONTROL_CANCEL: DWORD = 3; pub const JOB_CONTROL_RESTART: DWORD = 4; pub const JOB_CONTROL_DELETE: DWORD = 5; pub const JOB_CONTROL_SENT_TO_PRINTER: DWORD = 6; pub const JOB_CONTROL_LAST_PAGE_EJECTED: DWORD = 7; pub const JOB_STATUS_PAUSED: DWORD = 0x00000001; pub const JOB_STATUS_ERROR: DWORD = 0x00000002; pub const JOB_STATUS_DELETING: DWORD = 0x00000004; pub const JOB_STATUS_SPOOLING: DWORD = 0x00000008; pub const JOB_STATUS_PRINTING: DWORD = 0x00000010; pub const JOB_STATUS_OFFLINE: DWORD = 0x00000020; pub const JOB_STATUS_PAPEROUT: DWORD = 0x00000040; pub const JOB_STATUS_PRINTED: DWORD = 0x00000080; pub const JOB_STATUS_DELETED: DWORD = 0x00000100; pub const JOB_STATUS_BLOCKED_DEVQ: DWORD = 0x00000200; pub const JOB_STATUS_USER_INTERVENTION: DWORD = 0x00000400; pub const JOB_STATUS_RESTART: DWORD = 0x00000800; pub const JOB_POSITION_UNSPECIFIED: DWORD = 0; STRUCT!{struct ADDJOB_INFO_1A { Path: LPSTR, JobId: DWORD, }} pub type PADDJOB_INFO_1A = *mut ADDJOB_INFO_1A; pub type LPADDJOB_INFO_1A = *mut ADDJOB_INFO_1A; STRUCT!{struct ADDJOB_INFO_1W { Path: LPWSTR, JobId: DWORD, }} pub type PADDJOB_INFO_1W = *mut ADDJOB_INFO_1W; pub type LPADDJOB_INFO_1W = *mut ADDJOB_INFO_1W; STRUCT!{struct DRIVER_INFO_1A { pName: LPSTR, }} pub type PDRIVER_INFO_1A = *mut DRIVER_INFO_1A; pub type LPDRIVER_INFO_1A = *mut DRIVER_INFO_1A; STRUCT!{struct DRIVER_INFO_1W { pName: LPWSTR, }} pub type PDRIVER_INFO_1W = *mut DRIVER_INFO_1W; pub type LPDRIVER_INFO_1W = *mut DRIVER_INFO_1W; STRUCT!{struct DRIVER_INFO_2A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, }} pub type PDRIVER_INFO_2A = *mut DRIVER_INFO_2A; pub type LPDRIVER_INFO_2A = *mut DRIVER_INFO_2A; STRUCT!{struct DRIVER_INFO_2W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, }} pub type PDRIVER_INFO_2W = *mut DRIVER_INFO_2W; pub type LPDRIVER_INFO_2W = *mut DRIVER_INFO_2W; STRUCT!{struct DRIVER_INFO_3A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, pHelpFile: LPSTR, pDependentFiles: LPSTR, pMonitorName: LPSTR, pDefaultDataType: LPSTR, }} pub type PDRIVER_INFO_3A = *mut DRIVER_INFO_3A; pub type LPDRIVER_INFO_3A = *mut DRIVER_INFO_3A; STRUCT!{struct DRIVER_INFO_3W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, pHelpFile: LPWSTR, pDependentFiles: LPWSTR, pMonitorName: LPWSTR, pDefaultDataType: LPWSTR, }} pub type PDRIVER_INFO_3W = *mut DRIVER_INFO_3W; pub type LPDRIVER_INFO_3W = *mut DRIVER_INFO_3W; STRUCT!{struct DRIVER_INFO_4A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, pHelpFile: LPSTR, pDependentFiles: LPSTR, pMonitorName: LPSTR, pDefaultDataType: LPSTR, pszzPreviousNames: LPSTR, }} pub type PDRIVER_INFO_4A = *mut DRIVER_INFO_4A; pub type LPDRIVER_INFO_4A = *mut DRIVER_INFO_4A; STRUCT!{struct DRIVER_INFO_4W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, pHelpFile: LPWSTR, pDependentFiles: LPWSTR, pMonitorName: LPWSTR, pDefaultDataType: LPWSTR, pszzPreviousNames: LPWSTR, }} pub type PDRIVER_INFO_4W = *mut DRIVER_INFO_4W; pub type LPDRIVER_INFO_4W = *mut DRIVER_INFO_4W; STRUCT!{struct DRIVER_INFO_5A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, dwDriverAttributes: DWORD, dwConfigVersion: DWORD, dwDriverVersion: DWORD, }} pub type PDRIVER_INFO_5A = *mut DRIVER_INFO_5A; pub type LPDRIVER_INFO_5A = *mut DRIVER_INFO_5A; STRUCT!{struct DRIVER_INFO_5W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, dwDriverAttributes: DWORD, dwConfigVersion: DWORD, dwDriverVersion: DWORD, }} pub type PDRIVER_INFO_5W = *mut DRIVER_INFO_5W; pub type LPDRIVER_INFO_5W = *mut DRIVER_INFO_5W; STRUCT!{struct DRIVER_INFO_6A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, pHelpFile: LPSTR, pDependentFiles: LPSTR, pMonitorName: LPSTR, pDefaultDataType: LPSTR, pszzPreviousNames: LPSTR, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pszMfgName: LPSTR, pszOEMUrl: LPSTR, pszHardwareID: LPSTR, pszProvider: LPSTR, }} pub type PDRIVER_INFO_6A = *mut DRIVER_INFO_6A; pub type LPDRIVER_INFO_6A = *mut DRIVER_INFO_6A; STRUCT!{struct DRIVER_INFO_6W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, pHelpFile: LPWSTR, pDependentFiles: LPWSTR, pMonitorName: LPWSTR, pDefaultDataType: LPWSTR, pszzPreviousNames: LPWSTR, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pszMfgName: LPWSTR, pszOEMUrl: LPWSTR, pszHardwareID: LPWSTR, pszProvider: LPWSTR, }} pub type PDRIVER_INFO_6W = *mut DRIVER_INFO_6W; pub type LPDRIVER_INFO_6W = *mut DRIVER_INFO_6W; pub const PRINTER_DRIVER_PACKAGE_AWARE: DWORD = 0x00000001; pub const PRINTER_DRIVER_XPS: DWORD = 0x00000002; pub const PRINTER_DRIVER_SANDBOX_ENABLED: DWORD = 0x00000004; pub const PRINTER_DRIVER_CLASS: DWORD = 0x00000008; pub const PRINTER_DRIVER_DERIVED: DWORD = 0x00000010; pub const PRINTER_DRIVER_NOT_SHAREABLE: DWORD = 0x00000020; pub const PRINTER_DRIVER_CATEGORY_FAX: DWORD = 0x00000040; pub const PRINTER_DRIVER_CATEGORY_FILE: DWORD = 0x00000080; pub const PRINTER_DRIVER_CATEGORY_VIRTUAL: DWORD = 0x00000100; pub const PRINTER_DRIVER_CATEGORY_SERVICE: DWORD = 0x00000200; pub const PRINTER_DRIVER_SOFT_RESET_REQUIRED: DWORD = 0x00000400; pub const PRINTER_DRIVER_SANDBOX_DISABLED: DWORD = 0x00000800; pub const PRINTER_DRIVER_CATEGORY_3D: DWORD = 0x00001000; pub const PRINTER_DRIVER_CATEGORY_CLOUD: DWORD = 0x00002000; STRUCT!{struct DRIVER_INFO_8A { cVersion: DWORD, pName: LPSTR, pEnvironment: LPSTR, pDriverPath: LPSTR, pDataFile: LPSTR, pConfigFile: LPSTR, pHelpFile: LPSTR, pDependentFiles: LPSTR, pMonitorName: LPSTR, pDefaultDataType: LPSTR, pszzPreviousNames: LPSTR, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pszMfgName: LPSTR, pszOEMUrl: LPSTR, pszHardwareID: LPSTR, pszProvider: LPSTR, pszPrintProcessor: LPSTR, pszVendorSetup: LPSTR, pszzColorProfiles: LPSTR, pszInfPath: LPSTR, dwPrinterDriverAttributes: DWORD, pszzCoreDriverDependencies: LPSTR, ftMinInboxDriverVerDate: FILETIME, dwlMinInboxDriverVerVersion: DWORDLONG, }} pub type PDRIVER_INFO_8A = *mut DRIVER_INFO_8A; pub type LPDRIVER_INFO_8A = *mut DRIVER_INFO_8A; STRUCT!{struct DRIVER_INFO_8W { cVersion: DWORD, pName: LPWSTR, pEnvironment: LPWSTR, pDriverPath: LPWSTR, pDataFile: LPWSTR, pConfigFile: LPWSTR, pHelpFile: LPWSTR, pDependentFiles: LPWSTR, pMonitorName: LPWSTR, pDefaultDataType: LPWSTR, pszzPreviousNames: LPWSTR, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pszMfgName: LPWSTR, pszOEMUrl: LPWSTR, pszHardwareID: LPWSTR, pszProvider: LPWSTR, pszPrintProcessor: LPWSTR, pszVendorSetup: LPWSTR, pszzColorProfiles: LPWSTR, pszInfPath: LPWSTR, dwPrinterDriverAttributes: DWORD, pszzCoreDriverDependencies: LPWSTR, ftMinInboxDriverVerDate: FILETIME, dwlMinInboxDriverVerVersion: DWORDLONG, }} pub type PDRIVER_INFO_8W = *mut DRIVER_INFO_8W; pub type LPDRIVER_INFO_8W = *mut DRIVER_INFO_8W; pub const DRIVER_KERNELMODE: DWORD = 0x00000001; pub const DRIVER_USERMODE: DWORD = 0x00000002; pub const DPD_DELETE_UNUSED_FILES: DWORD = 0x00000001; pub const DPD_DELETE_SPECIFIC_VERSION: DWORD = 0x00000002; pub const DPD_DELETE_ALL_FILES: DWORD = 0x00000004; pub const APD_STRICT_UPGRADE: DWORD = 0x00000001; pub const APD_STRICT_DOWNGRADE: DWORD = 0x00000002; pub const APD_COPY_ALL_FILES: DWORD = 0x00000004; pub const APD_COPY_NEW_FILES: DWORD = 0x00000008; pub const APD_COPY_FROM_DIRECTORY: DWORD = 0x00000010; STRUCT!{struct DOC_INFO_1A { pDocName: LPSTR, pOutputFile: LPSTR, pDatatype: LPSTR, }} pub type PDOC_INFO_1A = *mut DOC_INFO_1A; pub type LPDOC_INFO_1A = *mut DOC_INFO_1A; STRUCT!{struct DOC_INFO_1W { pDocName: LPWSTR, pOutputFile: LPWSTR, pDatatype: LPWSTR, }} pub type PDOC_INFO_1W = *mut DOC_INFO_1W; pub type LPDOC_INFO_1W = *mut DOC_INFO_1W; STRUCT!{struct FORM_INFO_1A { Flags: DWORD, pName: LPSTR, Size: SIZEL, ImageableArea: RECTL, }} pub type PFORM_INFO_1A = *mut FORM_INFO_1A; pub type LPFORM_INFO_1A = *mut FORM_INFO_1A; STRUCT!{struct FORM_INFO_1W { Flags: DWORD, pName: LPWSTR, Size: SIZEL, ImageableArea: RECTL, }} pub type PFORM_INFO_1W = *mut FORM_INFO_1W; pub type LPFORM_INFO_1W = *mut FORM_INFO_1W; pub const STRING_NONE: DWORD = 0x00000001; pub const STRING_MUIDLL: DWORD = 0x00000002; pub const STRING_LANGPAIR: DWORD = 0x00000004; pub const MAX_FORM_KEYWORD_LENGTH: usize = 63 + 1; STRUCT!{struct FORM_INFO_2A { Flags: DWORD, pName: LPCSTR, Size: SIZEL, ImageableArea: RECTL, pKeyword: LPCSTR, StringType: DWORD, pMuiDll: LPCSTR, dwResourceId: DWORD, pDisplayName: LPCSTR, wLangId: LANGID, }} pub type PFORM_INFO_2A = *mut FORM_INFO_2A; pub type LPFORM_INFO_2A = *mut FORM_INFO_2A; STRUCT!{struct FORM_INFO_2W { Flags: DWORD, pName: LPCWSTR, Size: SIZEL, ImageableArea: RECTL, pKeyword: LPCSTR, StringType: DWORD, pMuiDll: LPCWSTR, dwResourceId: DWORD, pDisplayName: LPCWSTR, wLangId: LANGID, }} pub type PFORM_INFO_2W = *mut FORM_INFO_2W; pub type LPFORM_INFO_2W = *mut FORM_INFO_2W; STRUCT!{struct DOC_INFO_2A { pDocName: LPSTR, pOutputFile: LPSTR, pDatatype: LPSTR, dwMode: DWORD, JobId: DWORD, }} pub type PDOC_INFO_2A = *mut DOC_INFO_2A; pub type LPDOC_INFO_2A = *mut DOC_INFO_2A; STRUCT!{struct DOC_INFO_2W { pDocName: LPWSTR, pOutputFile: LPWSTR, pDatatype: LPWSTR, dwMode: DWORD, JobId: DWORD, }} pub type PDOC_INFO_2W = *mut DOC_INFO_2W; pub type LPDOC_INFO_2W = *mut DOC_INFO_2W; pub const DI_CHANNEL: DWORD = 1; pub const DI_READ_SPOOL_JOB: DWORD = 3; STRUCT!{struct DOC_INFO_3A { pDocName: LPSTR, pOutputFile: LPSTR, pDatatype: LPSTR, dwFlags: DWORD, }} pub type PDOC_INFO_3A = *mut DOC_INFO_3A; pub type LPDOC_INFO_3A = *mut DOC_INFO_3A; STRUCT!{struct DOC_INFO_3W { pDocName: LPWSTR, pOutputFile: LPWSTR, pDatatype: LPWSTR, dwFlags: DWORD, }} pub type PDOC_INFO_3W = *mut DOC_INFO_3W; pub type LPDOC_INFO_3W = *mut DOC_INFO_3W; pub const DI_MEMORYMAP_WRITE: DWORD = 0x00000001; pub const FORM_USER: DWORD = 0x00000000; pub const FORM_BUILTIN: DWORD = 0x00000001; pub const FORM_PRINTER: DWORD = 0x00000002; STRUCT!{struct PRINTPROCESSOR_INFO_1A { pName: LPSTR, }} pub type PPRINTPROCESSOR_INFO_1A = *mut PRINTPROCESSOR_INFO_1A; pub type LPPRINTPROCESSOR_INFO_1A = *mut PRINTPROCESSOR_INFO_1A; STRUCT!{struct PRINTPROCESSOR_INFO_1W { pName: LPWSTR, }} pub type PPRINTPROCESSOR_INFO_1W = *mut PRINTPROCESSOR_INFO_1W; pub type LPPRINTPROCESSOR_INFO_1W = *mut PRINTPROCESSOR_INFO_1W; STRUCT!{struct PRINTPROCESSOR_CAPS_1 { dwLevel: DWORD, dwNupOptions: DWORD, dwPageOrderFlags: DWORD, dwNumberOfCopies: DWORD, }} pub type PPRINTPROCESSOR_CAPS_1 = *mut PRINTPROCESSOR_CAPS_1; STRUCT!{struct PRINTPROCESSOR_CAPS_2 { dwLevel: DWORD, dwNupOptions: DWORD, dwPageOrderFlags: DWORD, dwNumberOfCopies: DWORD, dwDuplexHandlingCaps: DWORD, dwNupDirectionCaps: DWORD, dwNupBorderCaps: DWORD, dwBookletHandlingCaps: DWORD, dwScalingCaps: DWORD, }} pub type PPRINTPROCESSOR_CAPS_2 = *mut PRINTPROCESSOR_CAPS_2; pub const PPCAPS_RIGHT_THEN_DOWN: DWORD = 0x00000001; pub const PPCAPS_DOWN_THEN_RIGHT: DWORD = 0x00000001 << 1; pub const PPCAPS_LEFT_THEN_DOWN: DWORD = 0x00000001 << 2; pub const PPCAPS_DOWN_THEN_LEFT: DWORD = 0x00000001 << 3; pub const PPCAPS_BORDER_PRINT: DWORD = 0x00000001; pub const PPCAPS_BOOKLET_EDGE: DWORD = 0x00000001; pub const PPCAPS_REVERSE_PAGES_FOR_REVERSE_DUPLEX: DWORD = 0x00000001; pub const PPCAPS_DONT_SEND_EXTRA_PAGES_FOR_DUPLEX: DWORD = 0x00000001 << 1; pub const PPCAPS_SQUARE_SCALING: DWORD = 0x00000001; STRUCT!{struct PORT_INFO_1A { pName: LPSTR, }} pub type PPORT_INFO_1A = *mut PORT_INFO_1A; pub type LPPORT_INFO_1A = *mut PORT_INFO_1A; STRUCT!{struct PORT_INFO_1W { pName: LPWSTR, }} pub type PPORT_INFO_1W = *mut PORT_INFO_1W; pub type LPPORT_INFO_1W = *mut PORT_INFO_1W; STRUCT!{struct PORT_INFO_2A { pPortName: LPSTR, pMonitorName: LPSTR, pDescription: LPSTR, fPortType: DWORD, Reserved: DWORD, }} pub type PPORT_INFO_2A = *mut PORT_INFO_2A; pub type LPPORT_INFO_2A = *mut PORT_INFO_2A; STRUCT!{struct PORT_INFO_2W { pPortName: LPWSTR, pMonitorName: LPWSTR, pDescription: LPWSTR, fPortType: DWORD, Reserved: DWORD, }} pub type PPORT_INFO_2W = *mut PORT_INFO_2W; pub type LPPORT_INFO_2W = *mut PORT_INFO_2W; pub const PORT_TYPE_WRITE: DWORD = 0x0001; pub const PORT_TYPE_READ: DWORD = 0x0002; pub const PORT_TYPE_REDIRECTED: DWORD = 0x0004; pub const PORT_TYPE_NET_ATTACHED: DWORD = 0x0008; STRUCT!{struct PORT_INFO_3A { dwStatus: DWORD, pszStatus: LPSTR, dwSeverity: DWORD, }} pub type PPORT_INFO_3A = *mut PORT_INFO_3A; pub type LPPORT_INFO_3A = *mut PORT_INFO_3A; STRUCT!{struct PORT_INFO_3W { dwStatus: DWORD, pszStatus: LPWSTR, dwSeverity: DWORD, }} pub type PPORT_INFO_3W = *mut PORT_INFO_3W; pub type LPPORT_INFO_3W = *mut PORT_INFO_3W; pub const PORT_STATUS_TYPE_ERROR: DWORD = 1; pub const PORT_STATUS_TYPE_WARNING: DWORD = 2; pub const PORT_STATUS_TYPE_INFO: DWORD = 3; pub const PORT_STATUS_OFFLINE: DWORD = 1; pub const PORT_STATUS_PAPER_JAM: DWORD = 2; pub const PORT_STATUS_PAPER_OUT: DWORD = 3; pub const PORT_STATUS_OUTPUT_BIN_FULL: DWORD = 4; pub const PORT_STATUS_PAPER_PROBLEM: DWORD = 5; pub const PORT_STATUS_NO_TONER: DWORD = 6; pub const PORT_STATUS_DOOR_OPEN: DWORD = 7; pub const PORT_STATUS_USER_INTERVENTION: DWORD = 8; pub const PORT_STATUS_OUT_OF_MEMORY: DWORD = 9; pub const PORT_STATUS_TONER_LOW: DWORD = 10; pub const PORT_STATUS_WARMING_UP: DWORD = 11; pub const PORT_STATUS_POWER_SAVE: DWORD = 12; STRUCT!{struct MONITOR_INFO_1A { pName: LPSTR, }} pub type PMONITOR_INFO_1A = *mut MONITOR_INFO_1A; pub type LPMONITOR_INFO_1A = *mut MONITOR_INFO_1A; STRUCT!{struct MONITOR_INFO_1W { pName: LPWSTR, }} pub type PMONITOR_INFO_1W = *mut MONITOR_INFO_1W; pub type LPMONITOR_INFO_1W = *mut MONITOR_INFO_1W; STRUCT!{struct MONITOR_INFO_2A { pName: LPSTR, pEnvironment: LPSTR, pDLLName: LPSTR, }} pub type PMONITOR_INFO_2A = *mut MONITOR_INFO_2A; pub type LPMONITOR_INFO_2A = *mut MONITOR_INFO_2A; STRUCT!{struct MONITOR_INFO_2W { pName: LPWSTR, pEnvironment: LPWSTR, pDLLName: LPWSTR, }} pub type PMONITOR_INFO_2W = *mut MONITOR_INFO_2W; pub type LPMONITOR_INFO_2W = *mut MONITOR_INFO_2W; STRUCT!{struct DATATYPES_INFO_1A { pName: LPSTR, }} pub type PDATATYPES_INFO_1A = *mut DATATYPES_INFO_1A; pub type LPDATATYPES_INFO_1A = *mut DATATYPES_INFO_1A; STRUCT!{struct DATATYPES_INFO_1W { pName: LPWSTR, }} pub type PDATATYPES_INFO_1W = *mut DATATYPES_INFO_1W; pub type LPDATATYPES_INFO_1W = *mut DATATYPES_INFO_1W; STRUCT!{struct PRINTER_DEFAULTSA { pDataType: LPSTR, pDevMode: LPDEVMODEA, DesiredAccess: ACCESS_MASK, }} pub type PPRINTER_DEFAULTSA = *mut PRINTER_DEFAULTSA; pub type LPPRINTER_DEFAULTSA = *mut PRINTER_DEFAULTSA; STRUCT!{struct PRINTER_DEFAULTSW { pDataType: LPWSTR, pDevMode: LPDEVMODEW, DesiredAccess: ACCESS_MASK, }} pub type PPRINTER_DEFAULTSW = *mut PRINTER_DEFAULTSW; pub type LPPRINTER_DEFAULTSW = *mut PRINTER_DEFAULTSW; STRUCT!{struct PRINTER_ENUM_VALUESA { pValueName: LPSTR, cbValueName: DWORD, dwType: DWORD, pData: LPBYTE, cbData: DWORD, }} pub type PPRINTER_ENUM_VALUESA = *mut PRINTER_ENUM_VALUESA; pub type LPPRINTER_ENUM_VALUESA = *mut PRINTER_ENUM_VALUESA; STRUCT!{struct PRINTER_ENUM_VALUESW { pValueName: LPWSTR, cbValueName: DWORD, dwType: DWORD, pData: LPBYTE, cbData: DWORD, }} pub type PPRINTER_ENUM_VALUESW = *mut PRINTER_ENUM_VALUESW; pub type LPPRINTER_ENUM_VALUESW = *mut PRINTER_ENUM_VALUESW; extern "system" { pub fn EnumPrintersA( Flags: DWORD, Name: LPSTR, Level: DWORD, pPrinterEnum: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumPrintersW( Flags: DWORD, Name: LPWSTR, Level: DWORD, pPrinterEnum: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; } pub const PRINTER_ENUM_DEFAULT: DWORD = 0x00000001; pub const PRINTER_ENUM_LOCAL: DWORD = 0x00000002; pub const PRINTER_ENUM_CONNECTIONS: DWORD = 0x00000004; pub const PRINTER_ENUM_FAVORITE: DWORD = 0x00000004; pub const PRINTER_ENUM_NAME: DWORD = 0x00000008; pub const PRINTER_ENUM_REMOTE: DWORD = 0x00000010; pub const PRINTER_ENUM_SHARED: DWORD = 0x00000020; pub const PRINTER_ENUM_NETWORK: DWORD = 0x00000040; pub const PRINTER_ENUM_EXPAND: DWORD = 0x00004000; pub const PRINTER_ENUM_CONTAINER: DWORD = 0x00008000; pub const PRINTER_ENUM_ICONMASK: DWORD = 0x00ff0000; pub const PRINTER_ENUM_ICON1: DWORD = 0x00010000; pub const PRINTER_ENUM_ICON2: DWORD = 0x00020000; pub const PRINTER_ENUM_ICON3: DWORD = 0x00040000; pub const PRINTER_ENUM_ICON4: DWORD = 0x00080000; pub const PRINTER_ENUM_ICON5: DWORD = 0x00100000; pub const PRINTER_ENUM_ICON6: DWORD = 0x00200000; pub const PRINTER_ENUM_ICON7: DWORD = 0x00400000; pub const PRINTER_ENUM_ICON8: DWORD = 0x00800000; pub const PRINTER_ENUM_HIDE: DWORD = 0x01000000; pub const PRINTER_ENUM_CATEGORY_ALL: DWORD = 0x02000000; pub const PRINTER_ENUM_CATEGORY_3D: DWORD = 0x04000000; pub const SPOOL_FILE_PERSISTENT: DWORD = 0x00000001; pub const SPOOL_FILE_TEMPORARY: DWORD = 0x00000002; extern "system" { pub fn GetSpoolFileHandle( hPrinter: HANDLE, ) -> HANDLE; pub fn CommitSpoolData( hPrinter: HANDLE, hSpoolFile: HANDLE, cbCommit: DWORD, ) -> HANDLE; pub fn CloseSpoolFileHandle( hPrinter: HANDLE, hSpoolFile: HANDLE, ) -> BOOL; pub fn OpenPrinterA( pPrinterName: LPSTR, phPrinter: LPHANDLE, pDefault: LPPRINTER_DEFAULTSA, ) -> BOOL; pub fn OpenPrinterW( pPrinterName: LPWSTR, phPrinter: LPHANDLE, pDefault: LPPRINTER_DEFAULTSW, ) -> BOOL; pub fn ResetPrinterA( hPrinter: HANDLE, pDefault: LPPRINTER_DEFAULTSA, ) -> BOOL; pub fn ResetPrinterW( hPrinter: HANDLE, pDefault: LPPRINTER_DEFAULTSW, ) -> BOOL; pub fn SetJobA( hPrinter: HANDLE, JobId: DWORD, Level: DWORD, pJob: LPBYTE, Command: DWORD, ) -> BOOL; pub fn SetJobW( hPrinter: HANDLE, JobId: DWORD, Level: DWORD, pJob: LPBYTE, Command: DWORD, ) -> BOOL; pub fn GetJobA( hPrinter: HANDLE, JobId: DWORD, Level: DWORD, pJob: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetJobW( hPrinter: HANDLE, JobId: DWORD, Level: DWORD, pJob: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn EnumJobsA( hPrinter: HANDLE, FirstJob: DWORD, NoJobs: DWORD, Level: DWORD, pJob: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumJobsW( hPrinter: HANDLE, FirstJob: DWORD, NoJobs: DWORD, Level: DWORD, pJob: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn AddPrinterA( pName: LPSTR, Level: DWORD, pPrinter: LPBYTE, ) -> HANDLE; pub fn AddPrinterW( pName: LPWSTR, Level: DWORD, pPrinter: LPBYTE, ) -> HANDLE; pub fn DeletePrinter( hPrinter: HANDLE, ) -> BOOL; pub fn SetPrinterA( hPrinter: HANDLE, Level: DWORD, pPrinter: LPBYTE, Command: DWORD, ) -> BOOL; pub fn SetPrinterW( hPrinter: HANDLE, Level: DWORD, pPrinter: LPBYTE, Command: DWORD, ) -> BOOL; pub fn GetPrinterA( hPrinter: HANDLE, Level: DWORD, pPrinter: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrinterW( hPrinter: HANDLE, Level: DWORD, pPrinter: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn AddPrinterDriverA( pName: LPSTR, Level: DWORD, pDriverInfo: LPBYTE, ) -> BOOL; pub fn AddPrinterDriverW( pName: LPWSTR, Level: DWORD, pDriverInfo: LPBYTE, ) -> BOOL; pub fn AddPrinterDriverExA( pName: LPSTR, Level: DWORD, pDriverInfo: PBYTE, dwFileCopyFlags: DWORD, ) -> BOOL; pub fn AddPrinterDriverExW( pName: LPWSTR, Level: DWORD, pDriverInfo: PBYTE, dwFileCopyFlags: DWORD, ) -> BOOL; pub fn EnumPrinterDriversA( pName: LPSTR, pEnvironment: LPSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumPrinterDriversW( pName: LPWSTR, pEnvironment: LPWSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn GetPrinterDriverA( hPrinter: HANDLE, pEnvironment: LPSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrinterDriverW( hPrinter: HANDLE, pEnvironment: LPWSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrinterDriverDirectoryA( pName: LPSTR, pEnvironment: LPSTR, Level: DWORD, pDriverDirectory: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrinterDriverDirectoryW( pName: LPWSTR, pEnvironment: LPWSTR, Level: DWORD, pDriverDirectory: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn DeletePrinterDriverA( pName: LPSTR, pEnvironment: LPSTR, pDriverName: LPSTR, ) -> BOOL; pub fn DeletePrinterDriverW( pName: LPWSTR, pEnvironment: LPWSTR, pDriverName: LPWSTR, ) -> BOOL; pub fn DeletePrinterDriverExA( pName: LPSTR, pEnvironment: LPSTR, pDriverName: LPSTR, dwDeleteFlag: DWORD, dwVersionFlag: DWORD, ) -> BOOL; pub fn DeletePrinterDriverExW( pName: LPWSTR, pEnvironment: LPWSTR, pDriverName: LPWSTR, dwDeleteFlag: DWORD, dwVersionFlag: DWORD, ) -> BOOL; pub fn AddPrintProcessorA( pName: LPSTR, pEnvironment: LPSTR, pPathName: LPSTR, pPrintProcessorName: LPSTR, ) -> BOOL; pub fn AddPrintProcessorW( pName: LPWSTR, pEnvironment: LPWSTR, pPathName: LPWSTR, pPrintProcessorName: LPWSTR, ) -> BOOL; pub fn EnumPrintProcessorsA( pName: LPSTR, pEnvironment: LPSTR, Level: DWORD, pPrintProcessorInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumPrintProcessorsW( pName: LPWSTR, pEnvironment: LPWSTR, Level: DWORD, pPrintProcessorInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn GetPrintProcessorDirectoryA( pName: LPSTR, pEnvironment: LPSTR, Level: DWORD, pPrintProcessorInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrintProcessorDirectoryW( pName: LPWSTR, pEnvironment: LPWSTR, Level: DWORD, pPrintProcessorInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn EnumPrintProcessorDatatypesA( pName: LPSTR, pPrintProcessorName: LPSTR, Level: DWORD, pDatatypes: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumPrintProcessorDatatypesW( pName: LPWSTR, pPrintProcessorName: LPWSTR, Level: DWORD, pDatatypes: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn DeletePrintProcessorA( pName: LPSTR, pEnvironment: LPSTR, pPrintProcessorName: LPSTR, ) -> BOOL; pub fn DeletePrintProcessorW( pName: LPWSTR, pEnvironment: LPWSTR, pPrintProcessorName: LPWSTR, ) -> BOOL; pub fn StartDocPrinterA( hPrinter: HANDLE, Level: DWORD, pDocInfo: LPBYTE, ) -> DWORD; pub fn StartDocPrinterW( hPrinter: HANDLE, Level: DWORD, pDocInfo: LPBYTE, ) -> DWORD; pub fn StartPagePrinter( hPrinter: HANDLE, ) -> BOOL; pub fn WritePrinter( hPrinter: HANDLE, pBuf: LPVOID, cbBuf: DWORD, pcWritten: LPDWORD, ) -> BOOL; pub fn FlushPrinter( hPrinter: HANDLE, pBuf: LPVOID, cbBuf: DWORD, pcWritten: LPDWORD, cSleep: DWORD, ) -> BOOL; pub fn EndPagePrinter( hPrinter: HANDLE, ) -> BOOL; pub fn AbortPrinter( hPrinter: HANDLE, ) -> BOOL; pub fn ReadPrinter( hPrinter: HANDLE, pBuf: LPVOID, cbBuf: DWORD, pNoBytesRead: LPDWORD, ) -> BOOL; pub fn EndDocPrinter( hPrinter: HANDLE, ) -> BOOL; pub fn AddJobA( hPrinter: HANDLE, Level: DWORD, pData: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn AddJobW( hPrinter: HANDLE, Level: DWORD, pData: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn ScheduleJob( hPrinter: HANDLE, JobId: DWORD, ) -> BOOL; pub fn PrinterProperties( hWnd: HWND, hPrinter: HANDLE, ) -> BOOL; pub fn DocumentPropertiesA( hWnd: HWND, hPrinter: HANDLE, pDeviceName: LPSTR, pDevModeOutput: PDEVMODEA, pDevModeInput: PDEVMODEA, fMode: DWORD, ) -> LONG; pub fn DocumentPropertiesW( hWnd: HWND, hPrinter: HANDLE, pDeviceName: LPWSTR, pDevModeOutput: PDEVMODEW, pDevModeInput: PDEVMODEW, fMode: DWORD, ) -> LONG; pub fn AdvancedDocumentPropertiesA( hWnd: HWND, hPrinter: HANDLE, pDeviceName: LPSTR, pDevModeOutput: PDEVMODEA, pDevModeInput: PDEVMODEA, ) -> LONG; pub fn AdvancedDocumentPropertiesW( hWnd: HWND, hPrinter: HANDLE, pDeviceName: LPWSTR, pDevModeOutput: PDEVMODEW, pDevModeInput: PDEVMODEW, ) -> LONG; pub fn ExtDeviceMode( hWnd: HWND, hInst: HANDLE, pDevModeOutput: LPDEVMODEA, pDeviceName: LPSTR, pPort: LPSTR, pDevModeInput: LPDEVMODEA, pProfile: LPSTR, fMode: DWORD, ) -> LONG; pub fn GetPrinterDataA( hPrinter: HANDLE, pValueName: LPSTR, pType: LPDWORD, pData: LPBYTE, nSize: DWORD, pcbNeeded: LPDWORD, ) -> DWORD; pub fn GetPrinterDataW( hPrinter: HANDLE, pValueName: LPWSTR, pType: LPDWORD, pData: LPBYTE, nSize: DWORD, pcbNeeded: LPDWORD, ) -> DWORD; pub fn GetPrinterDataExA( hPrinter: HANDLE, pKeyName: LPCSTR, pValueName: LPCSTR, pType: LPDWORD, pData: LPBYTE, nSize: DWORD, pcbNeeded: LPDWORD, ) -> DWORD; pub fn GetPrinterDataExW( hPrinter: HANDLE, pKeyName: LPCWSTR, pValueName: LPCWSTR, pType: LPDWORD, pData: LPBYTE, nSize: DWORD, pcbNeeded: LPDWORD, ) -> DWORD; pub fn EnumPrinterDataA( hPrinter: HANDLE, dwIndex: DWORD, pValueName: LPSTR, cbValueName: DWORD, pcbValueName: LPDWORD, pType: LPDWORD, pData: LPBYTE, cbData: DWORD, pcbData: LPDWORD, ) -> DWORD; pub fn EnumPrinterDataW( hPrinter: HANDLE, dwIndex: DWORD, pValueName: LPWSTR, cbValueName: DWORD, pcbValueName: LPDWORD, pType: LPDWORD, pData: LPBYTE, cbData: DWORD, pcbData: LPDWORD, ) -> DWORD; pub fn EnumPrinterDataExA( hPrinter: HANDLE, pKeyName: LPCSTR, pEnumValues: LPBYTE, cbEnumValues: DWORD, pcbEnumValues: LPDWORD, pnEnumValues: LPDWORD, ) -> DWORD; pub fn EnumPrinterDataExW( hPrinter: HANDLE, pKeyName: LPCWSTR, pEnumValues: LPBYTE, cbEnumValues: DWORD, pcbEnumValues: LPDWORD, pnEnumValues: LPDWORD, ) -> DWORD; pub fn EnumPrinterKeyA( hPrinter: HANDLE, pKeyName: LPCSTR, pSubKey: LPSTR, cbSubkey: DWORD, pcbSubkey: LPDWORD, ) -> DWORD; pub fn EnumPrinterKeyW( hPrinter: HANDLE, pKeyName: LPCWSTR, pSubKey: LPWSTR, cbSubkey: DWORD, pcbSubkey: LPDWORD, ) -> DWORD; pub fn SetPrinterDataA( hPrinter: HANDLE, pValueName: LPSTR, Type: DWORD, pData: LPBYTE, cbData: DWORD, ) -> DWORD; pub fn SetPrinterDataW( hPrinter: HANDLE, pValueName: LPWSTR, Type: DWORD, pData: LPBYTE, cbData: DWORD, ) -> DWORD; pub fn SetPrinterDataExA( hPrinter: HANDLE, pKeyName: LPCSTR, pValueName: LPCSTR, Type: DWORD, pData: LPBYTE, cbData: DWORD, ) -> DWORD; pub fn SetPrinterDataExW( hPrinter: HANDLE, pKeyName: LPCWSTR, pValueName: LPCWSTR, Type: DWORD, pData: LPBYTE, cbData: DWORD, ) -> DWORD; pub fn DeletePrinterDataA( hPrinter: HANDLE, pValueName: LPSTR, ) -> DWORD; pub fn DeletePrinterDataW( hPrinter: HANDLE, pValueName: LPWSTR, ) -> DWORD; pub fn DeletePrinterDataExA( hPrinter: HANDLE, pKeyName: LPCSTR, pValueName: LPCSTR, ) -> DWORD; pub fn DeletePrinterDataExW( hPrinter: HANDLE, pKeyName: LPCWSTR, pValueName: LPCWSTR, ) -> DWORD; pub fn DeletePrinterKeyA( hPrinter: HANDLE, pKeyName: LPCSTR, ) -> DWORD; pub fn DeletePrinterKeyW( hPrinter: HANDLE, pKeyName: LPCWSTR, ) -> DWORD; } pub const PRINTER_NOTIFY_TYPE: DWORD = 0x00; pub const JOB_NOTIFY_TYPE: DWORD = 0x01; pub const SERVER_NOTIFY_TYPE: DWORD = 0x02; pub const PRINTER_NOTIFY_FIELD_SERVER_NAME: DWORD = 0x00; pub const PRINTER_NOTIFY_FIELD_PRINTER_NAME: DWORD = 0x01; pub const PRINTER_NOTIFY_FIELD_SHARE_NAME: DWORD = 0x02; pub const PRINTER_NOTIFY_FIELD_PORT_NAME: DWORD = 0x03; pub const PRINTER_NOTIFY_FIELD_DRIVER_NAME: DWORD = 0x04; pub const PRINTER_NOTIFY_FIELD_COMMENT: DWORD = 0x05; pub const PRINTER_NOTIFY_FIELD_LOCATION: DWORD = 0x06; pub const PRINTER_NOTIFY_FIELD_DEVMODE: DWORD = 0x07; pub const PRINTER_NOTIFY_FIELD_SEPFILE: DWORD = 0x08; pub const PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR: DWORD = 0x09; pub const PRINTER_NOTIFY_FIELD_PARAMETERS: DWORD = 0x0A; pub const PRINTER_NOTIFY_FIELD_DATATYPE: DWORD = 0x0B; pub const PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR: DWORD = 0x0C; pub const PRINTER_NOTIFY_FIELD_ATTRIBUTES: DWORD = 0x0D; pub const PRINTER_NOTIFY_FIELD_PRIORITY: DWORD = 0x0E; pub const PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY: DWORD = 0x0F; pub const PRINTER_NOTIFY_FIELD_START_TIME: DWORD = 0x10; pub const PRINTER_NOTIFY_FIELD_UNTIL_TIME: DWORD = 0x11; pub const PRINTER_NOTIFY_FIELD_STATUS: DWORD = 0x12; pub const PRINTER_NOTIFY_FIELD_STATUS_STRING: DWORD = 0x13; pub const PRINTER_NOTIFY_FIELD_CJOBS: DWORD = 0x14; pub const PRINTER_NOTIFY_FIELD_AVERAGE_PPM: DWORD = 0x15; pub const PRINTER_NOTIFY_FIELD_TOTAL_PAGES: DWORD = 0x16; pub const PRINTER_NOTIFY_FIELD_PAGES_PRINTED: DWORD = 0x17; pub const PRINTER_NOTIFY_FIELD_TOTAL_BYTES: DWORD = 0x18; pub const PRINTER_NOTIFY_FIELD_BYTES_PRINTED: DWORD = 0x19; pub const PRINTER_NOTIFY_FIELD_OBJECT_GUID: DWORD = 0x1A; pub const PRINTER_NOTIFY_FIELD_FRIENDLY_NAME: DWORD = 0x1B; pub const PRINTER_NOTIFY_FIELD_BRANCH_OFFICE_PRINTING: DWORD = 0x1C; pub const JOB_NOTIFY_FIELD_PRINTER_NAME: DWORD = 0x00; pub const JOB_NOTIFY_FIELD_MACHINE_NAME: DWORD = 0x01; pub const JOB_NOTIFY_FIELD_PORT_NAME: DWORD = 0x02; pub const JOB_NOTIFY_FIELD_USER_NAME: DWORD = 0x03; pub const JOB_NOTIFY_FIELD_NOTIFY_NAME: DWORD = 0x04; pub const JOB_NOTIFY_FIELD_DATATYPE: DWORD = 0x05; pub const JOB_NOTIFY_FIELD_PRINT_PROCESSOR: DWORD = 0x06; pub const JOB_NOTIFY_FIELD_PARAMETERS: DWORD = 0x07; pub const JOB_NOTIFY_FIELD_DRIVER_NAME: DWORD = 0x08; pub const JOB_NOTIFY_FIELD_DEVMODE: DWORD = 0x09; pub const JOB_NOTIFY_FIELD_STATUS: DWORD = 0x0A; pub const JOB_NOTIFY_FIELD_STATUS_STRING: DWORD = 0x0B; pub const JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR: DWORD = 0x0C; pub const JOB_NOTIFY_FIELD_DOCUMENT: DWORD = 0x0D; pub const JOB_NOTIFY_FIELD_PRIORITY: DWORD = 0x0E; pub const JOB_NOTIFY_FIELD_POSITION: DWORD = 0x0F; pub const JOB_NOTIFY_FIELD_SUBMITTED: DWORD = 0x10; pub const JOB_NOTIFY_FIELD_START_TIME: DWORD = 0x11; pub const JOB_NOTIFY_FIELD_UNTIL_TIME: DWORD = 0x12; pub const JOB_NOTIFY_FIELD_TIME: DWORD = 0x13; pub const JOB_NOTIFY_FIELD_TOTAL_PAGES: DWORD = 0x14; pub const JOB_NOTIFY_FIELD_PAGES_PRINTED: DWORD = 0x15; pub const JOB_NOTIFY_FIELD_TOTAL_BYTES: DWORD = 0x16; pub const JOB_NOTIFY_FIELD_BYTES_PRINTED: DWORD = 0x17; pub const JOB_NOTIFY_FIELD_REMOTE_JOB_ID: DWORD = 0x18; pub const SERVER_NOTIFY_FIELD_PRINT_DRIVER_ISOLATION_GROUP: DWORD = 0x00; pub const PRINTER_NOTIFY_CATEGORY_ALL: DWORD = 0x001000; pub const PRINTER_NOTIFY_CATEGORY_3D: DWORD = 0x002000; STRUCT!{struct PRINTER_NOTIFY_OPTIONS_TYPE { Type: WORD, Reserved0: WORD, Reserved1: DWORD, Reserved2: DWORD, Count: DWORD, pFields: PWORD, }} pub type PPRINTER_NOTIFY_OPTIONS_TYPE = *mut PRINTER_NOTIFY_OPTIONS_TYPE; pub type LPPRINTER_NOTIFY_OPTIONS_TYPE = *mut PRINTER_NOTIFY_OPTIONS_TYPE; pub const PRINTER_NOTIFY_OPTIONS_REFRESH: DWORD = 0x01; STRUCT!{struct PRINTER_NOTIFY_OPTIONS { Version: DWORD, Flags: DWORD, Count: DWORD, pTypes: PPRINTER_NOTIFY_OPTIONS_TYPE, }} pub type PPRINTER_NOTIFY_OPTIONS = *mut PRINTER_NOTIFY_OPTIONS; pub type LPPRINTER_NOTIFY_OPTIONS = *mut PRINTER_NOTIFY_OPTIONS; pub const PRINTER_NOTIFY_INFO_DISCARDED: DWORD = 0x01; STRUCT!{struct PRINTER_NOTIFY_INFO_DATA_NotifyData_Data { cbBuf: DWORD, pBuf: LPVOID, }} UNION!{union PRINTER_NOTIFY_INFO_DATA_NotifyData { [usize; 2], adwData adwData_mut: [DWORD; 2], Data Data_mut: PRINTER_NOTIFY_INFO_DATA_NotifyData_Data, }} STRUCT!{struct PRINTER_NOTIFY_INFO_DATA { Type: WORD, Field: WORD, Reserved: DWORD, Id: DWORD, NotifyData: PRINTER_NOTIFY_INFO_DATA_NotifyData, }} pub type PPRINTER_NOTIFY_INFO_DATA = *mut PRINTER_NOTIFY_INFO_DATA; pub type LPPRINTER_NOTIFY_INFO_DATA = *mut PRINTER_NOTIFY_INFO_DATA; STRUCT!{struct PRINTER_NOTIFY_INFO { Version: DWORD, Flags: DWORD, Count: DWORD, aData: [PRINTER_NOTIFY_INFO_DATA; 1], }} pub type PPRINTER_NOTIFY_INFO = *mut PRINTER_NOTIFY_INFO; pub type LPPRINTER_NOTIFY_INFO = *mut PRINTER_NOTIFY_INFO; STRUCT!{struct BINARY_CONTAINER { cbBuf: DWORD, pData: LPBYTE, }} pub type PBINARY_CONTAINER = *mut BINARY_CONTAINER; UNION!{union BIDI_DATA_u { [usize; 2], bData bData_mut: BOOL, iData iData_mut: LONG, sData sData_mut: LPWSTR, fData fData_mut: FLOAT, biData biData_mut: BINARY_CONTAINER, }} STRUCT!{struct BIDI_DATA { dwBidiType: DWORD, u: BIDI_DATA_u, }} pub type PBIDI_DATA = *mut BIDI_DATA; pub type LPBIDI_DATA = *mut BIDI_DATA; STRUCT!{struct BIDI_REQUEST_DATA { dwReqNumber: DWORD, pSchema: LPWSTR, data: BIDI_DATA, }} pub type PBIDI_REQUEST_DATA = *mut BIDI_REQUEST_DATA; pub type LPBIDI_REQUEST_DATA = *mut BIDI_REQUEST_DATA; STRUCT!{struct BIDI_REQUEST_CONTAINER { Version: DWORD, Flags: DWORD, Count: DWORD, aData: [BIDI_REQUEST_DATA; 1], }} pub type PBIDI_REQUEST_CONTAINER = *mut BIDI_REQUEST_CONTAINER; pub type LPBIDI_REQUEST_CONTAINER = *mut BIDI_REQUEST_CONTAINER; STRUCT!{struct BIDI_RESPONSE_DATA { dwResult: DWORD, dwReqNumber: DWORD, pSchema: LPWSTR, data: BIDI_DATA, }} pub type PBIDI_RESPONSE_DATA = *mut BIDI_RESPONSE_DATA; pub type LPBIDI_RESPONSE_DATA = *mut BIDI_RESPONSE_DATA; STRUCT!{struct BIDI_RESPONSE_CONTAINER { Version: DWORD, Flags: DWORD, Count: DWORD, aData: [BIDI_RESPONSE_DATA; 1], }} pub type PBIDI_RESPONSE_CONTAINER = *mut BIDI_RESPONSE_CONTAINER; pub type LPBIDI_RESPONSE_CONTAINER = *mut BIDI_RESPONSE_CONTAINER; pub const BIDI_ACTION_ENUM_SCHEMA: &'static str = "EnumSchema"; pub const BIDI_ACTION_GET: &'static str = "Get"; pub const BIDI_ACTION_SET: &'static str = "Set"; pub const BIDI_ACTION_GET_ALL: &'static str = "GetAll"; pub const BIDI_ACTION_GET_WITH_ARGUMENT: &'static str = "GetWithArgument"; ENUM!{enum BIDI_TYPE { BIDI_NULL = 0, BIDI_INT = 1, BIDI_FLOAT = 2, BIDI_BOOL = 3, BIDI_STRING = 4, BIDI_TEXT = 5, BIDI_ENUM = 6, BIDI_BLOB = 7, }} pub const BIDI_ACCESS_ADMINISTRATOR: DWORD = 0x1; pub const BIDI_ACCESS_USER: DWORD = 0x2; pub const ERROR_BIDI_STATUS_OK: DWORD = 0; pub const ERROR_BIDI_NOT_SUPPORTED: DWORD = ERROR_NOT_SUPPORTED; pub const ERROR_BIDI_ERROR_BASE: DWORD = 13000; pub const ERROR_BIDI_STATUS_WARNING: DWORD = ERROR_BIDI_ERROR_BASE + 1; pub const ERROR_BIDI_SCHEMA_READ_ONLY: DWORD = ERROR_BIDI_ERROR_BASE + 2; pub const ERROR_BIDI_SERVER_OFFLINE: DWORD = ERROR_BIDI_ERROR_BASE + 3; pub const ERROR_BIDI_DEVICE_OFFLINE: DWORD = ERROR_BIDI_ERROR_BASE + 4; pub const ERROR_BIDI_SCHEMA_NOT_SUPPORTED: DWORD = ERROR_BIDI_ERROR_BASE + 5; pub const ERROR_BIDI_SET_DIFFERENT_TYPE: DWORD = ERROR_BIDI_ERROR_BASE + 6; pub const ERROR_BIDI_SET_MULTIPLE_SCHEMAPATH: DWORD = ERROR_BIDI_ERROR_BASE + 7; pub const ERROR_BIDI_SET_INVALID_SCHEMAPATH: DWORD = ERROR_BIDI_ERROR_BASE + 8; pub const ERROR_BIDI_SET_UNKNOWN_FAILURE: DWORD = ERROR_BIDI_ERROR_BASE + 9; pub const ERROR_BIDI_SCHEMA_WRITE_ONLY: DWORD = ERROR_BIDI_ERROR_BASE + 10; pub const ERROR_BIDI_GET_REQUIRES_ARGUMENT: DWORD = ERROR_BIDI_ERROR_BASE + 11; pub const ERROR_BIDI_GET_ARGUMENT_NOT_SUPPORTED: DWORD = ERROR_BIDI_ERROR_BASE + 12; pub const ERROR_BIDI_GET_MISSING_ARGUMENT: DWORD = ERROR_BIDI_ERROR_BASE + 13; pub const ERROR_BIDI_DEVICE_CONFIG_UNCHANGED: DWORD = ERROR_BIDI_ERROR_BASE + 14; pub const ERROR_BIDI_NO_LOCALIZED_RESOURCES: DWORD = ERROR_BIDI_ERROR_BASE + 15; pub const ERROR_BIDI_NO_BIDI_SCHEMA_EXTENSIONS: DWORD = ERROR_BIDI_ERROR_BASE + 16; pub const ERROR_BIDI_UNSUPPORTED_CLIENT_LANGUAGE: DWORD = ERROR_BIDI_ERROR_BASE + 17; pub const ERROR_BIDI_UNSUPPORTED_RESOURCE_FORMAT: DWORD = ERROR_BIDI_ERROR_BASE + 18; extern "system" { pub fn WaitForPrinterChange( hPrinter: HANDLE, Flags: DWORD, ) -> DWORD; pub fn FindFirstPrinterChangeNotification( hPrinter: HANDLE, fdwFilter: DWORD, fdwOptions: DWORD, pPrinterNotifyOptions: LPVOID, ) -> HANDLE; pub fn FindNextPrinterChangeNotification( hChange: HANDLE, pdwChange: PDWORD, pPrinterNotifyOptions: LPVOID, ppPrinterNotifyInfo: *mut LPVOID, ) -> BOOL; pub fn FreePrinterNotifyInfo( pPrinterNotifyInfo: PPRINTER_NOTIFY_INFO, ) -> BOOL; pub fn FindClosePrinterChangeNotification( hChange: HANDLE, ) -> BOOL; } pub const PRINTER_CHANGE_ADD_PRINTER: DWORD = 0x00000001; pub const PRINTER_CHANGE_SET_PRINTER: DWORD = 0x00000002; pub const PRINTER_CHANGE_DELETE_PRINTER: DWORD = 0x00000004; pub const PRINTER_CHANGE_FAILED_CONNECTION_PRINTER: DWORD = 0x00000008; pub const PRINTER_CHANGE_PRINTER: DWORD = 0x000000FF; pub const PRINTER_CHANGE_ADD_JOB: DWORD = 0x00000100; pub const PRINTER_CHANGE_SET_JOB: DWORD = 0x00000200; pub const PRINTER_CHANGE_DELETE_JOB: DWORD = 0x00000400; pub const PRINTER_CHANGE_WRITE_JOB: DWORD = 0x00000800; pub const PRINTER_CHANGE_JOB: DWORD = 0x0000FF00; pub const PRINTER_CHANGE_ADD_FORM: DWORD = 0x00010000; pub const PRINTER_CHANGE_SET_FORM: DWORD = 0x00020000; pub const PRINTER_CHANGE_DELETE_FORM: DWORD = 0x00040000; pub const PRINTER_CHANGE_FORM: DWORD = 0x00070000; pub const PRINTER_CHANGE_ADD_PORT: DWORD = 0x00100000; pub const PRINTER_CHANGE_CONFIGURE_PORT: DWORD = 0x00200000; pub const PRINTER_CHANGE_DELETE_PORT: DWORD = 0x00400000; pub const PRINTER_CHANGE_PORT: DWORD = 0x00700000; pub const PRINTER_CHANGE_ADD_PRINT_PROCESSOR: DWORD = 0x01000000; pub const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR: DWORD = 0x04000000; pub const PRINTER_CHANGE_PRINT_PROCESSOR: DWORD = 0x07000000; pub const PRINTER_CHANGE_SERVER: DWORD = 0x08000000; pub const PRINTER_CHANGE_ADD_PRINTER_DRIVER: DWORD = 0x10000000; pub const PRINTER_CHANGE_SET_PRINTER_DRIVER: DWORD = 0x20000000; pub const PRINTER_CHANGE_DELETE_PRINTER_DRIVER: DWORD = 0x40000000; pub const PRINTER_CHANGE_PRINTER_DRIVER: DWORD = 0x70000000; pub const PRINTER_CHANGE_TIMEOUT: DWORD = 0x80000000; pub const PRINTER_CHANGE_ALL: DWORD = 0x7F77FFFF; extern "system" { pub fn PrinterMessageBoxA( hPrinter: HANDLE, Error: DWORD, hWnd: HWND, pText: LPSTR, pCaption: LPSTR, dwType: DWORD, ) -> DWORD; pub fn PrinterMessageBoxW( hPrinter: HANDLE, Error: DWORD, hWnd: HWND, pText: LPWSTR, pCaption: LPWSTR, dwType: DWORD, ) -> DWORD; } pub const PRINTER_ERROR_INFORMATION: DWORD = 0x80000000; pub const PRINTER_ERROR_WARNING: DWORD = 0x40000000; pub const PRINTER_ERROR_SEVERE: DWORD = 0x20000000; pub const PRINTER_ERROR_OUTOFPAPER: DWORD = 0x00000001; pub const PRINTER_ERROR_JAM: DWORD = 0x00000002; pub const PRINTER_ERROR_OUTOFTONER: DWORD = 0x00000004; extern "system" { pub fn ClosePrinter( hPrinter: HANDLE, ) -> BOOL; pub fn AddFormA( hPrinter: HANDLE, Level: DWORD, pForm: LPBYTE, ) -> BOOL; pub fn AddFormW( hPrinter: HANDLE, Level: DWORD, pForm: LPBYTE, ) -> BOOL; pub fn DeleteFormA( hPrinter: HANDLE, pFormName: LPSTR, ) -> BOOL; pub fn DeleteFormW( hPrinter: HANDLE, pFormName: LPWSTR, ) -> BOOL; pub fn GetFormA( hPrinter: HANDLE, pFormName: LPSTR, Level: DWORD, pForm: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetFormW( hPrinter: HANDLE, pFormName: LPWSTR, Level: DWORD, pForm: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn SetFormA( hPrinter: HANDLE, pFormName: LPSTR, Level: DWORD, pForm: LPBYTE, ) -> BOOL; pub fn SetFormW( hPrinter: HANDLE, pFormName: LPWSTR, Level: DWORD, pForm: LPBYTE, ) -> BOOL; pub fn EnumFormsA( hPrinter: HANDLE, Level: DWORD, pForm: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumFormsW( hPrinter: HANDLE, Level: DWORD, pForm: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumMonitorsA( pName: LPSTR, Level: DWORD, pMonitor: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumMonitorsW( pName: LPWSTR, Level: DWORD, pMonitor: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn AddMonitorA( pName: LPSTR, Level: DWORD, pMonitors: LPBYTE, ) -> BOOL; pub fn AddMonitorW( pName: LPWSTR, Level: DWORD, pMonitors: LPBYTE, ) -> BOOL; pub fn DeleteMonitorA( pName: LPSTR, pEnvironment: LPSTR, pMonitorName: LPSTR, ) -> BOOL; pub fn DeleteMonitorW( pName: LPWSTR, pEnvironment: LPWSTR, pMonitorName: LPWSTR, ) -> BOOL; pub fn EnumPortsA( pName: LPSTR, Level: DWORD, pPort: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn EnumPortsW( pName: LPWSTR, Level: DWORD, pPort: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, pcReturned: LPDWORD, ) -> BOOL; pub fn AddPortA( pName: LPSTR, hWnd: HWND, pMonitorName: LPSTR, ) -> BOOL; pub fn AddPortW( pName: LPWSTR, hWnd: HWND, pMonitorName: LPWSTR, ) -> BOOL; pub fn ConfigurePortA( pName: LPSTR, hWnd: HWND, pPortName: LPSTR, ) -> BOOL; pub fn ConfigurePortW( pName: LPWSTR, hWnd: HWND, pPortName: LPWSTR, ) -> BOOL; pub fn DeletePortA( pName: LPSTR, hWnd: HWND, pPortName: LPSTR, ) -> BOOL; pub fn DeletePortW( pName: LPWSTR, hWnd: HWND, pPortName: LPWSTR, ) -> BOOL; pub fn XcvDataW( hXcv: HANDLE, pszDataName: PCWSTR, pInputData: PBYTE, cbInputData: DWORD, pOutputData: PBYTE, cbOutputData: DWORD, pcbOutputNeeded: PDWORD, pdwStatus: PDWORD, ) -> BOOL; pub fn GetDefaultPrinterA( pszBuffer: LPSTR, pcchBuffer: LPDWORD, ) -> BOOL; pub fn GetDefaultPrinterW( pszBuffer: LPWSTR, pcchBuffer: LPDWORD, ) -> BOOL; pub fn SetDefaultPrinterA( pszPrinter: LPCSTR, ) -> BOOL; pub fn SetDefaultPrinterW( pszPrinter: LPCWSTR, ) -> BOOL; pub fn SetPortA( pName: LPSTR, pPortName: LPSTR, dwLevel: DWORD, pPortInfo: LPBYTE, ) -> BOOL; pub fn SetPortW(pName: LPWSTR, pPortName: LPWSTR, dwLevel: DWORD, pPortInfo: LPBYTE, ) -> BOOL; pub fn AddPrinterConnectionA( pName: LPSTR, ) -> BOOL; pub fn AddPrinterConnectionW( pName: LPWSTR, ) -> BOOL; pub fn DeletePrinterConnectionA( pName: LPSTR, ) -> BOOL; pub fn DeletePrinterConnectionW( pName: LPWSTR, ) -> BOOL; pub fn ConnectToPrinterDlg( hwnd: HWND, Flags: DWORD, ) -> HANDLE; } STRUCT!{struct PROVIDOR_INFO_1A { pName: LPSTR, pEnvironment: LPSTR, pDLLName: LPSTR, }} pub type PPROVIDOR_INFO_1A = *mut PROVIDOR_INFO_1A; pub type LPPROVIDOR_INFO_1A = *mut PROVIDOR_INFO_1A; STRUCT!{struct PROVIDOR_INFO_1W { pName: LPWSTR, pEnvironment: LPWSTR, pDLLName: LPWSTR, }} pub type PPROVIDOR_INFO_1W = *mut PROVIDOR_INFO_1W; pub type LPPROVIDOR_INFO_1W = *mut PROVIDOR_INFO_1W; STRUCT!{struct PROVIDOR_INFO_2A { pOrder: LPSTR, }} pub type PPROVIDOR_INFO_2A = *mut PROVIDOR_INFO_2A; pub type LPPROVIDOR_INFO_2A = *mut PROVIDOR_INFO_2A; STRUCT!{struct PROVIDOR_INFO_2W { pOrder: LPWSTR, }} pub type PPROVIDOR_INFO_2W = *mut PROVIDOR_INFO_2W; pub type LPPROVIDOR_INFO_2W = *mut PROVIDOR_INFO_2W; extern "system" { pub fn AddPrintProvidorA( pName: LPSTR, Level: DWORD, pProvidorInfo: LPBYTE, ) -> BOOL; pub fn AddPrintProvidorW( pName: LPWSTR, Level: DWORD, pProvidorInfo: LPBYTE, ) -> BOOL; pub fn DeletePrintProvidorA( pName: LPSTR, pEnvironment: LPSTR, pPrintProvidorName: LPSTR, ) -> BOOL; pub fn DeletePrintProvidorW( pName: LPWSTR, pEnvironment: LPWSTR, pPrintProvidorName: LPWSTR, ) -> BOOL; pub fn IsValidDevmodeA( pDevmode: PDEVMODEA, DevmodeSize: size_t, ) -> BOOL; pub fn IsValidDevmodeW( pDevmode: PDEVMODEW, DevmodeSize: size_t, ) -> BOOL; } pub const SPLREG_DEFAULT_SPOOL_DIRECTORY: &'static str = "DefaultSpoolDirectory"; pub const SPLREG_PORT_THREAD_PRIORITY_DEFAULT: &'static str = "PortThreadPriorityDefault"; pub const SPLREG_PORT_THREAD_PRIORITY: &'static str = "PortThreadPriority"; pub const SPLREG_SCHEDULER_THREAD_PRIORITY_DEFAULT: &'static str = "SchedulerThreadPriorityDefault"; pub const SPLREG_SCHEDULER_THREAD_PRIORITY: &'static str = "SchedulerThreadPriority"; pub const SPLREG_BEEP_ENABLED: &'static str = "BeepEnabled"; pub const SPLREG_NET_POPUP: &'static str = "NetPopup"; pub const SPLREG_RETRY_POPUP: &'static str = "RetryPopup"; pub const SPLREG_NET_POPUP_TO_COMPUTER: &'static str = "NetPopupToComputer"; pub const SPLREG_EVENT_LOG: &'static str = "EventLog"; pub const SPLREG_MAJOR_VERSION: &'static str = "MajorVersion"; pub const SPLREG_MINOR_VERSION: &'static str = "MinorVersion"; pub const SPLREG_ARCHITECTURE: &'static str = "Architecture"; pub const SPLREG_OS_VERSION: &'static str = "OSVersion"; pub const SPLREG_OS_VERSIONEX: &'static str = "OSVersionEx"; pub const SPLREG_DS_PRESENT: &'static str = "DsPresent"; pub const SPLREG_DS_PRESENT_FOR_USER: &'static str = "DsPresentForUser"; pub const SPLREG_REMOTE_FAX: &'static str = "RemoteFax"; pub const SPLREG_RESTART_JOB_ON_POOL_ERROR: &'static str = "RestartJobOnPoolError"; pub const SPLREG_RESTART_JOB_ON_POOL_ENABLED: &'static str = "RestartJobOnPoolEnabled"; pub const SPLREG_DNS_MACHINE_NAME: &'static str = "DNSMachineName"; pub const SPLREG_ALLOW_USER_MANAGEFORMS: &'static str = "AllowUserManageForms"; pub const SPLREG_WEBSHAREMGMT: &'static str = "WebShareMgmt"; pub const SPLREG_PRINT_DRIVER_ISOLATION_GROUPS_SEPARATOR: &'static str = "\\"; pub const SPLREG_PRINT_DRIVER_ISOLATION_GROUPS: &'static str = "PrintDriverIsolationGroups"; pub const SPLREG_PRINT_DRIVER_ISOLATION_TIME_BEFORE_RECYCLE: &'static str = "PrintDriverIsolationTimeBeforeRecycle"; pub const SPLREG_PRINT_DRIVER_ISOLATION_MAX_OBJECTS_BEFORE_RECYCLE: &'static str = "PrintDriverIsolationMaxobjsBeforeRecycle"; pub const SPLREG_PRINT_DRIVER_ISOLATION_IDLE_TIMEOUT: &'static str = "PrintDriverIsolationIdleTimeout"; pub const SPLREG_PRINT_DRIVER_ISOLATION_EXECUTION_POLICY: &'static str = "PrintDriverIsolationExecutionPolicy"; pub const SPLREG_PRINT_DRIVER_ISOLATION_OVERRIDE_POLICY: &'static str = "PrintDriverIsolationOverrideCompat"; pub const SPLREG_PRINT_QUEUE_V4_DRIVER_DIRECTORY: &'static str = "PrintQueueV4DriverDirectory"; pub const SERVER_ACCESS_ADMINISTER: DWORD = 0x00000001; pub const SERVER_ACCESS_ENUMERATE: DWORD = 0x00000002; pub const PRINTER_ACCESS_ADMINISTER: DWORD = 0x00000004; pub const PRINTER_ACCESS_USE: DWORD = 0x00000008; pub const JOB_ACCESS_ADMINISTER: DWORD = 0x00000010; pub const JOB_ACCESS_READ: DWORD = 0x00000020; pub const PRINTER_ACCESS_MANAGE_LIMITED: DWORD = 0x00000040; pub const SERVER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE; pub const SERVER_READ: DWORD = STANDARD_RIGHTS_READ | SERVER_ACCESS_ENUMERATE; pub const SERVER_WRITE: DWORD = STANDARD_RIGHTS_WRITE | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE; pub const SERVER_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | SERVER_ACCESS_ENUMERATE; pub const PRINTER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE; pub const PRINTER_READ: DWORD = STANDARD_RIGHTS_READ | PRINTER_ACCESS_USE; pub const PRINTER_WRITE: DWORD = STANDARD_RIGHTS_WRITE | PRINTER_ACCESS_USE; pub const PRINTER_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | PRINTER_ACCESS_USE; pub const JOB_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | JOB_ACCESS_ADMINISTER | JOB_ACCESS_READ; pub const JOB_READ: DWORD = STANDARD_RIGHTS_READ | JOB_ACCESS_READ; pub const JOB_WRITE: DWORD = STANDARD_RIGHTS_WRITE | JOB_ACCESS_ADMINISTER; pub const JOB_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | JOB_ACCESS_ADMINISTER; pub const SPLDS_SPOOLER_KEY: &'static str = "DsSpooler"; pub const SPLDS_DRIVER_KEY: &'static str = "DsDriver"; pub const SPLDS_USER_KEY: &'static str = "DsUser"; pub const SPLDS_ASSET_NUMBER: &'static str = "assetNumber"; pub const SPLDS_BYTES_PER_MINUTE: &'static str = "bytesPerMinute"; pub const SPLDS_DESCRIPTION: &'static str = "description"; pub const SPLDS_DRIVER_NAME: &'static str = "driverName"; pub const SPLDS_DRIVER_VERSION: &'static str = "driverVersion"; pub const SPLDS_LOCATION: &'static str = "location"; pub const SPLDS_PORT_NAME: &'static str = "portName"; pub const SPLDS_PRINT_ATTRIBUTES: &'static str = "printAttributes"; pub const SPLDS_PRINT_BIN_NAMES: &'static str = "printBinNames"; pub const SPLDS_PRINT_COLLATE: &'static str = "printCollate"; pub const SPLDS_PRINT_COLOR: &'static str = "printColor"; pub const SPLDS_PRINT_DUPLEX_SUPPORTED: &'static str = "printDuplexSupported"; pub const SPLDS_PRINT_END_TIME: &'static str = "printEndTime"; pub const SPLDS_PRINTER_CLASS: &'static str = "printQueue"; pub const SPLDS_PRINTER_NAME: &'static str = "printerName"; pub const SPLDS_PRINT_KEEP_PRINTED_JOBS: &'static str = "printKeepPrintedJobs"; pub const SPLDS_PRINT_LANGUAGE: &'static str = "printLanguage"; pub const SPLDS_PRINT_MAC_ADDRESS: &'static str = "printMACAddress"; pub const SPLDS_PRINT_MAX_X_EXTENT: &'static str = "printMaxXExtent"; pub const SPLDS_PRINT_MAX_Y_EXTENT: &'static str = "printMaxYExtent"; pub const SPLDS_PRINT_MAX_RESOLUTION_SUPPORTED: &'static str = "printMaxResolutionSupported"; pub const SPLDS_PRINT_MEDIA_READY: &'static str = "printMediaReady"; pub const SPLDS_PRINT_MEDIA_SUPPORTED: &'static str = "printMediaSupported"; pub const SPLDS_PRINT_MEMORY: &'static str = "printMemory"; pub const SPLDS_PRINT_MIN_X_EXTENT: &'static str = "printMinXExtent"; pub const SPLDS_PRINT_MIN_Y_EXTENT: &'static str = "printMinYExtent"; pub const SPLDS_PRINT_NETWORK_ADDRESS: &'static str = "printNetworkAddress"; pub const SPLDS_PRINT_NOTIFY: &'static str = "printNotify"; pub const SPLDS_PRINT_NUMBER_UP: &'static str = "printNumberUp"; pub const SPLDS_PRINT_ORIENTATIONS_SUPPORTED: &'static str = "printOrientationsSupported"; pub const SPLDS_PRINT_OWNER: &'static str = "printOwner"; pub const SPLDS_PRINT_PAGES_PER_MINUTE: &'static str = "printPagesPerMinute"; pub const SPLDS_PRINT_RATE: &'static str = "printRate"; pub const SPLDS_PRINT_RATE_UNIT: &'static str = "printRateUnit"; pub const SPLDS_PRINT_SEPARATOR_FILE: &'static str = "printSeparatorFile"; pub const SPLDS_PRINT_SHARE_NAME: &'static str = "printShareName"; pub const SPLDS_PRINT_SPOOLING: &'static str = "printSpooling"; pub const SPLDS_PRINT_STAPLING_SUPPORTED: &'static str = "printStaplingSupported"; pub const SPLDS_PRINT_START_TIME: &'static str = "printStartTime"; pub const SPLDS_PRINT_STATUS: &'static str = "printStatus"; pub const SPLDS_PRIORITY: &'static str = "priority"; pub const SPLDS_SERVER_NAME: &'static str = "serverName"; pub const SPLDS_SHORT_SERVER_NAME: &'static str = "shortServerName"; pub const SPLDS_UNC_NAME: &'static str = "uNCName"; pub const SPLDS_URL: &'static str = "url"; pub const SPLDS_FLAGS: &'static str = "flags"; pub const SPLDS_VERSION_NUMBER: &'static str = "versionNumber"; pub const SPLDS_PRINTER_NAME_ALIASES: &'static str = "printerNameAliases"; pub const SPLDS_PRINTER_LOCATIONS: &'static str = "printerLocations"; pub const SPLDS_PRINTER_MODEL: &'static str = "printerModel"; ENUM!{enum PRINTER_OPTION_FLAGS { PRINTER_OPTION_NO_CACHE = 1 << 0, PRINTER_OPTION_CACHE = 1 << 1, PRINTER_OPTION_CLIENT_CHANGE = 1 << 2, PRINTER_OPTION_NO_CLIENT_DATA = 1 << 3, }} STRUCT!{struct PRINTER_OPTIONSA { cbSize: UINT, dwFlags: DWORD, }} pub type PPRINTER_OPTIONSA = *mut PRINTER_OPTIONSA; pub type LPPRINTER_OPTIONSA = *mut PRINTER_OPTIONSA; STRUCT!{struct PRINTER_OPTIONSW { cbSize: UINT, dwFlags: DWORD, }} pub type PPRINTER_OPTIONSW = *mut PRINTER_OPTIONSW; pub type LPPRINTER_OPTIONSW = *mut PRINTER_OPTIONSW; extern "system" { pub fn OpenPrinter2A( pPrinterName: LPCSTR, phPrinter: LPHANDLE, pDefault: PPRINTER_DEFAULTSA, pOptions: PPRINTER_OPTIONSA, ) -> BOOL; pub fn OpenPrinter2W( pPrinterName: LPCWSTR, phPrinter: LPHANDLE, pDefault: PPRINTER_DEFAULTSW, pOptions: PPRINTER_OPTIONSW, ) -> BOOL; } pub const PRINTER_CONNECTION_MISMATCH: DWORD = 0x00000020; pub const PRINTER_CONNECTION_NO_UI: DWORD = 0x00000040; STRUCT!{struct PRINTER_CONNECTION_INFO_1A { dwFlags: DWORD, pszDriverName: LPSTR, }} pub type PPRINTER_CONNECTION_INFO_1A = *mut PRINTER_CONNECTION_INFO_1A; pub type LPPRINTER_CONNECTION_INFO_1A = *mut PRINTER_CONNECTION_INFO_1A; STRUCT!{struct PRINTER_CONNECTION_INFO_1W { dwFlags: DWORD, pszDriverName: LPWSTR, }} pub type PPRINTER_CONNECTION_INFO_1W = *mut PRINTER_CONNECTION_INFO_1W; pub type LPPRINTER_CONNECTION_INFO_1W = *mut PRINTER_CONNECTION_INFO_1W; extern "system" { pub fn AddPrinterConnection2A( hWnd: HWND, pszName: LPCSTR, dwLevel: DWORD, pConnectionInfo: PVOID, ) -> BOOL; pub fn AddPrinterConnection2W( hWnd: HWND, pszName: LPCWSTR, dwLevel: DWORD, pConnectionInfo: PVOID, ) -> BOOL; } pub const IPDFP_COPY_ALL_FILES: DWORD = 0x00000001; extern "system" { pub fn InstallPrinterDriverFromPackageA( pszServer: LPCSTR, pszInfPath: LPCSTR, pszDriverName: LPCSTR, pszEnvironment: LPCSTR, dwFlags: DWORD, ) -> HRESULT; pub fn InstallPrinterDriverFromPackageW( pszServer: LPCWSTR, pszInfPath: LPCWSTR, pszDriverName: LPCWSTR, pszEnvironment: LPCWSTR, dwFlags: DWORD, ) -> HRESULT; } pub const UPDP_SILENT_UPLOAD: DWORD = 0x00000001; pub const UPDP_UPLOAD_ALWAYS: DWORD = 0x00000002; pub const UPDP_CHECK_DRIVERSTORE: DWORD = 0x00000004; extern "system" { pub fn UploadPrinterDriverPackageA( pszServer: LPCSTR, pszInfPath: LPCSTR, pszEnvironment: LPCSTR, dwFlags: DWORD, hwnd: HWND, pszDestInfPath: LPSTR, pcchDestInfPath: PULONG, ) -> HRESULT; pub fn UploadPrinterDriverPackageW( pszServer: LPCWSTR, pszInfPath: LPCWSTR, pszEnvironment: LPCWSTR, dwFlags: DWORD, hwnd: HWND, pszDestInfPath: LPWSTR, pcchDestInfPath: PULONG, ) -> HRESULT; } STRUCT!{struct CORE_PRINTER_DRIVERA { CoreDriverGUID: GUID, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, szPackageID: [CHAR; MAX_PATH], }} pub type PCORE_PRINTER_DRIVERA = *mut CORE_PRINTER_DRIVERA; STRUCT!{struct CORE_PRINTER_DRIVERW { CoreDriverGUID: GUID, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, szPackageID: [WCHAR; MAX_PATH], }} pub type PCORE_PRINTER_DRIVERW = *mut CORE_PRINTER_DRIVERW; extern "system" { pub fn GetCorePrinterDriversA( pszServer: LPCSTR, pszEnvironment: LPCSTR, pszzCoreDriverDependencies: LPCSTR, cCorePrinterDrivers: DWORD, pCorePrinterDrivers: PCORE_PRINTER_DRIVERA, ) -> HRESULT; pub fn GetCorePrinterDriversW( pszServer: LPCWSTR, pszEnvironment: LPCWSTR, pszzCoreDriverDependencies: LPCWSTR, cCorePrinterDrivers: DWORD, pCorePrinterDrivers: PCORE_PRINTER_DRIVERW, ) -> HRESULT; pub fn CorePrinterDriverInstalledA( pszServer: LPCSTR, pszEnvironment: LPCSTR, CoreDriverGUID: GUID, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pbDriverInstalled: *mut BOOL, ) -> HRESULT; pub fn CorePrinterDriverInstalledW( pszServer: LPCWSTR, pszEnvironment: LPCWSTR, CoreDriverGUID: GUID, ftDriverDate: FILETIME, dwlDriverVersion: DWORDLONG, pbDriverInstalled: *mut BOOL, ) -> HRESULT; pub fn GetPrinterDriverPackagePathA( pszServer: LPCSTR, pszEnvironment: LPCSTR, pszLanguage: LPCSTR, pszPackageID: LPCSTR, pszDriverPackageCab: LPSTR, cchDriverPackageCab: DWORD, pcchRequiredSize: LPDWORD, ) -> HRESULT; pub fn GetPrinterDriverPackagePathW( pszServer: LPCWSTR, pszEnvironment: LPCWSTR, pszLanguage: LPCWSTR, pszPackageID: LPCWSTR, pszDriverPackageCab: LPWSTR, cchDriverPackageCab: DWORD, pcchRequiredSize: LPDWORD, ) -> HRESULT; pub fn DeletePrinterDriverPackageA( pszServer: LPCSTR, pszInfPath: LPCSTR, pszEnvironment: LPCSTR, ) -> HRESULT; pub fn DeletePrinterDriverPackageW( pszServer: LPCWSTR, pszInfPath: LPCWSTR, pszEnvironment: LPCWSTR, ) -> HRESULT; } ENUM!{enum EPrintPropertyType { kPropertyTypeString = 1, kPropertyTypeInt32, kPropertyTypeInt64, kPropertyTypeByte, kPropertyTypeTime, kPropertyTypeDevMode, kPropertyTypeSD, kPropertyTypeNotificationReply, kPropertyTypeNotificationOptions, kPropertyTypeBuffer, }} ENUM!{enum EPrintXPSJobProgress { kAddingDocumentSequence = 0, kDocumentSequenceAdded = 1, kAddingFixedDocument = 2, kFixedDocumentAdded = 3, kAddingFixedPage = 4, kFixedPageAdded = 5, kResourceAdded = 6, kFontAdded = 7, kImageAdded = 8, kXpsDocumentCommitted = 9, }} ENUM!{enum EPrintXPSJobOperation { kJobProduction = 1, kJobConsumption, }} STRUCT!{struct PrintPropertyValue_value_propertyBlob { cbBuf: DWORD, pBuf: LPVOID, }} UNION!{union PrintPropertyValue_value { [u64; 1] [u64; 2], propertyByte propertyByte_mut: BYTE, propertyString propertyString_mut: PWSTR, propertyInt32 propertyInt32_mut: LONG, propertyInt64 propertyInt64_mut: LONGLONG, propertyBlob propertyBlob_mut: PrintPropertyValue_value_propertyBlob, }} STRUCT!{struct PrintPropertyValue { ePropertyType: EPrintPropertyType, value: PrintPropertyValue_value, }} STRUCT!{struct PrintNamedProperty { propertyName: *mut WCHAR, propertyValue: PrintPropertyValue, }} STRUCT!{struct PrintPropertiesCollection { numberOfProperties: ULONG, propertiesCollection: *mut PrintNamedProperty, }} extern "system" { pub fn ReportJobProcessingProgress( printerHandle: HANDLE, jobId: ULONG, jobOperation: EPrintXPSJobOperation, jobProgress: EPrintXPSJobProgress, ) -> HRESULT; pub fn GetPrinterDriver2A( hWnd: HWND, hPrinter: HANDLE, pEnvironment: LPSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; pub fn GetPrinterDriver2W( hWnd: HWND, hPrinter: HANDLE, pEnvironment: LPWSTR, Level: DWORD, pDriverInfo: LPBYTE, cbBuf: DWORD, pcbNeeded: LPDWORD, ) -> BOOL; } ENUM!{enum PRINT_EXECUTION_CONTEXT { PRINT_EXECUTION_CONTEXT_APPLICATION = 0, PRINT_EXECUTION_CONTEXT_SPOOLER_SERVICE = 1, PRINT_EXECUTION_CONTEXT_SPOOLER_ISOLATION_HOST = 2, PRINT_EXECUTION_CONTEXT_FILTER_PIPELINE = 3, PRINT_EXECUTION_CONTEXT_WOW64 = 4, }} STRUCT!{struct PRINT_EXECUTION_DATA { context: PRINT_EXECUTION_CONTEXT, clientAppPID: DWORD, }} extern "system" { pub fn GetPrintExecutionData( pData: *mut PRINT_EXECUTION_DATA, ) -> BOOL; pub fn GetJobNamedPropertyValue( hPrinter: HANDLE, JobId: DWORD, pszName: PCWSTR, pValue: *mut PrintPropertyValue, ) -> DWORD; pub fn FreePrintPropertyValue( pValue: *mut PrintPropertyValue, ); pub fn FreePrintNamedPropertyArray( cProperties: DWORD, ppProperties: *mut *mut PrintNamedProperty, ); pub fn SetJobNamedProperty( hPrinter: HANDLE, JobId: DWORD, pProperty: *const PrintNamedProperty, ) -> DWORD; pub fn DeleteJobNamedProperty( hPrinter: HANDLE, JobId: DWORD, pszName: PCWSTR, ) -> DWORD; pub fn EnumJobNamedProperties( hPrinter: HANDLE, JobId: DWORD, pcProperties: *mut DWORD, ppProperties: *mut *mut PrintNamedProperty, ) -> DWORD; pub fn GetPrintOutputInfo( hWnd: HWND, pszPrinter: PCWSTR, phFile: *mut HANDLE, ppszOutputFile: *mut PWSTR, ) -> HRESULT; } pub const MS_PRINT_JOB_OUTPUT_FILE: &'static str = "MsPrintJobOutputFile";