/***********************************************************************\
*                              winspool.d                               *
*                                                                       *
*                       Windows API header module                       *
*                                                                       *
*                 Translated from MinGW Windows headers                 *
*                                                                       *
*                       Placed into public domain                       *
\***********************************************************************/
module win32.winspool;
pragma(lib, "winspool.lib");

private import win32.w32api, win32.windef, win32.wingdi;
private import win32.winbase; // for SYSTEMTIME

// FIXME: clean up Windows version support

const DI_CHANNEL=1;
const DI_CHANNEL_WRITE=2;
const DI_READ_SPOOL_JOB=3;

const FORM_BUILTIN=1;

const JOB_CONTROL_PAUSE=1;
const JOB_CONTROL_RESUME=2;
const JOB_CONTROL_CANCEL=3;
const JOB_CONTROL_RESTART=4;
const JOB_CONTROL_DELETE=5;
const JOB_STATUS_PAUSED=1;
const JOB_STATUS_ERROR=2;
const JOB_STATUS_DELETING=4;
const JOB_STATUS_SPOOLING=8;
const JOB_STATUS_PRINTING=16;
const JOB_STATUS_OFFLINE=32;
const JOB_STATUS_PAPEROUT=0x40;
const JOB_STATUS_PRINTED=0x80;
const JOB_STATUS_DELETED=0x100;
const JOB_STATUS_BLOCKED_DEVQ=0x200;
const JOB_STATUS_USER_INTERVENTION=0x400;

const JOB_POSITION_UNSPECIFIED=0;

const JOB_NOTIFY_TYPE=1;

const JOB_NOTIFY_FIELD_PRINTER_NAME=0;
const JOB_NOTIFY_FIELD_MACHINE_NAME=1;
const JOB_NOTIFY_FIELD_PORT_NAME=2;
const JOB_NOTIFY_FIELD_USER_NAME=3;
const JOB_NOTIFY_FIELD_NOTIFY_NAME=4;
const JOB_NOTIFY_FIELD_DATATYPE=5;
const JOB_NOTIFY_FIELD_PRINT_PROCESSOR=6;
const JOB_NOTIFY_FIELD_PARAMETERS=7;
const JOB_NOTIFY_FIELD_DRIVER_NAME=8;
const JOB_NOTIFY_FIELD_DEVMODE=9;
const JOB_NOTIFY_FIELD_STATUS=10;
const JOB_NOTIFY_FIELD_STATUS_STRING=11;
const JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR=12;
const JOB_NOTIFY_FIELD_DOCUMENT=13;
const JOB_NOTIFY_FIELD_PRIORITY=14;
const JOB_NOTIFY_FIELD_POSITION=15;
const JOB_NOTIFY_FIELD_SUBMITTED=16;
const JOB_NOTIFY_FIELD_START_TIME=17;
const JOB_NOTIFY_FIELD_UNTIL_TIME=18;
const JOB_NOTIFY_FIELD_TIME=19;
const JOB_NOTIFY_FIELD_TOTAL_PAGES=20;
const JOB_NOTIFY_FIELD_PAGES_PRINTED=21;
const JOB_NOTIFY_FIELD_TOTAL_BYTES=22;
const JOB_NOTIFY_FIELD_BYTES_PRINTED=23;

const JOB_ACCESS_ADMINISTER = 16;
const JOB_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | JOB_ACCESS_ADMINISTER;
const JOB_READ       = STANDARD_RIGHTS_READ     | JOB_ACCESS_ADMINISTER;
const JOB_WRITE      = STANDARD_RIGHTS_WRITE    | JOB_ACCESS_ADMINISTER;
const JOB_EXECUTE    = STANDARD_RIGHTS_EXECUTE  | JOB_ACCESS_ADMINISTER;

const PRINTER_NOTIFY_OPTIONS_REFRESH=1;
const PRINTER_ACCESS_ADMINISTER=4;
const PRINTER_ACCESS_USE=8;

const PRINTER_ERROR_INFORMATION=0x80000000;
const PRINTER_ERROR_WARNING=0x40000000;
const PRINTER_ERROR_SEVERE=0x20000000;
const PRINTER_ERROR_OUTOFPAPER=1;
const PRINTER_ERROR_JAM=2;
const PRINTER_ERROR_OUTOFTONER=4;

const PRINTER_CONTROL_PAUSE=1;
const PRINTER_CONTROL_RESUME=2;
const PRINTER_CONTROL_PURGE=3;
const PRINTER_CONTROL_SET_STATUS=4;

const PRINTER_STATUS_PAUSED = 1;
const PRINTER_STATUS_ERROR = 2;
const PRINTER_STATUS_PENDING_DELETION = 4;
const PRINTER_STATUS_PAPER_JAM = 8;
const PRINTER_STATUS_PAPER_OUT = 0x10;
const PRINTER_STATUS_MANUAL_FEED = 0x20;
const PRINTER_STATUS_PAPER_PROBLEM = 0x40;
const PRINTER_STATUS_OFFLINE = 0x80;
const PRINTER_STATUS_IO_ACTIVE = 0x100;
const PRINTER_STATUS_BUSY = 0x200;
const PRINTER_STATUS_PRINTING = 0x400;
const PRINTER_STATUS_OUTPUT_BIN_FULL = 0x800;
const PRINTER_STATUS_NOT_AVAILABLE = 0x1000;
const PRINTER_STATUS_WAITING = 0x2000;
const PRINTER_STATUS_PROCESSING = 0x4000;
const PRINTER_STATUS_INITIALIZING = 0x8000;
const PRINTER_STATUS_WARMING_UP = 0x10000;
const PRINTER_STATUS_TONER_LOW = 0x20000;
const PRINTER_STATUS_NO_TONER = 0x40000;
const PRINTER_STATUS_PAGE_PUNT = 0x80000;
const PRINTER_STATUS_USER_INTERVENTION = 0x100000;
const PRINTER_STATUS_OUT_OF_MEMORY = 0x200000;
const PRINTER_STATUS_DOOR_OPEN = 0x400000;
const PRINTER_STATUS_SERVER_UNKNOWN = 0x800000;
const PRINTER_STATUS_POWER_SAVE = 0x1000000;

const PRINTER_ATTRIBUTE_QUEUED=1;
const PRINTER_ATTRIBUTE_DIRECT=2;
const PRINTER_ATTRIBUTE_DEFAULT=4;
const PRINTER_ATTRIBUTE_SHARED=8;
const PRINTER_ATTRIBUTE_NETWORK=0x10;
const PRINTER_ATTRIBUTE_HIDDEN=0x20;
const PRINTER_ATTRIBUTE_LOCAL=0x40;
const PRINTER_ATTRIBUTE_ENABLE_DEVQ=0x80;
const PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS=0x100;
const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST=0x200;
const PRINTER_ATTRIBUTE_WORK_OFFLINE=0x400;
const PRINTER_ATTRIBUTE_ENABLE_BIDI=0x800;
const PRINTER_ATTRIBUTE_RAW_ONLY=0x1000;
const PRINTER_ATTRIBUTE_PUBLISHED=0x2000;

const PRINTER_ENUM_DEFAULT=1;
const PRINTER_ENUM_LOCAL=2;
const PRINTER_ENUM_CONNECTIONS=4;
const PRINTER_ENUM_FAVORITE=4;
const PRINTER_ENUM_NAME=8;
const PRINTER_ENUM_REMOTE=16;
const PRINTER_ENUM_SHARED=32;
const PRINTER_ENUM_NETWORK=0x40;
const PRINTER_ENUM_EXPAND=0x4000;
const PRINTER_ENUM_CONTAINER=0x8000;
const PRINTER_ENUM_ICONMASK=0xff0000;
const PRINTER_ENUM_ICON1=0x10000;
const PRINTER_ENUM_ICON2=0x20000;
const PRINTER_ENUM_ICON3=0x40000;
const PRINTER_ENUM_ICON4=0x80000;
const PRINTER_ENUM_ICON5=0x100000;
const PRINTER_ENUM_ICON6=0x200000;
const PRINTER_ENUM_ICON7=0x400000;
const PRINTER_ENUM_ICON8=0x800000;

const PRINTER_NOTIFY_TYPE=0;

const PRINTER_NOTIFY_FIELD_SERVER_NAME=0;
const PRINTER_NOTIFY_FIELD_PRINTER_NAME=1;
const PRINTER_NOTIFY_FIELD_SHARE_NAME=2;
const PRINTER_NOTIFY_FIELD_PORT_NAME=3;
const PRINTER_NOTIFY_FIELD_DRIVER_NAME=4;
const PRINTER_NOTIFY_FIELD_COMMENT=5;
const PRINTER_NOTIFY_FIELD_LOCATION=6;
const PRINTER_NOTIFY_FIELD_DEVMODE=7;
const PRINTER_NOTIFY_FIELD_SEPFILE=8;
const PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR=9;
const PRINTER_NOTIFY_FIELD_PARAMETERS=10;
const PRINTER_NOTIFY_FIELD_DATATYPE=11;
const PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR=12;
const PRINTER_NOTIFY_FIELD_ATTRIBUTES=13;
const PRINTER_NOTIFY_FIELD_PRIORITY=14;
const PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY=15;
const PRINTER_NOTIFY_FIELD_START_TIME=16;
const PRINTER_NOTIFY_FIELD_UNTIL_TIME=17;
const PRINTER_NOTIFY_FIELD_STATUS=18;
const PRINTER_NOTIFY_FIELD_STATUS_STRING=19;
const PRINTER_NOTIFY_FIELD_CJOBS=20;
const PRINTER_NOTIFY_FIELD_AVERAGE_PPM=21;
const PRINTER_NOTIFY_FIELD_TOTAL_PAGES=22;
const PRINTER_NOTIFY_FIELD_PAGES_PRINTED=23;
const PRINTER_NOTIFY_FIELD_TOTAL_BYTES=24;
const PRINTER_NOTIFY_FIELD_BYTES_PRINTED=25;

const PRINTER_CHANGE_ADD_PRINTER=1;
const PRINTER_CHANGE_SET_PRINTER=2;
const PRINTER_CHANGE_DELETE_PRINTER=4;
const PRINTER_CHANGE_FAILED_CONNECTION_PRINTER=8;
const PRINTER_CHANGE_PRINTER=0xFF;
const PRINTER_CHANGE_ADD_JOB=0x100;
const PRINTER_CHANGE_SET_JOB=0x200;
const PRINTER_CHANGE_DELETE_JOB=0x400;
const PRINTER_CHANGE_WRITE_JOB=0x800;
const PRINTER_CHANGE_JOB=0xFF00;
const PRINTER_CHANGE_ADD_FORM=0x10000;
const PRINTER_CHANGE_SET_FORM=0x20000;
const PRINTER_CHANGE_DELETE_FORM=0x40000;
const PRINTER_CHANGE_FORM=0x70000;
const PRINTER_CHANGE_ADD_PORT=0x100000;
const PRINTER_CHANGE_CONFIGURE_PORT=0x200000;
const PRINTER_CHANGE_DELETE_PORT=0x400000;
const PRINTER_CHANGE_PORT=0x700000;
const PRINTER_CHANGE_ADD_PRINT_PROCESSOR=0x1000000;
const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR=0x4000000;
const PRINTER_CHANGE_PRINT_PROCESSOR=0x7000000;
const PRINTER_CHANGE_ADD_PRINTER_DRIVER=0x10000000;
const PRINTER_CHANGE_SET_PRINTER_DRIVER=0x20000000;
const PRINTER_CHANGE_DELETE_PRINTER_DRIVER=0x40000000;
const PRINTER_CHANGE_PRINTER_DRIVER=0x70000000;
const PRINTER_CHANGE_TIMEOUT=0x80000000;
const PRINTER_CHANGE_ALL=0x7777FFFF;

const PRINTER_NOTIFY_INFO_DISCARDED=1;
const PRINTER_ALL_ACCESS=(STANDARD_RIGHTS_REQUIRED|PRINTER_ACCESS_ADMINISTER|PRINTER_ACCESS_USE);
const PRINTER_READ=(STANDARD_RIGHTS_READ|PRINTER_ACCESS_USE);
const PRINTER_WRITE=(STANDARD_RIGHTS_WRITE|PRINTER_ACCESS_USE);
const PRINTER_EXECUTE=(STANDARD_RIGHTS_EXECUTE|PRINTER_ACCESS_USE);
const NO_PRIORITY=0;
const MAX_PRIORITY=99;
const MIN_PRIORITY=1;
const DEF_PRIORITY=1;
const PORT_TYPE_WRITE=1;
const PORT_TYPE_READ=2;
const PORT_TYPE_REDIRECTED=4;
const PORT_TYPE_NET_ATTACHED=8;
const SERVER_ACCESS_ADMINISTER=1;
const SERVER_ACCESS_ENUMERATE=2;

const SERVER_ALL_ACCESS=(STANDARD_RIGHTS_REQUIRED|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE);
const SERVER_READ=(STANDARD_RIGHTS_READ|SERVER_ACCESS_ENUMERATE);
const SERVER_WRITE=(STANDARD_RIGHTS_WRITE|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE);
const SERVER_EXECUTE=(STANDARD_RIGHTS_EXECUTE|SERVER_ACCESS_ENUMERATE);

const PORT_STATUS_TYPE_ERROR=1;
const PORT_STATUS_TYPE_WARNING=2;
const PORT_STATUS_TYPE_INFO=3;

const PORT_STATUS_OFFLINE=1;
const PORT_STATUS_PAPER_JAM=2;
const PORT_STATUS_PAPER_OUT=3;
const PORT_STATUS_OUTPUT_BIN_FULL=4;
const PORT_STATUS_PAPER_PROBLEM=5;
const PORT_STATUS_NO_TONER=6;
const PORT_STATUS_DOOR_OPEN=7;
const PORT_STATUS_USER_INTERVENTION=8;
const PORT_STATUS_OUT_OF_MEMORY=9;
const PORT_STATUS_TONER_LOW=10;
const PORT_STATUS_WARMING_UP=11;
const PORT_STATUS_POWER_SAVE=12;

struct ADDJOB_INFO_1A {
	LPSTR Path;
	DWORD JobId;
}
alias ADDJOB_INFO_1A* PADDJOB_INFO_1A, LPADDJOB_INFO_1A;

struct ADDJOB_INFO_1W {
	LPWSTR Path;
	DWORD JobId;
}
alias ADDJOB_INFO_1W* PADDJOB_INFO_1W, LPADDJOB_INFO_1W;

struct DATATYPES_INFO_1A {
	LPSTR pName;
}
alias DATATYPES_INFO_1A* PDATATYPES_INFO_1A, LPDATATYPES_INFO_1A;

struct DATATYPES_INFO_1W {
	LPWSTR pName;
}
alias DATATYPES_INFO_1W* PDATATYPES_INFO_1W, LPDATATYPES_INFO_1W;

struct JOB_INFO_1A {
	DWORD JobId;
	LPSTR pPrinterName;
	LPSTR pMachineName;
	LPSTR pUserName;
	LPSTR pDocument;
	LPSTR pDatatype;
	LPSTR pStatus;
	DWORD Status;
	DWORD Priority;
	DWORD Position;
	DWORD TotalPages;
	DWORD PagesPrinted;
	SYSTEMTIME Submitted;
}
alias JOB_INFO_1A* PJOB_INFO_1A, LPJOB_INFO_1A;

struct JOB_INFO_1W {
	DWORD JobId;
	LPWSTR pPrinterName;
	LPWSTR pMachineName;
	LPWSTR pUserName;
	LPWSTR pDocument;
	LPWSTR pDatatype;
	LPWSTR pStatus;
	DWORD Status;
	DWORD Priority;
	DWORD Position;
	DWORD TotalPages;
	DWORD PagesPrinted;
	SYSTEMTIME Submitted;
}
alias JOB_INFO_1W* PJOB_INFO_1W, LPJOB_INFO_1W;

struct JOB_INFO_2A {
	DWORD JobId;
	LPSTR pPrinterName;
	LPSTR pMachineName;
	LPSTR pUserName;
	LPSTR pDocument;
	LPSTR pNotifyName;
	LPSTR pDatatype;
	LPSTR pPrintProcessor;
	LPSTR pParameters;
	LPSTR pDriverName;
	LPDEVMODEA pDevMode;
	LPSTR pStatus;
	PSECURITY_DESCRIPTOR pSecurityDescriptor;
	DWORD Status;
	DWORD Priority;
	DWORD Position;
	DWORD StartTime;
	DWORD UntilTime;
	DWORD TotalPages;
	DWORD Size;
	SYSTEMTIME Submitted;
	DWORD Time;
	DWORD PagesPrinted;
}
alias JOB_INFO_2A* PJOB_INFO_2A, LPJOB_INFO_2A;

struct JOB_INFO_2W {
	DWORD JobId;
	LPWSTR pPrinterName;
	LPWSTR pMachineName;
	LPWSTR pUserName;
	LPWSTR pDocument;
	LPWSTR pNotifyName;
	LPWSTR pDatatype;
	LPWSTR pPrintProcessor;
	LPWSTR pParameters;
	LPWSTR pDriverName;
	LPDEVMODEW pDevMode;
	LPWSTR pStatus;
	PSECURITY_DESCRIPTOR pSecurityDescriptor;
	DWORD Status;
	DWORD Priority;
	DWORD Position;
	DWORD StartTime;
	DWORD UntilTime;
	DWORD TotalPages;
	DWORD Size;
	SYSTEMTIME Submitted;
	DWORD Time;
	DWORD PagesPrinted;
}
alias JOB_INFO_2W* PJOB_INFO_2W, LPJOB_INFO_2W;

struct DOC_INFO_1A {
	LPSTR pDocName;
	LPSTR pOutputFile;
	LPSTR pDatatype;
}
alias DOC_INFO_1A* PDOC_INFO_1A, LPDOC_INFO_1A;

struct DOC_INFO_1W {
	LPWSTR pDocName;
	LPWSTR pOutputFile;
	LPWSTR pDatatype;
}
alias DOC_INFO_1W* PDOC_INFO_1W, LPDOC_INFO_1W;

struct DOC_INFO_2A {
	LPSTR pDocName;
	LPSTR pOutputFile;
	LPSTR pDatatype;
	DWORD dwMode;
	DWORD JobId;
}
alias DOC_INFO_2A* PDOC_INFO_2A, LPDOC_INFO_2A;

struct DOC_INFO_2W {
	LPWSTR pDocName;
	LPWSTR pOutputFile;
	LPWSTR pDatatype;
	DWORD  dwMode;
	DWORD  JobId;
}
alias DOC_INFO_2W* PDOC_INFO_2W, LPDOC_INFO_2W;

struct DRIVER_INFO_1A {
	LPSTR pName;
}
alias DRIVER_INFO_1A* PDRIVER_INFO_1A, LPDRIVER_INFO_1A;

struct DRIVER_INFO_1W {
	LPWSTR pName;
}
alias DRIVER_INFO_1W* PDRIVER_INFO_1W, LPDRIVER_INFO_1W;

struct DRIVER_INFO_2A {
	DWORD cVersion;
	LPSTR pName;
	LPSTR pEnvironment;
	LPSTR pDriverPath;
	LPSTR pDataFile;
	LPSTR pConfigFile;
}
alias DRIVER_INFO_2A* PDRIVER_INFO_2A, LPDRIVER_INFO_2A;

struct DRIVER_INFO_2W {
	DWORD  cVersion;
	LPWSTR pName;
	LPWSTR pEnvironment;
	LPWSTR pDriverPath;
	LPWSTR pDataFile;
	LPWSTR pConfigFile;
}
alias DRIVER_INFO_2W* PDRIVER_INFO_2W, LPDRIVER_INFO_2W;

struct DRIVER_INFO_3A {
	DWORD cVersion;
	LPSTR pName;
	LPSTR pEnvironment;
	LPSTR pDriverPath;
	LPSTR pDataFile;
	LPSTR pConfigFile;
	LPSTR pHelpFile;
	LPSTR pDependentFiles;
	LPSTR pMonitorName;
	LPSTR pDefaultDataType;
}
alias DRIVER_INFO_3A* PDRIVER_INFO_3A, LPDRIVER_INFO_3A;

struct DRIVER_INFO_3W {
	DWORD  cVersion;
	LPWSTR pName;
	LPWSTR pEnvironment;
	LPWSTR pDriverPath;
	LPWSTR pDataFile;
	LPWSTR pConfigFile;
	LPWSTR pHelpFile;
	LPWSTR pDependentFiles;
	LPWSTR pMonitorName;
	LPWSTR pDefaultDataType;
}
alias DRIVER_INFO_3W* PDRIVER_INFO_3W, LPDRIVER_INFO_3W;

struct MONITOR_INFO_1A {
	LPSTR pName;
}
alias MONITOR_INFO_1A* PMONITOR_INFO_1A, LPMONITOR_INFO_1A;

struct MONITOR_INFO_1W {
	LPWSTR pName;
}
alias MONITOR_INFO_1W* PMONITOR_INFO_1W, LPMONITOR_INFO_1W;

struct PORT_INFO_1A {
	LPSTR pName;
}
alias PORT_INFO_1A* PPORT_INFO_1A, LPPORT_INFO_1A;

struct PORT_INFO_1W {
	LPWSTR pName;
}
alias PORT_INFO_1W* PPORT_INFO_1W, LPPORT_INFO_1W;

struct MONITOR_INFO_2A {
	LPSTR pName;
	LPSTR pEnvironment;
	LPSTR pDLLName;
}
alias MONITOR_INFO_2A* PMONITOR_INFO_2A, LPMONITOR_INFO_2A;

struct MONITOR_INFO_2W {
	LPWSTR pName;
	LPWSTR pEnvironment;
	LPWSTR pDLLName;
}
alias MONITOR_INFO_2W* PMONITOR_INFO_2W, LPMONITOR_INFO_2W;

struct PORT_INFO_2A {
	LPSTR pPortName;
	LPSTR pMonitorName;
	LPSTR pDescription;
	DWORD fPortType;
	DWORD Reserved;
}
alias PORT_INFO_2A* PPORT_INFO_2A, LPPORT_INFO_2A;

struct PORT_INFO_2W {
	LPWSTR pPortName;
	LPWSTR pMonitorName;
	LPWSTR pDescription;
	DWORD fPortType;
	DWORD Reserved;
}
alias PORT_INFO_2W* PPORT_INFO_2W, LPPORT_INFO_2W;

struct PORT_INFO_3A {
	DWORD dwStatus;
	LPSTR pszStatus;
	DWORD dwSeverity;
}
alias PORT_INFO_3A* PPORT_INFO_3A, LPPORT_INFO_3A;

struct PORT_INFO_3W {
	DWORD dwStatus;
	LPWSTR pszStatus;
	DWORD dwSeverity;
}
alias PORT_INFO_3W* PPORT_INFO_3W, LPPORT_INFO_3W;

struct PRINTER_INFO_1A {
	DWORD Flags;
	LPSTR pDescription;
	LPSTR pName;
	LPSTR pComment;
}
alias PRINTER_INFO_1A* PPRINTER_INFO_1A, LPPRINTER_INFO_1A;

struct PRINTER_INFO_1W {
	DWORD  Flags;
	LPWSTR pDescription;
	LPWSTR pName;
	LPWSTR pComment;
}
alias PRINTER_INFO_1W* PPRINTER_INFO_1W, LPPRINTER_INFO_1W;

struct PRINTER_INFO_2A {
	LPSTR pServerName;
	LPSTR pPrinterName;
	LPSTR pShareName;
	LPSTR pPortName;
	LPSTR pDriverName;
	LPSTR pComment;
	LPSTR pLocation;
	LPDEVMODEA pDevMode;
	LPSTR pSepFile;
	LPSTR pPrintProcessor;
	LPSTR pDatatype;
	LPSTR pParameters;
	PSECURITY_DESCRIPTOR pSecurityDescriptor;
	DWORD Attributes;
	DWORD Priority;
	DWORD DefaultPriority;
	DWORD StartTime;
	DWORD UntilTime;
	DWORD Status;
	DWORD cJobs;
	DWORD AveragePPM;
}
alias PRINTER_INFO_2A* PPRINTER_INFO_2A, LPPRINTER_INFO_2A;

struct PRINTER_INFO_2W {
	LPWSTR pServerName;
	LPWSTR pPrinterName;
	LPWSTR pShareName;
	LPWSTR pPortName;
	LPWSTR pDriverName;
	LPWSTR pComment;
	LPWSTR pLocation;
	LPDEVMODEW pDevMode;
	LPWSTR pSepFile;
	LPWSTR pPrintProcessor;
	LPWSTR pDatatype;
	LPWSTR pParameters;
	PSECURITY_DESCRIPTOR pSecurityDescriptor;
	DWORD Attributes;
	DWORD Priority;
	DWORD DefaultPriority;
	DWORD StartTime;
	DWORD UntilTime;
	DWORD Status;
	DWORD cJobs;
	DWORD AveragePPM;
}
alias PRINTER_INFO_2W* PPRINTER_INFO_2W, LPPRINTER_INFO_2W;

struct PRINTER_INFO_3 {
	PSECURITY_DESCRIPTOR pSecurityDescriptor;
}
alias PRINTER_INFO_3* PPRINTER_INFO_3, LPPRINTER_INFO_3;

struct PRINTER_INFO_4A {
	LPSTR pPrinterName;
	LPSTR pServerName;
	DWORD Attributes;
}
alias PRINTER_INFO_4A* PPRINTER_INFO_4A, LPPRINTER_INFO_4A;

struct PRINTER_INFO_4W {
	LPWSTR pPrinterName;
	LPWSTR pServerName;
	DWORD Attributes;
}
alias PRINTER_INFO_4W* PPRINTER_INFO_4W, LPPRINTER_INFO_4W;

struct PRINTER_INFO_5A {
	LPSTR pPrinterName;
	LPSTR pPortName;
	DWORD Attributes;
	DWORD DeviceNotSelectedTimeout;
	DWORD TransmissionRetryTimeout;
}
alias PRINTER_INFO_5A* PPRINTER_INFO_5A, LPPRINTER_INFO_5A;

struct PRINTER_INFO_5W {
	LPWSTR pPrinterName;
	LPWSTR pPortName;
	DWORD Attributes;
	DWORD DeviceNotSelectedTimeout;
	DWORD TransmissionRetryTimeout;
}
alias PRINTER_INFO_5W* PPRINTER_INFO_5W, LPPRINTER_INFO_5W;

struct PRINTER_INFO_6 {
	DWORD dwStatus;
}
alias PRINTER_INFO_6* PPRINTER_INFO_6, LPPRINTER_INFO_6;

struct PRINTPROCESSOR_INFO_1A {
	LPSTR pName;
}
alias PRINTPROCESSOR_INFO_1A* PPRINTPROCESSOR_INFO_1A, LPPRINTPROCESSOR_INFO_1A;

struct PRINTPROCESSOR_INFO_1W {
	LPWSTR pName;
}
alias PRINTPROCESSOR_INFO_1W* PPRINTPROCESSOR_INFO_1W, LPPRINTPROCESSOR_INFO_1W;

struct PRINTER_NOTIFY_INFO_DATA {
	WORD  Type;
	WORD  Field;
	DWORD Reserved;
	DWORD Id;
	union _NotifyData {
		DWORD adwData[2];
		struct Data {
			DWORD cbBuf;
			PVOID pBuf;
		}
	}
	_NotifyData NotifyData;	
}
alias PRINTER_NOTIFY_INFO_DATA* PPRINTER_NOTIFY_INFO_DATA, LPPRINTER_NOTIFY_INFO_DATA;

struct PRINTER_NOTIFY_INFO {
	DWORD Version;
	DWORD Flags;
	DWORD Count;
	PRINTER_NOTIFY_INFO_DATA aData[1];
}
alias PRINTER_NOTIFY_INFO* PPRINTER_NOTIFY_INFO, LPPRINTER_NOTIFY_INFO;

struct FORM_INFO_1A {
	DWORD Flags;
	LPSTR pName;
	SIZEL Size;
	RECTL ImageableArea;
}
alias FORM_INFO_1A* PFORM_INFO_1A, LPFORM_INFO_1A;

struct FORM_INFO_1W {
	DWORD  Flags;
	LPWSTR pName;
	SIZEL  Size;
	RECTL  ImageableArea;
}
alias FORM_INFO_1W* PFORM_INFO_1W, LPFORM_INFO_1W;

struct PRINTER_DEFAULTSA {
	LPSTR       pDatatype;
	LPDEVMODE   pDevMode;
	ACCESS_MASK DesiredAccess;
}
alias PRINTER_DEFAULTSA* PPRINTER_DEFAULTSA, LPPRINTER_DEFAULTSA;

struct PRINTER_DEFAULTSW {
	LPWSTR pDatatype;
	LPDEVMODE pDevMode;
	ACCESS_MASK DesiredAccess;
}
alias PRINTER_DEFAULTSW* PPRINTER_DEFAULTSW, LPPRINTER_DEFAULTSW;

extern (Windows):
BOOL AbortPrinter(HANDLE);
BOOL AddFormA(HANDLE, DWORD, PBYTE);
BOOL AddFormW(HANDLE, DWORD, PBYTE);
BOOL AddJobA(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
BOOL AddJobW(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
BOOL AddMonitorA(LPSTR, DWORD, PBYTE);
BOOL AddMonitorW(LPWSTR, DWORD, PBYTE);
BOOL AddPortA(LPSTR, HWND, LPSTR);
BOOL AddPortW(LPWSTR, HWND, LPWSTR);
HANDLE AddPrinterA(LPSTR, DWORD, PBYTE);
HANDLE AddPrinterW(LPWSTR, DWORD, PBYTE);
BOOL AddPrinterConnectionA(LPSTR);
BOOL AddPrinterConnectionW(LPWSTR);
BOOL AddPrinterDriverA(LPSTR, DWORD, PBYTE);
BOOL AddPrinterDriverW(LPWSTR, DWORD, PBYTE);
BOOL AddPrintProcessorA(LPSTR, LPSTR, LPSTR, LPSTR);
BOOL AddPrintProcessorW(LPWSTR, LPWSTR, LPWSTR, LPWSTR);
BOOL AddPrintProvidorA(LPSTR, DWORD, PBYTE);
BOOL AddPrintProvidorW(LPWSTR, DWORD, PBYTE);
LONG AdvancedDocumentPropertiesA(HWND, HANDLE, LPSTR, PDEVMODE, PDEVMODEA);
LONG AdvancedDocumentPropertiesW(HWND, HANDLE, LPWSTR, PDEVMODE, PDEVMODEW);
BOOL ClosePrinter(HANDLE);
BOOL ConfigurePortA(LPSTR, HWND, LPSTR);
BOOL ConfigurePortW(LPWSTR, HWND, LPWSTR);
HANDLE ConnectToPrinterDlg(HWND, DWORD);
BOOL DeleteFormA(HANDLE, LPSTR);
BOOL DeleteFormW(HANDLE, LPWSTR);
BOOL DeleteMonitorA(LPSTR, LPSTR, LPSTR);
BOOL DeleteMonitorW(LPWSTR, LPWSTR, LPWSTR);
BOOL DeletePortA(LPSTR, HWND, LPSTR);
BOOL DeletePortW(LPWSTR, HWND, LPWSTR);
BOOL DeletePrinter(HANDLE);
BOOL DeletePrinterConnectionA(LPSTR);
BOOL DeletePrinterConnectionW(LPWSTR);
DWORD DeletePrinterDataA(HANDLE, LPSTR);
DWORD DeletePrinterDataW(HANDLE, LPWSTR);
BOOL DeletePrinterDriverA(LPSTR, LPSTR, LPSTR);
BOOL DeletePrinterDriverW(LPWSTR, LPWSTR, LPWSTR);
BOOL DeletePrintProcessorA(LPSTR, LPSTR, LPSTR);
BOOL DeletePrintProcessorW(LPWSTR, LPWSTR, LPWSTR);
BOOL DeletePrintProvidorA(LPSTR, LPSTR, LPSTR);
BOOL DeletePrintProvidorW(LPWSTR, LPWSTR, LPWSTR);
LONG DocumentPropertiesA(HWND, HANDLE, LPSTR, PDEVMODEA, PDEVMODEA, DWORD);
LONG DocumentPropertiesW(HWND, HANDLE, LPWSTR, PDEVMODEW, PDEVMODEW, DWORD);
BOOL EndDocPrinter(HANDLE);
BOOL EndPagePrinter(HANDLE);
BOOL EnumFormsA(HANDLE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumFormsW(HANDLE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumJobsA(HANDLE, DWORD, DWORD, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumJobsW(HANDLE, DWORD, DWORD, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumMonitorsA(LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumMonitorsW(LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPortsA(LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPortsW(LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
DWORD EnumPrinterDataA(HANDLE, DWORD, LPSTR, DWORD, PDWORD, PDWORD, PBYTE, DWORD, PDWORD);
DWORD EnumPrinterDataW(HANDLE, DWORD, LPWSTR, DWORD, PDWORD, PDWORD, PBYTE, DWORD, PDWORD);
BOOL EnumPrinterDriversA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrinterDriversW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintersA(DWORD, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintersW(DWORD, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintProcessorDatatypesA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintProcessorDatatypesW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintProcessorsA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL EnumPrintProcessorsW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
BOOL FindClosePrinterChangeNotification(HANDLE);
HANDLE FindFirstPrinterChangeNotification(HANDLE, DWORD, DWORD, PVOID);
HANDLE FindNextPrinterChangeNotification(HANDLE, PDWORD, PVOID, PVOID*);
BOOL FreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO);

static if (_WIN32_WINNT >= 0x0500) {
BOOL GetDefaultPrinterA(LPSTR, LPDWORD);
BOOL GetDefaultPrinterW(LPWSTR, LPDWORD);
}

BOOL GetFormA(HANDLE, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
BOOL GetFormW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
BOOL GetJobA(HANDLE, DWORD, DWORD, PBYTE, DWORD, PDWORD);
BOOL GetJobW(HANDLE, DWORD, DWORD, PBYTE, DWORD, PDWORD);
BOOL GetPrinterA(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
BOOL GetPrinterW(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDataA(HANDLE, LPSTR, PDWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDataW(HANDLE, LPWSTR, PDWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDriverA(HANDLE, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDriverW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDriverDirectoryA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrinterDriverDirectoryW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrintProcessorDirectoryA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
DWORD GetPrintProcessorDirectoryW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
BOOL OpenPrinterA(LPSTR, PHANDLE, LPPRINTER_DEFAULTSA);
BOOL OpenPrinterW(LPWSTR, PHANDLE, LPPRINTER_DEFAULTSW);
DWORD PrinterMessageBoxA(HANDLE, DWORD, HWND, LPSTR, LPSTR, DWORD);
DWORD PrinterMessageBoxW(HANDLE, DWORD, HWND, LPWSTR, LPWSTR, DWORD);
BOOL PrinterProperties(HWND, HANDLE);
BOOL ReadPrinter(HANDLE, PVOID, DWORD, PDWORD);
BOOL ResetPrinterA(HANDLE, LPPRINTER_DEFAULTSA);
BOOL ResetPrinterW(HANDLE, LPPRINTER_DEFAULTSW);
BOOL ScheduleJob(HANDLE, DWORD);
BOOL SetFormA(HANDLE, LPSTR, DWORD, PBYTE);
BOOL SetFormW(HANDLE, LPWSTR, DWORD, PBYTE);
BOOL SetJobA(HANDLE, DWORD, DWORD, PBYTE, DWORD);
BOOL SetJobW(HANDLE, DWORD, DWORD, PBYTE, DWORD);
BOOL SetPrinterA(HANDLE, DWORD, PBYTE, DWORD);
BOOL SetPrinterW(HANDLE, DWORD, PBYTE, DWORD);
BOOL SetPrinterDataA(HANDLE, LPSTR, DWORD, PBYTE, DWORD);
BOOL SetPrinterDataW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD);
DWORD StartDocPrinterA(HANDLE, DWORD, PBYTE);
DWORD StartDocPrinterW(HANDLE, DWORD, PBYTE);
BOOL StartPagePrinter(HANDLE);
DWORD WaitForPrinterChange(HANDLE, DWORD);
BOOL WritePrinter(HANDLE, PVOID, DWORD, PDWORD);

version(Unicode) {

alias JOB_INFO_1W JOB_INFO_1;
alias JOB_INFO_2W JOB_INFO_2;
alias ADDJOB_INFO_1W ADDJOB_INFO_1;
alias DATATYPES_INFO_1W DATATYPES_INFO_1;
alias MONITOR_INFO_1W MONITOR_INFO_1;
alias MONITOR_INFO_2W MONITOR_INFO_2;
alias DOC_INFO_1W DOC_INFO_1;
alias DOC_INFO_2W DOC_INFO_2;
alias PORT_INFO_1W PORT_INFO_1;
alias PORT_INFO_2W PORT_INFO_2;
alias PORT_INFO_3W PORT_INFO_3;
alias DRIVER_INFO_2W DRIVER_INFO_2;
alias PRINTER_INFO_1W PRINTER_INFO_1;
alias PRINTER_INFO_2W PRINTER_INFO_2;
alias PRINTER_INFO_4W PRINTER_INFO_4;
alias PRINTER_INFO_5W PRINTER_INFO_5;
alias PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
alias FORM_INFO_1W FORM_INFO_1;
alias PRINTER_DEFAULTSW PRINTER_DEFAULTS;

alias AddFormW AddForm;
alias AddJobW AddJob;
alias AddMonitorW AddMonitor;
alias AddPortW AddPort;
alias AddPrinterW AddPrinter;
alias AddPrinterConnectionW AddPrinterConnection;
alias AddPrinterDriverW AddPrinterDriver;
alias AddPrintProcessorW AddPrintProcessor;
alias AddPrintProvidorW AddPrintProvidor;
alias AdvancedDocumentPropertiesW AdvancedDocumentProperties;
alias ConfigurePortW ConfigurePort;
alias DeleteFormW DeleteForm;
alias DeleteMonitorW DeleteMonitor;
alias DeletePortW DeletePort;
alias DeletePrinterConnectionW DeletePrinterConnection;
alias DeletePrinterDataW DeletePrinterData;
alias DeletePrinterDriverW DeletePrinterDriver;
alias DeletePrintProcessorW DeletePrintProcessor;
alias DeletePrintProvidorW DeletePrintProvidor;
alias DocumentPropertiesW DocumentProperties;
alias EnumFormsW EnumForms;
alias EnumJobsW EnumJobs;
alias EnumMonitorsW EnumMonitors;
alias EnumPortsW EnumPorts;
alias EnumPrinterDataW EnumPrinterData;
alias EnumPrinterDriversW EnumPrinterDrivers;
alias EnumPrintersW EnumPrinters;
alias EnumPrintProcessorDatatypesW EnumPrintProcessorDatatypes;
alias EnumPrintProcessorsW EnumPrintProcessors;

static if (_WIN32_WINNT >= 0x0500) {
alias GetDefaultPrinterW GetDefaultPrinter;
}

alias GetFormW GetForm;
alias GetJobW GetJob;
alias GetPrinterW GetPrinter;
alias GetPrinterDataW GetPrinterData;
alias GetPrinterDriverW GetPrinterDriver;
alias GetPrinterDriverDirectoryW GetPrinterDriverDirectory;
alias GetPrintProcessorDirectoryW GetPrintProcessorDirectory;
alias OpenPrinterW OpenPrinter;
alias PrinterMessageBoxW PrinterMessageBox;
alias ResetPrinterW ResetPrinter;
alias SetFormW SetForm;
alias SetJobW SetJob;
alias SetPrinterW SetPrinter;
alias SetPrinterDataW SetPrinterData;
alias StartDocPrinterW StartDocPrinter;

} else {

alias JOB_INFO_1A JOB_INFO_1;
alias JOB_INFO_2A JOB_INFO_2;
alias ADDJOB_INFO_1A ADDJOB_INFO_1;
alias DATATYPES_INFO_1A DATATYPES_INFO_1;
alias MONITOR_INFO_1A MONITOR_INFO_1;
alias MONITOR_INFO_2A MONITOR_INFO_2;
alias DOC_INFO_1A DOC_INFO_1;
alias DOC_INFO_2A DOC_INFO_2;
alias PORT_INFO_1A PORT_INFO_1;
alias PORT_INFO_2A PORT_INFO_2;
alias PORT_INFO_3A PORT_INFO_3;
alias DRIVER_INFO_2A DRIVER_INFO_2;
alias PRINTER_INFO_1A PRINTER_INFO_1;
alias PRINTER_INFO_2A PRINTER_INFO_2;
alias PRINTER_INFO_4A PRINTER_INFO_4;
alias PRINTER_INFO_5A PRINTER_INFO_5;
alias PRINTPROCESSOR_INFO_1A PRINTPROCESSOR_INFO_1;
alias FORM_INFO_1A FORM_INFO_1;
alias PRINTER_DEFAULTSA PRINTER_DEFAULTS;

alias AddFormA AddForm;
alias AddJobA AddJob;
alias AddMonitorA AddMonitor;
alias AddPortA AddPort;
alias AddPrinterA AddPrinter;
alias AddPrinterConnectionA AddPrinterConnection;
alias AddPrinterDriverA AddPrinterDriver;
alias AddPrintProcessorA AddPrintProcessor;
alias AddPrintProvidorA AddPrintProvidor;
alias AdvancedDocumentPropertiesA AdvancedDocumentProperties;
alias ConfigurePortA ConfigurePort;
alias DeleteFormA DeleteForm;
alias DeleteMonitorA DeleteMonitor;
alias DeletePortA DeletePort;
alias DeletePrinterConnectionA DeletePrinterConnection;
alias DeletePrinterDataA DeletePrinterData;
alias DeletePrinterDriverA DeletePrinterDriver;
alias DeletePrintProcessorA DeletePrintProcessor;
alias DeletePrintProvidorA DeletePrintProvidor;
alias DocumentPropertiesA DocumentProperties;
alias EnumFormsA EnumForms;
alias EnumJobsA EnumJobs;
alias EnumMonitorsA EnumMonitors;
alias EnumPortsA EnumPorts;
alias EnumPrinterDataA EnumPrinterData;
alias EnumPrinterDriversA EnumPrinterDrivers;
alias EnumPrintersA EnumPrinters;
alias EnumPrintProcessorDatatypesA EnumPrintProcessorDatatypes;
alias EnumPrintProcessorsA EnumPrintProcessors;

static if (_WIN32_WINNT >= 0x0500) {
alias GetDefaultPrinterA GetDefaultPrinter;
}

alias GetFormA GetForm;
alias GetJobA GetJob;
alias GetPrinterA GetPrinter;
alias GetPrinterDataA GetPrinterData;
alias GetPrinterDriverA GetPrinterDriver;
alias GetPrinterDriverDirectoryA GetPrinterDriverDirectory;
alias GetPrintProcessorDirectoryA GetPrintProcessorDirectory;
alias OpenPrinterA OpenPrinter;
alias PrinterMessageBoxA PrinterMessageBox;
alias ResetPrinterA ResetPrinter;
alias SetFormA SetForm;
alias SetJobA SetJob;
alias SetPrinterA SetPrinter;
alias SetPrinterDataA SetPrinterData;
alias StartDocPrinterA StartDocPrinter;
}

alias JOB_INFO_1* PJOB_INFO_1, LPJOB_INFO_1;
alias JOB_INFO_2* PJOB_INFO_2, LPJOB_INFO_2;
alias ADDJOB_INFO_1* PADDJOB_INFO_1, LPADDJOB_INFO_1;
alias DATATYPES_INFO_1* PDATATYPES_INFO_1, LPDATATYPES_INFO_1;
alias MONITOR_INFO_1* PMONITOR_INFO_1, LPMONITOR_INFO_1;
alias MONITOR_INFO_2* PMONITOR_INFO_2, LPMONITOR_INFO_2;
alias DOC_INFO_1* PDOC_INFO_1, LPDOC_INFO_1;
alias DOC_INFO_2* PDOC_INFO_2, LPDOC_INFO_2;
alias PORT_INFO_1* PPORT_INFO_1, LPPORT_INFO_1;
alias PORT_INFO_2* PPORT_INFO_2, LPPORT_INFO_2;
alias PORT_INFO_3* PPORT_INFO_3, LPPORT_INFO_3;
alias DRIVER_INFO_2* PDRIVER_INFO_2, LPDRIVER_INFO_2;
alias PRINTER_INFO_1* PPRINTER_INFO_1, LPPRINTER_INFO_1;
alias PRINTER_INFO_2* PPRINTER_INFO_2, LPPRINTER_INFO_2;
alias PRINTER_INFO_4* PPRINTER_INFO_4, LPPRINTER_INFO_4;
alias PRINTER_INFO_5* PPRINTER_INFO_5, LPPRINTER_INFO_5;
alias PRINTPROCESSOR_INFO_1* PPRINTPROCESSOR_INFO_1, LPPRINTPROCESSOR_INFO_1;
alias FORM_INFO_1* PFORM_INFO_1, LPFORM_INFO_1;
alias PRINTER_DEFAULTS* PPRINTER_DEFAULTS, LPPRINTER_DEFAULTS;
