diff fuhtark_test/include/winapi/winspool.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/winapi/winspool.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,1606 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+#ifndef _WINSPOOL_
+#define _WINSPOOL_
+
+#ifdef _WINUSER_
+#include <prsht.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  typedef struct _PRINTER_INFO_1A {
+    DWORD Flags;
+    LPSTR pDescription;
+    LPSTR pName;
+    LPSTR pComment;
+  } PRINTER_INFO_1A,*PPRINTER_INFO_1A,*LPPRINTER_INFO_1A;
+
+  typedef struct _PRINTER_INFO_1W {
+    DWORD Flags;
+    LPWSTR pDescription;
+    LPWSTR pName;
+    LPWSTR pComment;
+  } PRINTER_INFO_1W,*PPRINTER_INFO_1W,*LPPRINTER_INFO_1W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_1W PRINTER_INFO_1;
+  typedef PPRINTER_INFO_1W PPRINTER_INFO_1;
+  typedef LPPRINTER_INFO_1W LPPRINTER_INFO_1;
+#else
+  typedef PRINTER_INFO_1A PRINTER_INFO_1;
+  typedef PPRINTER_INFO_1A PPRINTER_INFO_1;
+  typedef LPPRINTER_INFO_1A LPPRINTER_INFO_1;
+#endif
+
+  typedef 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;
+  } PRINTER_INFO_2A,*PPRINTER_INFO_2A,*LPPRINTER_INFO_2A;
+
+  typedef 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;
+  } PRINTER_INFO_2W,*PPRINTER_INFO_2W,*LPPRINTER_INFO_2W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_2W PRINTER_INFO_2;
+  typedef PPRINTER_INFO_2W PPRINTER_INFO_2;
+  typedef LPPRINTER_INFO_2W LPPRINTER_INFO_2;
+#else
+  typedef PRINTER_INFO_2A PRINTER_INFO_2;
+  typedef PPRINTER_INFO_2A PPRINTER_INFO_2;
+  typedef LPPRINTER_INFO_2A LPPRINTER_INFO_2;
+#endif
+
+  typedef struct _PRINTER_INFO_3 {
+    PSECURITY_DESCRIPTOR pSecurityDescriptor;
+  } PRINTER_INFO_3,*PPRINTER_INFO_3,*LPPRINTER_INFO_3;
+
+  typedef struct _PRINTER_INFO_4A {
+    LPSTR pPrinterName;
+    LPSTR pServerName;
+    DWORD Attributes;
+  } PRINTER_INFO_4A,*PPRINTER_INFO_4A,*LPPRINTER_INFO_4A;
+
+  typedef struct _PRINTER_INFO_4W {
+    LPWSTR pPrinterName;
+    LPWSTR pServerName;
+    DWORD Attributes;
+  } PRINTER_INFO_4W,*PPRINTER_INFO_4W,*LPPRINTER_INFO_4W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_4W PRINTER_INFO_4;
+  typedef PPRINTER_INFO_4W PPRINTER_INFO_4;
+  typedef LPPRINTER_INFO_4W LPPRINTER_INFO_4;
+#else
+  typedef PRINTER_INFO_4A PRINTER_INFO_4;
+  typedef PPRINTER_INFO_4A PPRINTER_INFO_4;
+  typedef LPPRINTER_INFO_4A LPPRINTER_INFO_4;
+#endif
+
+  typedef struct _PRINTER_INFO_5A {
+    LPSTR pPrinterName;
+    LPSTR pPortName;
+    DWORD Attributes;
+    DWORD DeviceNotSelectedTimeout;
+    DWORD TransmissionRetryTimeout;
+  } PRINTER_INFO_5A,*PPRINTER_INFO_5A,*LPPRINTER_INFO_5A;
+
+  typedef struct _PRINTER_INFO_5W {
+    LPWSTR pPrinterName;
+    LPWSTR pPortName;
+    DWORD Attributes;
+    DWORD DeviceNotSelectedTimeout;
+    DWORD TransmissionRetryTimeout;
+  } PRINTER_INFO_5W,*PPRINTER_INFO_5W,*LPPRINTER_INFO_5W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_5W PRINTER_INFO_5;
+  typedef PPRINTER_INFO_5W PPRINTER_INFO_5;
+  typedef LPPRINTER_INFO_5W LPPRINTER_INFO_5;
+#else
+  typedef PRINTER_INFO_5A PRINTER_INFO_5;
+  typedef PPRINTER_INFO_5A PPRINTER_INFO_5;
+  typedef LPPRINTER_INFO_5A LPPRINTER_INFO_5;
+#endif
+
+  typedef struct _PRINTER_INFO_6 {
+    DWORD dwStatus;
+  } PRINTER_INFO_6,*PPRINTER_INFO_6,*LPPRINTER_INFO_6;
+
+  typedef struct _PRINTER_INFO_7A {
+    LPSTR pszObjectGUID;
+    DWORD dwAction;
+  } PRINTER_INFO_7A,*PPRINTER_INFO_7A,*LPPRINTER_INFO_7A;
+
+  typedef struct _PRINTER_INFO_7W {
+    LPWSTR pszObjectGUID;
+    DWORD dwAction;
+  } PRINTER_INFO_7W,*PPRINTER_INFO_7W,*LPPRINTER_INFO_7W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_7W PRINTER_INFO_7;
+  typedef PPRINTER_INFO_7W PPRINTER_INFO_7;
+  typedef LPPRINTER_INFO_7W LPPRINTER_INFO_7;
+#else
+  typedef PRINTER_INFO_7A PRINTER_INFO_7;
+  typedef PPRINTER_INFO_7A PPRINTER_INFO_7;
+  typedef LPPRINTER_INFO_7A LPPRINTER_INFO_7;
+#endif
+
+#define DSPRINT_PUBLISH 0x00000001
+#define DSPRINT_UPDATE 0x00000002
+#define DSPRINT_UNPUBLISH 0x00000004
+#define DSPRINT_REPUBLISH 0x00000008
+#define DSPRINT_PENDING 0x80000000
+
+  typedef struct _PRINTER_INFO_8A {
+    LPDEVMODEA pDevMode;
+  } PRINTER_INFO_8A,*PPRINTER_INFO_8A,*LPPRINTER_INFO_8A;
+
+  typedef struct _PRINTER_INFO_8W {
+    LPDEVMODEW pDevMode;
+  } PRINTER_INFO_8W,*PPRINTER_INFO_8W,*LPPRINTER_INFO_8W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_8W PRINTER_INFO_8;
+  typedef PPRINTER_INFO_8W PPRINTER_INFO_8;
+  typedef LPPRINTER_INFO_8W LPPRINTER_INFO_8;
+#else
+  typedef PRINTER_INFO_8A PRINTER_INFO_8;
+  typedef PPRINTER_INFO_8A PPRINTER_INFO_8;
+  typedef LPPRINTER_INFO_8A LPPRINTER_INFO_8;
+#endif
+
+  typedef struct _PRINTER_INFO_9A {
+    LPDEVMODEA pDevMode;
+  } PRINTER_INFO_9A,*PPRINTER_INFO_9A,*LPPRINTER_INFO_9A;
+
+  typedef struct _PRINTER_INFO_9W {
+    LPDEVMODEW pDevMode;
+  } PRINTER_INFO_9W,*PPRINTER_INFO_9W,*LPPRINTER_INFO_9W;
+
+#ifdef UNICODE
+  typedef PRINTER_INFO_9W PRINTER_INFO_9;
+  typedef PPRINTER_INFO_9W PPRINTER_INFO_9;
+  typedef LPPRINTER_INFO_9W LPPRINTER_INFO_9;
+#else
+  typedef PRINTER_INFO_9A PRINTER_INFO_9;
+  typedef PPRINTER_INFO_9A PPRINTER_INFO_9;
+  typedef LPPRINTER_INFO_9A LPPRINTER_INFO_9;
+#endif
+
+#define PRINTER_CONTROL_PAUSE 1
+#define PRINTER_CONTROL_RESUME 2
+#define PRINTER_CONTROL_PURGE 3
+#define PRINTER_CONTROL_SET_STATUS 4
+
+#define PRINTER_STATUS_PAUSED 0x00000001
+#define PRINTER_STATUS_ERROR 0x00000002
+#define PRINTER_STATUS_PENDING_DELETION 0x00000004
+#define PRINTER_STATUS_PAPER_JAM 0x00000008
+#define PRINTER_STATUS_PAPER_OUT 0x00000010
+#define PRINTER_STATUS_MANUAL_FEED 0x00000020
+#define PRINTER_STATUS_PAPER_PROBLEM 0x00000040
+#define PRINTER_STATUS_OFFLINE 0x00000080
+#define PRINTER_STATUS_IO_ACTIVE 0x00000100
+#define PRINTER_STATUS_BUSY 0x00000200
+#define PRINTER_STATUS_PRINTING 0x00000400
+#define PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800
+#define PRINTER_STATUS_NOT_AVAILABLE 0x00001000
+#define PRINTER_STATUS_WAITING 0x00002000
+#define PRINTER_STATUS_PROCESSING 0x00004000
+#define PRINTER_STATUS_INITIALIZING 0x00008000
+#define PRINTER_STATUS_WARMING_UP 0x00010000
+#define PRINTER_STATUS_TONER_LOW 0x00020000
+#define PRINTER_STATUS_NO_TONER 0x00040000
+#define PRINTER_STATUS_PAGE_PUNT 0x00080000
+#define PRINTER_STATUS_USER_INTERVENTION 0x00100000
+#define PRINTER_STATUS_OUT_OF_MEMORY 0x00200000
+#define PRINTER_STATUS_DOOR_OPEN 0x00400000
+#define PRINTER_STATUS_SERVER_UNKNOWN 0x00800000
+#define PRINTER_STATUS_POWER_SAVE 0x01000000
+
+#define PRINTER_ATTRIBUTE_QUEUED 0x00000001
+#define PRINTER_ATTRIBUTE_DIRECT 0x00000002
+#define PRINTER_ATTRIBUTE_DEFAULT 0x00000004
+#define PRINTER_ATTRIBUTE_SHARED 0x00000008
+#define PRINTER_ATTRIBUTE_NETWORK 0x00000010
+#define PRINTER_ATTRIBUTE_HIDDEN 0x00000020
+#define PRINTER_ATTRIBUTE_LOCAL 0x00000040
+
+#define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x00000080
+#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x00000100
+#define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200
+
+#define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x00000400
+#define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800
+#define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000
+#define PRINTER_ATTRIBUTE_PUBLISHED 0x00002000
+#define PRINTER_ATTRIBUTE_FAX 0x00004000
+#define PRINTER_ATTRIBUTE_TS 0x00008000
+
+#define NO_PRIORITY 0
+#define MAX_PRIORITY 99
+#define MIN_PRIORITY 1
+#define DEF_PRIORITY 1
+
+  typedef 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;
+  } JOB_INFO_1A,*PJOB_INFO_1A,*LPJOB_INFO_1A;
+
+  typedef 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;
+  } JOB_INFO_1W,*PJOB_INFO_1W,*LPJOB_INFO_1W;
+
+#ifdef UNICODE
+  typedef JOB_INFO_1W JOB_INFO_1;
+  typedef PJOB_INFO_1W PJOB_INFO_1;
+  typedef LPJOB_INFO_1W LPJOB_INFO_1;
+#else
+  typedef JOB_INFO_1A JOB_INFO_1;
+  typedef PJOB_INFO_1A PJOB_INFO_1;
+  typedef LPJOB_INFO_1A LPJOB_INFO_1;
+#endif
+
+  typedef 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;
+  } JOB_INFO_2A,*PJOB_INFO_2A,*LPJOB_INFO_2A;
+
+  typedef 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;
+  } JOB_INFO_2W,*PJOB_INFO_2W,*LPJOB_INFO_2W;
+
+#ifdef UNICODE
+  typedef JOB_INFO_2W JOB_INFO_2;
+  typedef PJOB_INFO_2W PJOB_INFO_2;
+  typedef LPJOB_INFO_2W LPJOB_INFO_2;
+#else
+  typedef JOB_INFO_2A JOB_INFO_2;
+  typedef PJOB_INFO_2A PJOB_INFO_2;
+  typedef LPJOB_INFO_2A LPJOB_INFO_2;
+#endif
+
+  typedef struct _JOB_INFO_3 {
+    DWORD JobId;
+    DWORD NextJobId;
+    DWORD Reserved;
+  } JOB_INFO_3,*PJOB_INFO_3,*LPJOB_INFO_3;
+
+#define JOB_CONTROL_PAUSE 1
+#define JOB_CONTROL_RESUME 2
+#define JOB_CONTROL_CANCEL 3
+#define JOB_CONTROL_RESTART 4
+#define JOB_CONTROL_DELETE 5
+#define JOB_CONTROL_SENT_TO_PRINTER 6
+#define JOB_CONTROL_LAST_PAGE_EJECTED 7
+
+#define JOB_STATUS_PAUSED 0x00000001
+#define JOB_STATUS_ERROR 0x00000002
+#define JOB_STATUS_DELETING 0x00000004
+#define JOB_STATUS_SPOOLING 0x00000008
+#define JOB_STATUS_PRINTING 0x00000010
+#define JOB_STATUS_OFFLINE 0x00000020
+#define JOB_STATUS_PAPEROUT 0x00000040
+#define JOB_STATUS_PRINTED 0x00000080
+#define JOB_STATUS_DELETED 0x00000100
+#define JOB_STATUS_BLOCKED_DEVQ 0x00000200
+#define JOB_STATUS_USER_INTERVENTION 0x00000400
+#define JOB_STATUS_RESTART 0x00000800
+#define JOB_STATUS_COMPLETE 0x00001000
+
+#define JOB_POSITION_UNSPECIFIED 0
+
+  typedef struct _ADDJOB_INFO_1A {
+    LPSTR Path;
+    DWORD JobId;
+  } ADDJOB_INFO_1A,*PADDJOB_INFO_1A,*LPADDJOB_INFO_1A;
+
+  typedef struct _ADDJOB_INFO_1W {
+    LPWSTR Path;
+    DWORD JobId;
+  } ADDJOB_INFO_1W,*PADDJOB_INFO_1W,*LPADDJOB_INFO_1W;
+
+#ifdef UNICODE
+  typedef ADDJOB_INFO_1W ADDJOB_INFO_1;
+  typedef PADDJOB_INFO_1W PADDJOB_INFO_1;
+  typedef LPADDJOB_INFO_1W LPADDJOB_INFO_1;
+#else
+  typedef ADDJOB_INFO_1A ADDJOB_INFO_1;
+  typedef PADDJOB_INFO_1A PADDJOB_INFO_1;
+  typedef LPADDJOB_INFO_1A LPADDJOB_INFO_1;
+#endif
+
+  typedef struct _DRIVER_INFO_1A {
+    LPSTR pName;
+  } DRIVER_INFO_1A,*PDRIVER_INFO_1A,*LPDRIVER_INFO_1A;
+
+  typedef struct _DRIVER_INFO_1W {
+    LPWSTR pName;
+  } DRIVER_INFO_1W,*PDRIVER_INFO_1W,*LPDRIVER_INFO_1W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_1W DRIVER_INFO_1;
+  typedef PDRIVER_INFO_1W PDRIVER_INFO_1;
+  typedef LPDRIVER_INFO_1W LPDRIVER_INFO_1;
+#else
+  typedef DRIVER_INFO_1A DRIVER_INFO_1;
+  typedef PDRIVER_INFO_1A PDRIVER_INFO_1;
+  typedef LPDRIVER_INFO_1A LPDRIVER_INFO_1;
+#endif
+
+  typedef struct _DRIVER_INFO_2A {
+    DWORD cVersion;
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDriverPath;
+    LPSTR pDataFile;
+    LPSTR pConfigFile;
+  } DRIVER_INFO_2A,*PDRIVER_INFO_2A,*LPDRIVER_INFO_2A;
+
+  typedef struct _DRIVER_INFO_2W {
+    DWORD cVersion;
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDriverPath;
+    LPWSTR pDataFile;
+    LPWSTR pConfigFile;
+  } DRIVER_INFO_2W,*PDRIVER_INFO_2W,*LPDRIVER_INFO_2W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_2W DRIVER_INFO_2;
+  typedef PDRIVER_INFO_2W PDRIVER_INFO_2;
+  typedef LPDRIVER_INFO_2W LPDRIVER_INFO_2;
+#else
+  typedef DRIVER_INFO_2A DRIVER_INFO_2;
+  typedef PDRIVER_INFO_2A PDRIVER_INFO_2;
+  typedef LPDRIVER_INFO_2A LPDRIVER_INFO_2;
+#endif
+
+  typedef struct _DRIVER_INFO_3A {
+    DWORD cVersion;
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDriverPath;
+    LPSTR pDataFile;
+    LPSTR pConfigFile;
+    LPSTR pHelpFile;
+    LPSTR pDependentFiles;
+    LPSTR pMonitorName;
+    LPSTR pDefaultDataType;
+  } DRIVER_INFO_3A,*PDRIVER_INFO_3A,*LPDRIVER_INFO_3A;
+
+  typedef struct _DRIVER_INFO_3W {
+    DWORD cVersion;
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDriverPath;
+    LPWSTR pDataFile;
+    LPWSTR pConfigFile;
+    LPWSTR pHelpFile;
+    LPWSTR pDependentFiles;
+    LPWSTR pMonitorName;
+    LPWSTR pDefaultDataType;
+  } DRIVER_INFO_3W,*PDRIVER_INFO_3W,*LPDRIVER_INFO_3W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_3W DRIVER_INFO_3;
+  typedef PDRIVER_INFO_3W PDRIVER_INFO_3;
+  typedef LPDRIVER_INFO_3W LPDRIVER_INFO_3;
+#else
+  typedef DRIVER_INFO_3A DRIVER_INFO_3;
+  typedef PDRIVER_INFO_3A PDRIVER_INFO_3;
+  typedef LPDRIVER_INFO_3A LPDRIVER_INFO_3;
+#endif
+
+  typedef struct _DRIVER_INFO_4A {
+    DWORD cVersion;
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDriverPath;
+    LPSTR pDataFile;
+    LPSTR pConfigFile;
+    LPSTR pHelpFile;
+    LPSTR pDependentFiles;
+    LPSTR pMonitorName;
+    LPSTR pDefaultDataType;
+    LPSTR pszzPreviousNames;
+  } DRIVER_INFO_4A,*PDRIVER_INFO_4A,*LPDRIVER_INFO_4A;
+
+  typedef struct _DRIVER_INFO_4W {
+    DWORD cVersion;
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDriverPath;
+    LPWSTR pDataFile;
+    LPWSTR pConfigFile;
+    LPWSTR pHelpFile;
+    LPWSTR pDependentFiles;
+    LPWSTR pMonitorName;
+    LPWSTR pDefaultDataType;
+    LPWSTR pszzPreviousNames;
+  } DRIVER_INFO_4W,*PDRIVER_INFO_4W,*LPDRIVER_INFO_4W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_4W DRIVER_INFO_4;
+  typedef PDRIVER_INFO_4W PDRIVER_INFO_4;
+  typedef LPDRIVER_INFO_4W LPDRIVER_INFO_4;
+#else
+  typedef DRIVER_INFO_4A DRIVER_INFO_4;
+  typedef PDRIVER_INFO_4A PDRIVER_INFO_4;
+  typedef LPDRIVER_INFO_4A LPDRIVER_INFO_4;
+#endif
+
+  typedef struct _DRIVER_INFO_5A {
+    DWORD cVersion;
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDriverPath;
+    LPSTR pDataFile;
+    LPSTR pConfigFile;
+    DWORD dwDriverAttributes;
+    DWORD dwConfigVersion;
+    DWORD dwDriverVersion;
+  } DRIVER_INFO_5A,*PDRIVER_INFO_5A,*LPDRIVER_INFO_5A;
+
+  typedef struct _DRIVER_INFO_5W {
+    DWORD cVersion;
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDriverPath;
+    LPWSTR pDataFile;
+    LPWSTR pConfigFile;
+    DWORD dwDriverAttributes;
+    DWORD dwConfigVersion;
+    DWORD dwDriverVersion;
+  } DRIVER_INFO_5W,*PDRIVER_INFO_5W,*LPDRIVER_INFO_5W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_5W DRIVER_INFO_5;
+  typedef PDRIVER_INFO_5W PDRIVER_INFO_5;
+  typedef LPDRIVER_INFO_5W LPDRIVER_INFO_5;
+#else
+  typedef DRIVER_INFO_5A DRIVER_INFO_5;
+  typedef PDRIVER_INFO_5A PDRIVER_INFO_5;
+  typedef LPDRIVER_INFO_5A LPDRIVER_INFO_5;
+#endif
+
+  typedef struct _DRIVER_INFO_6A {
+    DWORD cVersion;
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDriverPath;
+    LPSTR pDataFile;
+    LPSTR pConfigFile;
+    LPSTR pHelpFile;
+    LPSTR pDependentFiles;
+    LPSTR pMonitorName;
+    LPSTR pDefaultDataType;
+    LPSTR pszzPreviousNames;
+    FILETIME ftDriverDate;
+    DWORDLONG dwlDriverVersion;
+    LPSTR pszMfgName;
+    LPSTR pszOEMUrl;
+    LPSTR pszHardwareID;
+    LPSTR pszProvider;
+  } DRIVER_INFO_6A,*PDRIVER_INFO_6A,*LPDRIVER_INFO_6A;
+
+  typedef struct _DRIVER_INFO_6W {
+    DWORD cVersion;
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDriverPath;
+    LPWSTR pDataFile;
+    LPWSTR pConfigFile;
+    LPWSTR pHelpFile;
+    LPWSTR pDependentFiles;
+    LPWSTR pMonitorName;
+    LPWSTR pDefaultDataType;
+    LPWSTR pszzPreviousNames;
+    FILETIME ftDriverDate;
+    DWORDLONG dwlDriverVersion;
+    LPWSTR pszMfgName;
+    LPWSTR pszOEMUrl;
+    LPWSTR pszHardwareID;
+    LPWSTR pszProvider;
+  } DRIVER_INFO_6W,*PDRIVER_INFO_6W,*LPDRIVER_INFO_6W;
+
+#ifdef UNICODE
+  typedef DRIVER_INFO_6W DRIVER_INFO_6;
+  typedef PDRIVER_INFO_6W PDRIVER_INFO_6;
+  typedef LPDRIVER_INFO_6W LPDRIVER_INFO_6;
+#else
+  typedef DRIVER_INFO_6A DRIVER_INFO_6;
+  typedef PDRIVER_INFO_6A PDRIVER_INFO_6;
+  typedef LPDRIVER_INFO_6A LPDRIVER_INFO_6;
+#endif
+
+#define DRIVER_KERNELMODE 0x00000001
+#define DRIVER_USERMODE 0x00000002
+
+#define DPD_DELETE_UNUSED_FILES 0x00000001
+#define DPD_DELETE_SPECIFIC_VERSION 0x00000002
+#define DPD_DELETE_ALL_FILES 0x00000004
+
+#define APD_STRICT_UPGRADE 0x00000001
+#define APD_STRICT_DOWNGRADE 0x00000002
+#define APD_COPY_ALL_FILES 0x00000004
+#define APD_COPY_NEW_FILES 0x00000008
+#define APD_COPY_FROM_DIRECTORY 0x00000010
+
+  typedef struct _DOC_INFO_1A {
+    LPSTR pDocName;
+    LPSTR pOutputFile;
+    LPSTR pDatatype;
+  } DOC_INFO_1A,*PDOC_INFO_1A,*LPDOC_INFO_1A;
+
+  typedef struct _DOC_INFO_1W {
+    LPWSTR pDocName;
+    LPWSTR pOutputFile;
+    LPWSTR pDatatype;
+  } DOC_INFO_1W,*PDOC_INFO_1W,*LPDOC_INFO_1W;
+
+#ifdef UNICODE
+  typedef DOC_INFO_1W DOC_INFO_1;
+  typedef PDOC_INFO_1W PDOC_INFO_1;
+  typedef LPDOC_INFO_1W LPDOC_INFO_1;
+#else
+  typedef DOC_INFO_1A DOC_INFO_1;
+  typedef PDOC_INFO_1A PDOC_INFO_1;
+  typedef LPDOC_INFO_1A LPDOC_INFO_1;
+#endif
+
+  typedef struct _FORM_INFO_1A {
+    DWORD Flags;
+    LPSTR pName;
+    SIZEL Size;
+    RECTL ImageableArea;
+  } FORM_INFO_1A,*PFORM_INFO_1A,*LPFORM_INFO_1A;
+
+  typedef struct _FORM_INFO_1W {
+    DWORD Flags;
+    LPWSTR pName;
+    SIZEL Size;
+    RECTL ImageableArea;
+  } FORM_INFO_1W,*PFORM_INFO_1W,*LPFORM_INFO_1W;
+
+#ifdef UNICODE
+  typedef FORM_INFO_1W FORM_INFO_1;
+  typedef PFORM_INFO_1W PFORM_INFO_1;
+  typedef LPFORM_INFO_1W LPFORM_INFO_1;
+#else
+  typedef FORM_INFO_1A FORM_INFO_1;
+  typedef PFORM_INFO_1A PFORM_INFO_1;
+  typedef LPFORM_INFO_1A LPFORM_INFO_1;
+#endif
+
+  typedef struct _DOC_INFO_2A {
+    LPSTR pDocName;
+    LPSTR pOutputFile;
+    LPSTR pDatatype;
+    DWORD dwMode;
+    DWORD JobId;
+  } DOC_INFO_2A,*PDOC_INFO_2A,*LPDOC_INFO_2A;
+
+  typedef struct _DOC_INFO_2W {
+    LPWSTR pDocName;
+    LPWSTR pOutputFile;
+    LPWSTR pDatatype;
+    DWORD dwMode;
+    DWORD JobId;
+  } DOC_INFO_2W,*PDOC_INFO_2W,*LPDOC_INFO_2W;
+
+#ifdef UNICODE
+  typedef DOC_INFO_2W DOC_INFO_2;
+  typedef PDOC_INFO_2W PDOC_INFO_2;
+  typedef LPDOC_INFO_2W LPDOC_INFO_2;
+#else
+  typedef DOC_INFO_2A DOC_INFO_2;
+  typedef PDOC_INFO_2A PDOC_INFO_2;
+  typedef LPDOC_INFO_2A LPDOC_INFO_2;
+#endif
+
+#define DI_CHANNEL 1
+#define DI_READ_SPOOL_JOB 3
+
+  typedef struct _DOC_INFO_3A {
+    LPSTR pDocName;
+    LPSTR pOutputFile;
+    LPSTR pDatatype;
+    DWORD dwFlags;
+  } DOC_INFO_3A,*PDOC_INFO_3A,*LPDOC_INFO_3A;
+
+  typedef struct _DOC_INFO_3W {
+    LPWSTR pDocName;
+    LPWSTR pOutputFile;
+    LPWSTR pDatatype;
+    DWORD dwFlags;
+  } DOC_INFO_3W,*PDOC_INFO_3W,*LPDOC_INFO_3W;
+
+#ifdef UNICODE
+  typedef DOC_INFO_3W DOC_INFO_3;
+  typedef PDOC_INFO_3W PDOC_INFO_3;
+  typedef LPDOC_INFO_3W LPDOC_INFO_3;
+#else
+  typedef DOC_INFO_3A DOC_INFO_3;
+  typedef PDOC_INFO_3A PDOC_INFO_3;
+  typedef LPDOC_INFO_3A LPDOC_INFO_3;
+#endif
+
+#define DI_MEMORYMAP_WRITE 0x00000001
+
+#define FORM_USER 0x00000000
+#define FORM_BUILTIN 0x00000001
+#define FORM_PRINTER 0x00000002
+
+  typedef struct _PRINTPROCESSOR_INFO_1A {
+    LPSTR pName;
+  } PRINTPROCESSOR_INFO_1A,*PPRINTPROCESSOR_INFO_1A,*LPPRINTPROCESSOR_INFO_1A;
+
+  typedef struct _PRINTPROCESSOR_INFO_1W {
+    LPWSTR pName;
+  } PRINTPROCESSOR_INFO_1W,*PPRINTPROCESSOR_INFO_1W,*LPPRINTPROCESSOR_INFO_1W;
+
+#ifdef UNICODE
+  typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
+  typedef PPRINTPROCESSOR_INFO_1W PPRINTPROCESSOR_INFO_1;
+  typedef LPPRINTPROCESSOR_INFO_1W LPPRINTPROCESSOR_INFO_1;
+#else
+  typedef PRINTPROCESSOR_INFO_1A PRINTPROCESSOR_INFO_1;
+  typedef PPRINTPROCESSOR_INFO_1A PPRINTPROCESSOR_INFO_1;
+  typedef LPPRINTPROCESSOR_INFO_1A LPPRINTPROCESSOR_INFO_1;
+#endif
+
+  typedef struct _PRINTPROCESSOR_CAPS_1 {
+    DWORD dwLevel;
+    DWORD dwNupOptions;
+    DWORD dwPageOrderFlags;
+    DWORD dwNumberOfCopies;
+  } PRINTPROCESSOR_CAPS_1,*PPRINTPROCESSOR_CAPS_1;
+
+#define NORMAL_PRINT 0x00000000
+#define REVERSE_PRINT 0x00000001
+
+  typedef struct _PORT_INFO_1A {
+    LPSTR pName;
+  } PORT_INFO_1A,*PPORT_INFO_1A,*LPPORT_INFO_1A;
+  typedef struct _PORT_INFO_1W {
+    LPWSTR pName;
+  } PORT_INFO_1W,*PPORT_INFO_1W,*LPPORT_INFO_1W;
+
+#ifdef UNICODE
+  typedef PORT_INFO_1W PORT_INFO_1;
+  typedef PPORT_INFO_1W PPORT_INFO_1;
+  typedef LPPORT_INFO_1W LPPORT_INFO_1;
+#else
+  typedef PORT_INFO_1A PORT_INFO_1;
+  typedef PPORT_INFO_1A PPORT_INFO_1;
+  typedef LPPORT_INFO_1A LPPORT_INFO_1;
+#endif
+
+  typedef struct _PORT_INFO_2A {
+    LPSTR pPortName;
+    LPSTR pMonitorName;
+    LPSTR pDescription;
+    DWORD fPortType;
+    DWORD Reserved;
+  } PORT_INFO_2A,*PPORT_INFO_2A,*LPPORT_INFO_2A;
+
+  typedef struct _PORT_INFO_2W {
+    LPWSTR pPortName;
+    LPWSTR pMonitorName;
+    LPWSTR pDescription;
+    DWORD fPortType;
+    DWORD Reserved;
+  } PORT_INFO_2W,*PPORT_INFO_2W,*LPPORT_INFO_2W;
+
+#ifdef UNICODE
+  typedef PORT_INFO_2W PORT_INFO_2;
+  typedef PPORT_INFO_2W PPORT_INFO_2;
+  typedef LPPORT_INFO_2W LPPORT_INFO_2;
+#else
+  typedef PORT_INFO_2A PORT_INFO_2;
+  typedef PPORT_INFO_2A PPORT_INFO_2;
+  typedef LPPORT_INFO_2A LPPORT_INFO_2;
+#endif
+
+#define PORT_TYPE_WRITE 0x0001
+#define PORT_TYPE_READ 0x0002
+#define PORT_TYPE_REDIRECTED 0x0004
+#define PORT_TYPE_NET_ATTACHED 0x0008
+
+  typedef struct _PORT_INFO_3A {
+    DWORD dwStatus;
+    LPSTR pszStatus;
+    DWORD dwSeverity;
+  } PORT_INFO_3A,*PPORT_INFO_3A,*LPPORT_INFO_3A;
+
+  typedef struct _PORT_INFO_3W {
+    DWORD dwStatus;
+    LPWSTR pszStatus;
+    DWORD dwSeverity;
+  } PORT_INFO_3W,*PPORT_INFO_3W,*LPPORT_INFO_3W;
+
+#ifdef UNICODE
+  typedef PORT_INFO_3W PORT_INFO_3;
+  typedef PPORT_INFO_3W PPORT_INFO_3;
+  typedef LPPORT_INFO_3W LPPORT_INFO_3;
+#else
+  typedef PORT_INFO_3A PORT_INFO_3;
+  typedef PPORT_INFO_3A PPORT_INFO_3;
+  typedef LPPORT_INFO_3A LPPORT_INFO_3;
+#endif
+
+#define PORT_STATUS_TYPE_ERROR 1
+#define PORT_STATUS_TYPE_WARNING 2
+#define PORT_STATUS_TYPE_INFO 3
+
+#define PORT_STATUS_OFFLINE 1
+#define PORT_STATUS_PAPER_JAM 2
+#define PORT_STATUS_PAPER_OUT 3
+#define PORT_STATUS_OUTPUT_BIN_FULL 4
+#define PORT_STATUS_PAPER_PROBLEM 5
+#define PORT_STATUS_NO_TONER 6
+#define PORT_STATUS_DOOR_OPEN 7
+#define PORT_STATUS_USER_INTERVENTION 8
+#define PORT_STATUS_OUT_OF_MEMORY 9
+#define PORT_STATUS_TONER_LOW 10
+#define PORT_STATUS_WARMING_UP 11
+#define PORT_STATUS_POWER_SAVE 12
+
+  typedef struct _MONITOR_INFO_1A{
+    LPSTR pName;
+  } MONITOR_INFO_1A,*PMONITOR_INFO_1A,*LPMONITOR_INFO_1A;
+
+  typedef struct _MONITOR_INFO_1W{
+    LPWSTR pName;
+  } MONITOR_INFO_1W,*PMONITOR_INFO_1W,*LPMONITOR_INFO_1W;
+
+#ifdef UNICODE
+  typedef MONITOR_INFO_1W MONITOR_INFO_1;
+  typedef PMONITOR_INFO_1W PMONITOR_INFO_1;
+  typedef LPMONITOR_INFO_1W LPMONITOR_INFO_1;
+#else
+  typedef MONITOR_INFO_1A MONITOR_INFO_1;
+  typedef PMONITOR_INFO_1A PMONITOR_INFO_1;
+  typedef LPMONITOR_INFO_1A LPMONITOR_INFO_1;
+#endif
+
+  typedef struct _MONITOR_INFO_2A {
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDLLName;
+  } MONITOR_INFO_2A,*PMONITOR_INFO_2A,*LPMONITOR_INFO_2A;
+
+  typedef struct _MONITOR_INFO_2W {
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDLLName;
+  } MONITOR_INFO_2W,*PMONITOR_INFO_2W,*LPMONITOR_INFO_2W;
+
+#ifdef UNICODE
+  typedef MONITOR_INFO_2W MONITOR_INFO_2;
+  typedef PMONITOR_INFO_2W PMONITOR_INFO_2;
+  typedef LPMONITOR_INFO_2W LPMONITOR_INFO_2;
+#else
+  typedef MONITOR_INFO_2A MONITOR_INFO_2;
+  typedef PMONITOR_INFO_2A PMONITOR_INFO_2;
+  typedef LPMONITOR_INFO_2A LPMONITOR_INFO_2;
+#endif
+
+  typedef struct _DATATYPES_INFO_1A {
+    LPSTR pName;
+  } DATATYPES_INFO_1A,*PDATATYPES_INFO_1A,*LPDATATYPES_INFO_1A;
+
+  typedef struct _DATATYPES_INFO_1W {
+    LPWSTR pName;
+  } DATATYPES_INFO_1W,*PDATATYPES_INFO_1W,*LPDATATYPES_INFO_1W;
+
+#ifdef UNICODE
+  typedef DATATYPES_INFO_1W DATATYPES_INFO_1;
+  typedef PDATATYPES_INFO_1W PDATATYPES_INFO_1;
+  typedef LPDATATYPES_INFO_1W LPDATATYPES_INFO_1;
+#else
+  typedef DATATYPES_INFO_1A DATATYPES_INFO_1;
+  typedef PDATATYPES_INFO_1A PDATATYPES_INFO_1;
+  typedef LPDATATYPES_INFO_1A LPDATATYPES_INFO_1;
+#endif
+
+  typedef struct _PRINTER_DEFAULTSA {
+    LPSTR pDatatype;
+    LPDEVMODEA pDevMode;
+    ACCESS_MASK DesiredAccess;
+  } PRINTER_DEFAULTSA,*PPRINTER_DEFAULTSA,*LPPRINTER_DEFAULTSA;
+
+  typedef struct _PRINTER_DEFAULTSW {
+    LPWSTR pDatatype;
+    LPDEVMODEW pDevMode;
+    ACCESS_MASK DesiredAccess;
+  } PRINTER_DEFAULTSW,*PPRINTER_DEFAULTSW,*LPPRINTER_DEFAULTSW;
+
+#ifdef UNICODE
+  typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS;
+  typedef PPRINTER_DEFAULTSW PPRINTER_DEFAULTS;
+  typedef LPPRINTER_DEFAULTSW LPPRINTER_DEFAULTS;
+#else
+  typedef PRINTER_DEFAULTSA PRINTER_DEFAULTS;
+  typedef PPRINTER_DEFAULTSA PPRINTER_DEFAULTS;
+  typedef LPPRINTER_DEFAULTSA LPPRINTER_DEFAULTS;
+#endif
+
+  typedef struct _PRINTER_ENUM_VALUESA {
+    LPSTR pValueName;
+    DWORD cbValueName;
+    DWORD dwType;
+    LPBYTE pData;
+    DWORD cbData;
+  } PRINTER_ENUM_VALUESA,*PPRINTER_ENUM_VALUESA,*LPPRINTER_ENUM_VALUESA;
+
+  typedef struct _PRINTER_ENUM_VALUESW {
+    LPWSTR pValueName;
+    DWORD cbValueName;
+    DWORD dwType;
+    LPBYTE pData;
+    DWORD cbData;
+  } PRINTER_ENUM_VALUESW,*PPRINTER_ENUM_VALUESW,*LPPRINTER_ENUM_VALUESW;
+
+#ifdef UNICODE
+  typedef PRINTER_ENUM_VALUESW PRINTER_ENUM_VALUES;
+  typedef PPRINTER_ENUM_VALUESW PPRINTER_ENUM_VALUES;
+  typedef LPPRINTER_ENUM_VALUESW LPPRINTER_ENUM_VALUES;
+#else
+  typedef PRINTER_ENUM_VALUESA PRINTER_ENUM_VALUES;
+  typedef PPRINTER_ENUM_VALUESA PPRINTER_ENUM_VALUES;
+  typedef LPPRINTER_ENUM_VALUESA LPPRINTER_ENUM_VALUES;
+#endif
+
+#ifdef UNICODE
+#define EnumPrinters EnumPrintersW
+#else
+#define EnumPrinters EnumPrintersA
+#endif
+
+  WINBOOL WINAPI EnumPrintersA(DWORD Flags,LPSTR Name,DWORD Level,LPBYTE pPrinterEnum,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumPrintersW(DWORD Flags,LPWSTR Name,DWORD Level,LPBYTE pPrinterEnum,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+
+#define PRINTER_ENUM_DEFAULT 0x00000001
+#define PRINTER_ENUM_LOCAL 0x00000002
+#define PRINTER_ENUM_CONNECTIONS 0x00000004
+#define PRINTER_ENUM_FAVORITE 0x00000004
+#define PRINTER_ENUM_NAME 0x00000008
+#define PRINTER_ENUM_REMOTE 0x00000010
+#define PRINTER_ENUM_SHARED 0x00000020
+#define PRINTER_ENUM_NETWORK 0x00000040
+
+#define PRINTER_ENUM_EXPAND 0x00004000
+#define PRINTER_ENUM_CONTAINER 0x00008000
+
+#define PRINTER_ENUM_ICONMASK 0x00ff0000
+#define PRINTER_ENUM_ICON1 0x00010000
+#define PRINTER_ENUM_ICON2 0x00020000
+#define PRINTER_ENUM_ICON3 0x00040000
+#define PRINTER_ENUM_ICON4 0x00080000
+#define PRINTER_ENUM_ICON5 0x00100000
+#define PRINTER_ENUM_ICON6 0x00200000
+#define PRINTER_ENUM_ICON7 0x00400000
+#define PRINTER_ENUM_ICON8 0x00800000
+#define PRINTER_ENUM_HIDE 0x01000000
+
+#define SPOOL_FILE_PERSISTENT 0x00000001
+#define SPOOL_FILE_TEMPORARY 0x00000002
+
+#ifdef UNICODE
+#define OpenPrinter OpenPrinterW
+#define ResetPrinter ResetPrinterW
+#define SetJob SetJobW
+#define GetJob GetJobW
+#define EnumJobs EnumJobsW
+#define AddPrinter AddPrinterW
+#define SetPrinter SetPrinterW
+#define GetPrinter GetPrinterW
+#define AddPrinterDriver AddPrinterDriverW
+#define AddPrinterDriverEx AddPrinterDriverExW
+#define EnumPrinterDrivers EnumPrinterDriversW
+#define GetPrinterDriver GetPrinterDriverW
+#define GetPrinterDriverDirectory GetPrinterDriverDirectoryW
+#define DeletePrinterDriver DeletePrinterDriverW
+#define DeletePrinterDriverEx DeletePrinterDriverExW
+#define AddPrintProcessor AddPrintProcessorW
+#define EnumPrintProcessors EnumPrintProcessorsW
+#define GetPrintProcessorDirectory GetPrintProcessorDirectoryW
+#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesW
+#define DeletePrintProcessor DeletePrintProcessorW
+#define StartDocPrinter StartDocPrinterW
+#define AddJob AddJobW
+#define DocumentProperties DocumentPropertiesW
+#define AdvancedDocumentProperties AdvancedDocumentPropertiesW
+#define GetPrinterData GetPrinterDataW
+#define GetPrinterDataEx GetPrinterDataExW
+#define EnumPrinterData EnumPrinterDataW
+#define EnumPrinterDataEx EnumPrinterDataExW
+#define EnumPrinterKey EnumPrinterKeyW
+#define SetPrinterData SetPrinterDataW
+#define SetPrinterDataEx SetPrinterDataExW
+#define DeletePrinterData DeletePrinterDataW
+#define DeletePrinterDataEx DeletePrinterDataExW
+#define DeletePrinterKey DeletePrinterKeyW
+#else
+#define OpenPrinter OpenPrinterA
+#define ResetPrinter ResetPrinterA
+#define SetJob SetJobA
+#define GetJob GetJobA
+#define EnumJobs EnumJobsA
+#define AddPrinter AddPrinterA
+#define SetPrinter SetPrinterA
+#define GetPrinter GetPrinterA
+#define AddPrinterDriver AddPrinterDriverA
+#define AddPrinterDriverEx AddPrinterDriverExA
+#define EnumPrinterDrivers EnumPrinterDriversA
+#define GetPrinterDriver GetPrinterDriverA
+#define GetPrinterDriverDirectory GetPrinterDriverDirectoryA
+#define DeletePrinterDriver DeletePrinterDriverA
+#define DeletePrinterDriverEx DeletePrinterDriverExA
+#define AddPrintProcessor AddPrintProcessorA
+#define EnumPrintProcessors EnumPrintProcessorsA
+#define GetPrintProcessorDirectory GetPrintProcessorDirectoryA
+#define EnumPrintProcessorDatatypes EnumPrintProcessorDatatypesA
+#define DeletePrintProcessor DeletePrintProcessorA
+#define StartDocPrinter StartDocPrinterA
+#define AddJob AddJobA
+#define DocumentProperties DocumentPropertiesA
+#define AdvancedDocumentProperties AdvancedDocumentPropertiesA
+#define GetPrinterData GetPrinterDataA
+#define GetPrinterDataEx GetPrinterDataExA
+#define EnumPrinterData EnumPrinterDataA
+#define EnumPrinterDataEx EnumPrinterDataExA
+#define EnumPrinterKey EnumPrinterKeyA
+#define SetPrinterData SetPrinterDataA
+#define SetPrinterDataEx SetPrinterDataExA
+#define DeletePrinterData DeletePrinterDataA
+#define DeletePrinterDataEx DeletePrinterDataExA
+#define DeletePrinterKey DeletePrinterKeyA
+#endif
+
+  WINBOOL WINAPI OpenPrinterA(LPSTR pPrinterName,LPHANDLE phPrinter,LPPRINTER_DEFAULTSA pDefault);
+  WINBOOL WINAPI OpenPrinterW(LPWSTR pPrinterName,LPHANDLE phPrinter,LPPRINTER_DEFAULTSW pDefault);
+  WINBOOL WINAPI ResetPrinterA(HANDLE hPrinter,LPPRINTER_DEFAULTSA pDefault);
+  WINBOOL WINAPI ResetPrinterW(HANDLE hPrinter,LPPRINTER_DEFAULTSW pDefault);
+  WINBOOL WINAPI SetJobA(HANDLE hPrinter,DWORD JobId,DWORD Level,LPBYTE pJob,DWORD Command);
+  WINBOOL WINAPI SetJobW(HANDLE hPrinter,DWORD JobId,DWORD Level,LPBYTE pJob,DWORD Command);
+  WINBOOL WINAPI GetJobA(HANDLE hPrinter,DWORD JobId,DWORD Level,LPBYTE pJob,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetJobW(HANDLE hPrinter,DWORD JobId,DWORD Level,LPBYTE pJob,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI EnumJobsA(HANDLE hPrinter,DWORD FirstJob,DWORD NoJobs,DWORD Level,LPBYTE pJob,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumJobsW(HANDLE hPrinter,DWORD FirstJob,DWORD NoJobs,DWORD Level,LPBYTE pJob,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  HANDLE WINAPI AddPrinterA(LPSTR pName,DWORD Level,LPBYTE pPrinter);
+  HANDLE WINAPI AddPrinterW(LPWSTR pName,DWORD Level,LPBYTE pPrinter);
+  WINBOOL WINAPI DeletePrinter(HANDLE hPrinter);
+  WINBOOL WINAPI SetPrinterA(HANDLE hPrinter,DWORD Level,LPBYTE pPrinter,DWORD Command);
+  WINBOOL WINAPI SetPrinterW(HANDLE hPrinter,DWORD Level,LPBYTE pPrinter,DWORD Command);
+  WINBOOL WINAPI GetPrinterA(HANDLE hPrinter,DWORD Level,LPBYTE pPrinter,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetPrinterW(HANDLE hPrinter,DWORD Level,LPBYTE pPrinter,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI AddPrinterDriverA(LPSTR pName,DWORD Level,LPBYTE pDriverInfo);
+  WINBOOL WINAPI AddPrinterDriverW(LPWSTR pName,DWORD Level,LPBYTE pDriverInfo);
+  WINBOOL WINAPI AddPrinterDriverExA(LPSTR pName,DWORD Level,LPBYTE pDriverInfo,DWORD dwFileCopyFlags);
+  WINBOOL WINAPI AddPrinterDriverExW(LPWSTR pName,DWORD Level,LPBYTE pDriverInfo,DWORD dwFileCopyFlags);
+  WINBOOL WINAPI EnumPrinterDriversA(LPSTR pName,LPSTR pEnvironment,DWORD Level,LPBYTE pDriverInfo,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumPrinterDriversW(LPWSTR pName,LPWSTR pEnvironment,DWORD Level,LPBYTE pDriverInfo,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI GetPrinterDriverA(HANDLE hPrinter,LPSTR pEnvironment,DWORD Level,LPBYTE pDriverInfo,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetPrinterDriverW(HANDLE hPrinter,LPWSTR pEnvironment,DWORD Level,LPBYTE pDriverInfo,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetPrinterDriverDirectoryA(LPSTR pName,LPSTR pEnvironment,DWORD Level,LPBYTE pDriverDirectory,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetPrinterDriverDirectoryW(LPWSTR pName,LPWSTR pEnvironment,DWORD Level,LPBYTE pDriverDirectory,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI DeletePrinterDriverA(LPSTR pName,LPSTR pEnvironment,LPSTR pDriverName);
+  WINBOOL WINAPI DeletePrinterDriverW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pDriverName);
+  WINBOOL WINAPI DeletePrinterDriverExA(LPSTR pName,LPSTR pEnvironment,LPSTR pDriverName,DWORD dwDeleteFlag,DWORD dwVersionFlag);
+  WINBOOL WINAPI DeletePrinterDriverExW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pDriverName,DWORD dwDeleteFlag,DWORD dwVersionFlag);
+  WINBOOL WINAPI AddPrintProcessorA(LPSTR pName,LPSTR pEnvironment,LPSTR pPathName,LPSTR pPrintProcessorName);
+  WINBOOL WINAPI AddPrintProcessorW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pPathName,LPWSTR pPrintProcessorName);
+  WINBOOL WINAPI EnumPrintProcessorsA(LPSTR pName,LPSTR pEnvironment,DWORD Level,LPBYTE pPrintProcessorInfo,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumPrintProcessorsW(LPWSTR pName,LPWSTR pEnvironment,DWORD Level,LPBYTE pPrintProcessorInfo,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI GetPrintProcessorDirectoryA(LPSTR pName,LPSTR pEnvironment,DWORD Level,LPBYTE pPrintProcessorInfo,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetPrintProcessorDirectoryW(LPWSTR pName,LPWSTR pEnvironment,DWORD Level,LPBYTE pPrintProcessorInfo,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI EnumPrintProcessorDatatypesA(LPSTR pName,LPSTR pPrintProcessorName,DWORD Level,LPBYTE pDatatypes,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumPrintProcessorDatatypesW(LPWSTR pName,LPWSTR pPrintProcessorName,DWORD Level,LPBYTE pDatatypes,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI DeletePrintProcessorA(LPSTR pName,LPSTR pEnvironment,LPSTR pPrintProcessorName);
+  WINBOOL WINAPI DeletePrintProcessorW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pPrintProcessorName);
+  DWORD WINAPI StartDocPrinterA(HANDLE hPrinter,DWORD Level,LPBYTE pDocInfo);
+  DWORD WINAPI StartDocPrinterW(HANDLE hPrinter,DWORD Level,LPBYTE pDocInfo);
+  WINBOOL WINAPI StartPagePrinter(HANDLE hPrinter);
+  WINBOOL WINAPI WritePrinter(HANDLE hPrinter,LPVOID pBuf,DWORD cbBuf,LPDWORD pcWritten);
+  WINBOOL WINAPI FlushPrinter(HANDLE hPrinter,LPVOID pBuf,DWORD cbBuf,LPDWORD pcWritten,DWORD cSleep);
+  WINBOOL WINAPI EndPagePrinter(HANDLE hPrinter);
+  WINBOOL WINAPI AbortPrinter(HANDLE hPrinter);
+  WINBOOL WINAPI ReadPrinter(HANDLE hPrinter,LPVOID pBuf,DWORD cbBuf,LPDWORD pNoBytesRead);
+  WINBOOL WINAPI EndDocPrinter(HANDLE hPrinter);
+  WINBOOL WINAPI AddJobA(HANDLE hPrinter,DWORD Level,LPBYTE pData,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI AddJobW(HANDLE hPrinter,DWORD Level,LPBYTE pData,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI ScheduleJob(HANDLE hPrinter,DWORD JobId);
+  WINBOOL WINAPI PrinterProperties(HWND hWnd,HANDLE hPrinter);
+  LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter,LPSTR pDeviceName,PDEVMODEA pDevModeOutput,PDEVMODEA pDevModeInput,DWORD fMode);
+  LONG WINAPI DocumentPropertiesW(HWND hWnd,HANDLE hPrinter,LPWSTR pDeviceName,PDEVMODEW pDevModeOutput,PDEVMODEW pDevModeInput,DWORD fMode);
+  LONG WINAPI AdvancedDocumentPropertiesA(HWND hWnd,HANDLE hPrinter,LPSTR pDeviceName,PDEVMODEA pDevModeOutput,PDEVMODEA pDevModeInput);
+  LONG WINAPI AdvancedDocumentPropertiesW(HWND hWnd,HANDLE hPrinter,LPWSTR pDeviceName,PDEVMODEW pDevModeOutput,PDEVMODEW pDevModeInput);
+  LONG ExtDeviceMode(HWND hWnd,HANDLE hInst,LPDEVMODEA pDevModeOutput,LPSTR pDeviceName,LPSTR pPort,LPDEVMODEA pDevModeInput,LPSTR pProfile,DWORD fMode);
+  DWORD WINAPI GetPrinterDataA(HANDLE hPrinter,LPSTR pValueName,LPDWORD pType,LPBYTE pData,DWORD nSize,LPDWORD pcbNeeded);
+  DWORD WINAPI GetPrinterDataW(HANDLE hPrinter,LPWSTR pValueName,LPDWORD pType,LPBYTE pData,DWORD nSize,LPDWORD pcbNeeded);
+  DWORD WINAPI GetPrinterDataExA(HANDLE hPrinter,LPCSTR pKeyName,LPCSTR pValueName,LPDWORD pType,LPBYTE pData,DWORD nSize,LPDWORD pcbNeeded);
+  DWORD WINAPI GetPrinterDataExW(HANDLE hPrinter,LPCWSTR pKeyName,LPCWSTR pValueName,LPDWORD pType,LPBYTE pData,DWORD nSize,LPDWORD pcbNeeded);
+  DWORD WINAPI EnumPrinterDataA(HANDLE hPrinter,DWORD dwIndex,LPSTR pValueName,DWORD cbValueName,LPDWORD pcbValueName,LPDWORD pType,LPBYTE pData,DWORD cbData,LPDWORD pcbData);
+  DWORD WINAPI EnumPrinterDataW(HANDLE hPrinter,DWORD dwIndex,LPWSTR pValueName,DWORD cbValueName,LPDWORD pcbValueName,LPDWORD pType,LPBYTE pData,DWORD cbData,LPDWORD pcbData);
+  DWORD WINAPI EnumPrinterDataExA(HANDLE hPrinter,LPCSTR pKeyName,LPBYTE pEnumValues,DWORD cbEnumValues,LPDWORD pcbEnumValues,LPDWORD pnEnumValues);
+  DWORD WINAPI EnumPrinterDataExW(HANDLE hPrinter,LPCWSTR pKeyName,LPBYTE pEnumValues,DWORD cbEnumValues,LPDWORD pcbEnumValues,LPDWORD pnEnumValues);
+  DWORD WINAPI EnumPrinterKeyA(HANDLE hPrinter,LPCSTR pKeyName,LPSTR pSubkey,DWORD cbSubkey,LPDWORD pcbSubkey);
+  DWORD WINAPI EnumPrinterKeyW(HANDLE hPrinter,LPCWSTR pKeyName,LPWSTR pSubkey,DWORD cbSubkey,LPDWORD pcbSubkey);
+  DWORD WINAPI SetPrinterDataA(HANDLE hPrinter,LPSTR pValueName,DWORD Type,LPBYTE pData,DWORD cbData);
+  DWORD WINAPI SetPrinterDataW(HANDLE hPrinter,LPWSTR pValueName,DWORD Type,LPBYTE pData,DWORD cbData);
+  DWORD WINAPI SetPrinterDataExA(HANDLE hPrinter,LPCSTR pKeyName,LPCSTR pValueName,DWORD Type,LPBYTE pData,DWORD cbData);
+  DWORD WINAPI SetPrinterDataExW(HANDLE hPrinter,LPCWSTR pKeyName,LPCWSTR pValueName,DWORD Type,LPBYTE pData,DWORD cbData);
+  DWORD WINAPI DeletePrinterDataA(HANDLE hPrinter,LPSTR pValueName);
+  DWORD WINAPI DeletePrinterDataW(HANDLE hPrinter,LPWSTR pValueName);
+  DWORD WINAPI DeletePrinterDataExA(HANDLE hPrinter,LPCSTR pKeyName,LPCSTR pValueName);
+  DWORD WINAPI DeletePrinterDataExW(HANDLE hPrinter,LPCWSTR pKeyName,LPCWSTR pValueName);
+  DWORD WINAPI DeletePrinterKeyA(HANDLE hPrinter,LPCSTR pKeyName);
+  DWORD WINAPI DeletePrinterKeyW(HANDLE hPrinter,LPCWSTR pKeyName);
+
+#define PRINTER_NOTIFY_TYPE 0x00
+#define JOB_NOTIFY_TYPE 0x01
+
+#define PRINTER_NOTIFY_FIELD_SERVER_NAME 0x00
+#define PRINTER_NOTIFY_FIELD_PRINTER_NAME 0x01
+#define PRINTER_NOTIFY_FIELD_SHARE_NAME 0x02
+#define PRINTER_NOTIFY_FIELD_PORT_NAME 0x03
+#define PRINTER_NOTIFY_FIELD_DRIVER_NAME 0x04
+#define PRINTER_NOTIFY_FIELD_COMMENT 0x05
+#define PRINTER_NOTIFY_FIELD_LOCATION 0x06
+#define PRINTER_NOTIFY_FIELD_DEVMODE 0x07
+#define PRINTER_NOTIFY_FIELD_SEPFILE 0x08
+#define PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR 0x09
+#define PRINTER_NOTIFY_FIELD_PARAMETERS 0x0A
+#define PRINTER_NOTIFY_FIELD_DATATYPE 0x0B
+#define PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR 0x0C
+#define PRINTER_NOTIFY_FIELD_ATTRIBUTES 0x0D
+#define PRINTER_NOTIFY_FIELD_PRIORITY 0x0E
+#define PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY 0x0F
+#define PRINTER_NOTIFY_FIELD_START_TIME 0x10
+#define PRINTER_NOTIFY_FIELD_UNTIL_TIME 0x11
+#define PRINTER_NOTIFY_FIELD_STATUS 0x12
+#define PRINTER_NOTIFY_FIELD_STATUS_STRING 0x13
+#define PRINTER_NOTIFY_FIELD_CJOBS 0x14
+#define PRINTER_NOTIFY_FIELD_AVERAGE_PPM 0x15
+#define PRINTER_NOTIFY_FIELD_TOTAL_PAGES 0x16
+#define PRINTER_NOTIFY_FIELD_PAGES_PRINTED 0x17
+#define PRINTER_NOTIFY_FIELD_TOTAL_BYTES 0x18
+#define PRINTER_NOTIFY_FIELD_BYTES_PRINTED 0x19
+#define PRINTER_NOTIFY_FIELD_OBJECT_GUID 0x1A
+
+#define JOB_NOTIFY_FIELD_PRINTER_NAME 0x00
+#define JOB_NOTIFY_FIELD_MACHINE_NAME 0x01
+#define JOB_NOTIFY_FIELD_PORT_NAME 0x02
+#define JOB_NOTIFY_FIELD_USER_NAME 0x03
+#define JOB_NOTIFY_FIELD_NOTIFY_NAME 0x04
+#define JOB_NOTIFY_FIELD_DATATYPE 0x05
+#define JOB_NOTIFY_FIELD_PRINT_PROCESSOR 0x06
+#define JOB_NOTIFY_FIELD_PARAMETERS 0x07
+#define JOB_NOTIFY_FIELD_DRIVER_NAME 0x08
+#define JOB_NOTIFY_FIELD_DEVMODE 0x09
+#define JOB_NOTIFY_FIELD_STATUS 0x0A
+#define JOB_NOTIFY_FIELD_STATUS_STRING 0x0B
+#define JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR 0x0C
+#define JOB_NOTIFY_FIELD_DOCUMENT 0x0D
+#define JOB_NOTIFY_FIELD_PRIORITY 0x0E
+#define JOB_NOTIFY_FIELD_POSITION 0x0F
+#define JOB_NOTIFY_FIELD_SUBMITTED 0x10
+#define JOB_NOTIFY_FIELD_START_TIME 0x11
+#define JOB_NOTIFY_FIELD_UNTIL_TIME 0x12
+#define JOB_NOTIFY_FIELD_TIME 0x13
+#define JOB_NOTIFY_FIELD_TOTAL_PAGES 0x14
+#define JOB_NOTIFY_FIELD_PAGES_PRINTED 0x15
+#define JOB_NOTIFY_FIELD_TOTAL_BYTES 0x16
+#define JOB_NOTIFY_FIELD_BYTES_PRINTED 0x17
+
+  typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE {
+    WORD Type;
+    WORD Reserved0;
+    DWORD Reserved1;
+    DWORD Reserved2;
+    DWORD Count;
+    PWORD pFields;
+  } PRINTER_NOTIFY_OPTIONS_TYPE,*PPRINTER_NOTIFY_OPTIONS_TYPE,*LPPRINTER_NOTIFY_OPTIONS_TYPE;
+
+#define PRINTER_NOTIFY_OPTIONS_REFRESH 0x01
+
+  typedef struct _PRINTER_NOTIFY_OPTIONS {
+    DWORD Version;
+    DWORD Flags;
+    DWORD Count;
+    PPRINTER_NOTIFY_OPTIONS_TYPE pTypes;
+  } PRINTER_NOTIFY_OPTIONS,*PPRINTER_NOTIFY_OPTIONS,*LPPRINTER_NOTIFY_OPTIONS;
+
+#define PRINTER_NOTIFY_INFO_DISCARDED 0x01
+
+  typedef struct _PRINTER_NOTIFY_INFO_DATA {
+    WORD Type;
+    WORD Field;
+    DWORD Reserved;
+    DWORD Id;
+    union {
+      DWORD adwData[2];
+      struct {
+	DWORD cbBuf;
+	LPVOID pBuf;
+      } Data;
+    } NotifyData;
+  } PRINTER_NOTIFY_INFO_DATA,*PPRINTER_NOTIFY_INFO_DATA,*LPPRINTER_NOTIFY_INFO_DATA;
+
+  typedef struct _PRINTER_NOTIFY_INFO {
+    DWORD Version;
+    DWORD Flags;
+    DWORD Count;
+    PRINTER_NOTIFY_INFO_DATA aData[1];
+  } PRINTER_NOTIFY_INFO,*PPRINTER_NOTIFY_INFO,*LPPRINTER_NOTIFY_INFO;
+
+  typedef struct _BINARY_CONTAINER{
+    DWORD cbBuf;
+    LPBYTE pData;
+  } BINARY_CONTAINER,*PBINARY_CONTAINER;
+
+  typedef struct _BIDI_DATA{
+    DWORD dwBidiType;
+    union {
+      WINBOOL bData;
+      LONG iData;
+      LPWSTR sData;
+      FLOAT fData;
+      BINARY_CONTAINER biData;
+    } u;
+  } BIDI_DATA,*PBIDI_DATA,*LPBIDI_DATA;
+
+  typedef struct _BIDI_REQUEST_DATA{
+    DWORD dwReqNumber;
+    LPWSTR pSchema;
+    BIDI_DATA data;
+  } BIDI_REQUEST_DATA ,*PBIDI_REQUEST_DATA ,*LPBIDI_REQUEST_DATA;
+
+  typedef struct _BIDI_REQUEST_CONTAINER{
+    DWORD Version;
+    DWORD Flags;
+    DWORD Count;
+    BIDI_REQUEST_DATA aData[1 ];
+  }BIDI_REQUEST_CONTAINER,*PBIDI_REQUEST_CONTAINER,*LPBIDI_REQUEST_CONTAINER;
+
+  typedef struct _BIDI_RESPONSE_DATA{
+    DWORD dwResult;
+    DWORD dwReqNumber;
+    LPWSTR pSchema;
+    BIDI_DATA data;
+  } BIDI_RESPONSE_DATA,*PBIDI_RESPONSE_DATA,*LPBIDI_RESPONSE_DATA;
+
+  typedef struct _BIDI_RESPONSE_CONTAINER{
+    DWORD Version;
+    DWORD Flags;
+    DWORD Count;
+    BIDI_RESPONSE_DATA aData[1 ];
+  } BIDI_RESPONSE_CONTAINER,*PBIDI_RESPONSE_CONTAINER,*LPBIDI_RESPONSE_CONTAINER;
+
+#define BIDI_ACTION_ENUM_SCHEMA L"EnumSchema"
+#define BIDI_ACTION_GET L"Get"
+#define BIDI_ACTION_SET L"Set"
+#define BIDI_ACTION_GET_ALL L"GetAll"
+
+  typedef enum {
+    BIDI_NULL = 0,BIDI_INT = 1,BIDI_FLOAT = 2,BIDI_BOOL = 3,BIDI_STRING = 4,BIDI_TEXT = 5,BIDI_ENUM = 6,BIDI_BLOB = 7
+  } BIDI_TYPE;
+
+#define BIDI_ACCESS_ADMINISTRATOR 0x1
+#define BIDI_ACCESS_USER 0x2
+
+#define ERROR_BIDI_STATUS_OK 0
+#define ERROR_BIDI_NOT_SUPPORTED ERROR_NOT_SUPPORTED
+
+#define ERROR_BIDI_ERROR_BASE 13000
+#define ERROR_BIDI_STATUS_WARNING (ERROR_BIDI_ERROR_BASE + 1)
+#define ERROR_BIDI_SCHEMA_READ_ONLY (ERROR_BIDI_ERROR_BASE + 2)
+#define ERROR_BIDI_SERVER_OFFLINE (ERROR_BIDI_ERROR_BASE + 3)
+#define ERROR_BIDI_DEVICE_OFFLINE (ERROR_BIDI_ERROR_BASE + 4)
+#define ERROR_BIDI_SCHEMA_NOT_SUPPORTED (ERROR_BIDI_ERROR_BASE + 5)
+
+  DWORD WINAPI WaitForPrinterChange(HANDLE hPrinter,DWORD Flags);
+  HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE hPrinter,DWORD fdwFlags,DWORD fdwOptions,LPVOID pPrinterNotifyOptions);
+  WINBOOL WINAPI FindNextPrinterChangeNotification(HANDLE hChange,PDWORD pdwChange,LPVOID pPrinterNotifyOptions,LPVOID *ppPrinterNotifyInfo);
+  WINBOOL WINAPI FreePrinterNotifyInfo (PPRINTER_NOTIFY_INFO pPrinterNotifyInfo);
+  WINBOOL WINAPI FindClosePrinterChangeNotification(HANDLE hChange);
+
+#define PRINTER_CHANGE_ADD_PRINTER 0x00000001
+#define PRINTER_CHANGE_SET_PRINTER 0x00000002
+#define PRINTER_CHANGE_DELETE_PRINTER 0x00000004
+#define PRINTER_CHANGE_FAILED_CONNECTION_PRINTER 0x00000008
+#define PRINTER_CHANGE_PRINTER 0x000000FF
+#define PRINTER_CHANGE_ADD_JOB 0x00000100
+#define PRINTER_CHANGE_SET_JOB 0x00000200
+#define PRINTER_CHANGE_DELETE_JOB 0x00000400
+#define PRINTER_CHANGE_WRITE_JOB 0x00000800
+#define PRINTER_CHANGE_JOB 0x0000FF00
+#define PRINTER_CHANGE_ADD_FORM 0x00010000
+#define PRINTER_CHANGE_SET_FORM 0x00020000
+#define PRINTER_CHANGE_DELETE_FORM 0x00040000
+#define PRINTER_CHANGE_FORM 0x00070000
+#define PRINTER_CHANGE_ADD_PORT 0x00100000
+#define PRINTER_CHANGE_CONFIGURE_PORT 0x00200000
+#define PRINTER_CHANGE_DELETE_PORT 0x00400000
+#define PRINTER_CHANGE_PORT 0x00700000
+#define PRINTER_CHANGE_ADD_PRINT_PROCESSOR 0x01000000
+#define PRINTER_CHANGE_DELETE_PRINT_PROCESSOR 0x04000000
+#define PRINTER_CHANGE_PRINT_PROCESSOR 0x07000000
+#define PRINTER_CHANGE_ADD_PRINTER_DRIVER 0x10000000
+#define PRINTER_CHANGE_SET_PRINTER_DRIVER 0x20000000
+#define PRINTER_CHANGE_DELETE_PRINTER_DRIVER 0x40000000
+#define PRINTER_CHANGE_PRINTER_DRIVER 0x70000000
+#define PRINTER_CHANGE_TIMEOUT 0x80000000
+#define PRINTER_CHANGE_ALL 0x7777FFFF
+
+#ifdef UNICODE
+#define PrinterMessageBox PrinterMessageBoxW
+#define AddForm AddFormW
+#define DeleteForm DeleteFormW
+#define GetForm GetFormW
+#define SetForm SetFormW
+#define EnumForms EnumFormsW
+#define EnumMonitors EnumMonitorsW
+#define AddMonitor AddMonitorW
+#define DeleteMonitor DeleteMonitorW
+#define EnumPorts EnumPortsW
+#define AddPort AddPortW
+#define ConfigurePort ConfigurePortW
+#define DeletePort DeletePortW
+#define GetDefaultPrinter GetDefaultPrinterW
+#define SetDefaultPrinter SetDefaultPrinterW
+#define SetPort SetPortW
+#define AddPrinterConnection AddPrinterConnectionW
+#define DeletePrinterConnection DeletePrinterConnectionW
+#else
+#define PrinterMessageBox PrinterMessageBoxA
+#define AddForm AddFormA
+#define DeleteForm DeleteFormA
+#define GetForm GetFormA
+#define SetForm SetFormA
+#define EnumForms EnumFormsA
+#define EnumMonitors EnumMonitorsA
+#define AddMonitor AddMonitorA
+#define DeleteMonitor DeleteMonitorA
+#define EnumPorts EnumPortsA
+#define AddPort AddPortA
+#define ConfigurePort ConfigurePortA
+#define DeletePort DeletePortA
+#define GetDefaultPrinter GetDefaultPrinterA
+#define SetDefaultPrinter SetDefaultPrinterA
+#define SetPort SetPortA
+#define AddPrinterConnection AddPrinterConnectionA
+#define DeletePrinterConnection DeletePrinterConnectionA
+#endif
+
+  DWORD WINAPI PrinterMessageBoxA(HANDLE hPrinter,DWORD Error,HWND hWnd,LPSTR pText,LPSTR pCaption,DWORD dwType);
+  DWORD WINAPI PrinterMessageBoxW(HANDLE hPrinter,DWORD Error,HWND hWnd,LPWSTR pText,LPWSTR pCaption,DWORD dwType);
+
+#define PRINTER_ERROR_INFORMATION 0x80000000
+#define PRINTER_ERROR_WARNING 0x40000000
+#define PRINTER_ERROR_SEVERE 0x20000000
+
+#define PRINTER_ERROR_OUTOFPAPER 0x00000001
+#define PRINTER_ERROR_JAM 0x00000002
+#define PRINTER_ERROR_OUTOFTONER 0x00000004
+
+  WINBOOL WINAPI ClosePrinter(HANDLE hPrinter);
+  WINBOOL WINAPI AddFormA(HANDLE hPrinter,DWORD Level,LPBYTE pForm);
+  WINBOOL WINAPI AddFormW(HANDLE hPrinter,DWORD Level,LPBYTE pForm);
+  WINBOOL WINAPI DeleteFormA(HANDLE hPrinter,LPSTR pFormName);
+  WINBOOL WINAPI DeleteFormW(HANDLE hPrinter,LPWSTR pFormName);
+  WINBOOL WINAPI GetFormA(HANDLE hPrinter,LPSTR pFormName,DWORD Level,LPBYTE pForm,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI GetFormW(HANDLE hPrinter,LPWSTR pFormName,DWORD Level,LPBYTE pForm,DWORD cbBuf,LPDWORD pcbNeeded);
+  WINBOOL WINAPI SetFormA(HANDLE hPrinter,LPSTR pFormName,DWORD Level,LPBYTE pForm);
+  WINBOOL WINAPI SetFormW(HANDLE hPrinter,LPWSTR pFormName,DWORD Level,LPBYTE pForm);
+  WINBOOL WINAPI EnumFormsA(HANDLE hPrinter,DWORD Level,LPBYTE pForm,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumFormsW(HANDLE hPrinter,DWORD Level,LPBYTE pForm,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumMonitorsA(LPSTR pName,DWORD Level,LPBYTE pMonitor,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumMonitorsW(LPWSTR pName,DWORD Level,LPBYTE pMonitor,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI AddMonitorA(LPSTR pName,DWORD Level,LPBYTE pMonitorInfo);
+  WINBOOL WINAPI AddMonitorW(LPWSTR pName,DWORD Level,LPBYTE pMonitorInfo);
+  WINBOOL WINAPI DeleteMonitorA(LPSTR pName,LPSTR pEnvironment,LPSTR pMonitorName);
+  WINBOOL WINAPI DeleteMonitorW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pMonitorName);
+  WINBOOL WINAPI EnumPortsA(LPSTR pName,DWORD Level,LPBYTE pPorts,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI EnumPortsW(LPWSTR pName,DWORD Level,LPBYTE pPorts,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned);
+  WINBOOL WINAPI AddPortA(LPSTR pName,HWND hWnd,LPSTR pMonitorName);
+  WINBOOL WINAPI AddPortW(LPWSTR pName,HWND hWnd,LPWSTR pMonitorName);
+  WINBOOL WINAPI ConfigurePortA(LPSTR pName,HWND hWnd,LPSTR pPortName);
+  WINBOOL WINAPI ConfigurePortW(LPWSTR pName,HWND hWnd,LPWSTR pPortName);
+  WINBOOL WINAPI DeletePortA(LPSTR pName,HWND hWnd,LPSTR pPortName);
+  WINBOOL WINAPI DeletePortW(LPWSTR pName,HWND hWnd,LPWSTR pPortName);
+  WINBOOL WINAPI XcvDataW(HANDLE hXcv,PCWSTR pszDataName,PBYTE pInputData,DWORD cbInputData,PBYTE pOutputData,DWORD cbOutputData,PDWORD pcbOutputNeeded,PDWORD pdwStatus);
+
+#define XcvData XcvDataW
+
+  WINBOOL WINAPI GetDefaultPrinterA(LPSTR pszBuffer,LPDWORD pcchBuffer);
+  WINBOOL WINAPI GetDefaultPrinterW(LPWSTR pszBuffer,LPDWORD pcchBuffer);
+  WINBOOL WINAPI SetDefaultPrinterA(LPCSTR pszPrinter);
+  WINBOOL WINAPI SetDefaultPrinterW(LPCWSTR pszPrinter);
+  WINBOOL WINAPI SetPortA(LPSTR pName,LPSTR pPortName,DWORD dwLevel,LPBYTE pPortInfo);
+  WINBOOL WINAPI SetPortW(LPWSTR pName,LPWSTR pPortName,DWORD dwLevel,LPBYTE pPortInfo);
+  WINBOOL WINAPI AddPrinterConnectionA(LPSTR pName);
+  WINBOOL WINAPI AddPrinterConnectionW(LPWSTR pName);
+  WINBOOL WINAPI DeletePrinterConnectionA(LPSTR pName);
+  WINBOOL WINAPI DeletePrinterConnectionW(LPWSTR pName);
+  HANDLE WINAPI ConnectToPrinterDlg(HWND hwnd,DWORD Flags);
+
+  typedef struct _PROVIDOR_INFO_1A{
+    LPSTR pName;
+    LPSTR pEnvironment;
+    LPSTR pDLLName;
+  } PROVIDOR_INFO_1A,*PPROVIDOR_INFO_1A,*LPPROVIDOR_INFO_1A;
+
+  typedef struct _PROVIDOR_INFO_1W{
+    LPWSTR pName;
+    LPWSTR pEnvironment;
+    LPWSTR pDLLName;
+  } PROVIDOR_INFO_1W,*PPROVIDOR_INFO_1W,*LPPROVIDOR_INFO_1W;
+
+#ifdef UNICODE
+  typedef PROVIDOR_INFO_1W PROVIDOR_INFO_1;
+  typedef PPROVIDOR_INFO_1W PPROVIDOR_INFO_1;
+  typedef LPPROVIDOR_INFO_1W LPPROVIDOR_INFO_1;
+#else
+  typedef PROVIDOR_INFO_1A PROVIDOR_INFO_1;
+  typedef PPROVIDOR_INFO_1A PPROVIDOR_INFO_1;
+  typedef LPPROVIDOR_INFO_1A LPPROVIDOR_INFO_1;
+#endif
+
+  typedef struct _PROVIDOR_INFO_2A{
+    LPSTR pOrder;
+  } PROVIDOR_INFO_2A,*PPROVIDOR_INFO_2A,*LPPROVIDOR_INFO_2A;
+
+  typedef struct _PROVIDOR_INFO_2W{
+    LPWSTR pOrder;
+  } PROVIDOR_INFO_2W,*PPROVIDOR_INFO_2W,*LPPROVIDOR_INFO_2W;
+
+#ifdef UNICODE
+  typedef PROVIDOR_INFO_2W PROVIDOR_INFO_2;
+  typedef PPROVIDOR_INFO_2W PPROVIDOR_INFO_2;
+  typedef LPPROVIDOR_INFO_2W LPPROVIDOR_INFO_2;
+#else
+  typedef PROVIDOR_INFO_2A PROVIDOR_INFO_2;
+  typedef PPROVIDOR_INFO_2A PPROVIDOR_INFO_2;
+  typedef LPPROVIDOR_INFO_2A LPPROVIDOR_INFO_2;
+#endif
+
+#ifdef UNICODE
+#define AddPrintProvidor AddPrintProvidorW
+#define DeletePrintProvidor DeletePrintProvidorW
+#define IsValidDevmode IsValidDevmodeW
+#else
+#define AddPrintProvidor AddPrintProvidorA
+#define DeletePrintProvidor DeletePrintProvidorA
+#define IsValidDevmode IsValidDevmodeA
+#endif
+
+  WINBOOL WINAPI AddPrintProvidorA(LPSTR pName,DWORD level,LPBYTE pProvidorInfo);
+  WINBOOL WINAPI AddPrintProvidorW(LPWSTR pName,DWORD level,LPBYTE pProvidorInfo);
+  WINBOOL WINAPI DeletePrintProvidorA(LPSTR pName,LPSTR pEnvironment,LPSTR pPrintProvidorName);
+  WINBOOL WINAPI DeletePrintProvidorW(LPWSTR pName,LPWSTR pEnvironment,LPWSTR pPrintProvidorName);
+  WINBOOL WINAPI IsValidDevmodeA (PDEVMODEA pDevmode,size_t DevmodeSize);
+  WINBOOL WINAPI IsValidDevmodeW (PDEVMODEW pDevmode,size_t DevmodeSize);
+
+#define SPLREG_DEFAULT_SPOOL_DIRECTORY TEXT("DefaultSpoolDirectory")
+#define SPLREG_PORT_THREAD_PRIORITY_DEFAULT TEXT("PortThreadPriorityDefault")
+#define SPLREG_PORT_THREAD_PRIORITY TEXT("PortThreadPriority")
+#define SPLREG_SCHEDULER_THREAD_PRIORITY_DEFAULT TEXT("SchedulerThreadPriorityDefault")
+#define SPLREG_SCHEDULER_THREAD_PRIORITY TEXT("SchedulerThreadPriority")
+#define SPLREG_BEEP_ENABLED TEXT("BeepEnabled")
+#define SPLREG_NET_POPUP TEXT("NetPopup")
+#define SPLREG_RETRY_POPUP TEXT("RetryPopup")
+#define SPLREG_NET_POPUP_TO_COMPUTER TEXT("NetPopupToComputer")
+#define SPLREG_EVENT_LOG TEXT("EventLog")
+#define SPLREG_MAJOR_VERSION TEXT("MajorVersion")
+#define SPLREG_MINOR_VERSION TEXT("MinorVersion")
+#define SPLREG_ARCHITECTURE TEXT("Architecture")
+#define SPLREG_OS_VERSION TEXT("OSVersion")
+#define SPLREG_OS_VERSIONEX TEXT("OSVersionEx")
+#define SPLREG_DS_PRESENT TEXT("DsPresent")
+#define SPLREG_DS_PRESENT_FOR_USER TEXT("DsPresentForUser")
+#define SPLREG_REMOTE_FAX TEXT("RemoteFax")
+#define SPLREG_RESTART_JOB_ON_POOL_ERROR TEXT("RestartJobOnPoolError")
+#define SPLREG_RESTART_JOB_ON_POOL_ENABLED TEXT("RestartJobOnPoolEnabled")
+#define SPLREG_DNS_MACHINE_NAME TEXT("DNSMachineName")
+#define SPLREG_ALLOW_USER_MANAGEFORMS TEXT("AllowUserManageForms")
+#define SPLREG_WEBSHAREMGMT TEXT("WebShareMgmt")
+
+#define SERVER_ACCESS_ADMINISTER 0x00000001
+#define SERVER_ACCESS_ENUMERATE 0x00000002
+
+#define PRINTER_ACCESS_ADMINISTER 0x00000004
+#define PRINTER_ACCESS_USE 0x00000008
+
+#define JOB_ACCESS_ADMINISTER 0x00000010
+#define JOB_ACCESS_READ 0x00000020
+
+#define SERVER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE)
+#define SERVER_READ (STANDARD_RIGHTS_READ | SERVER_ACCESS_ENUMERATE)
+#define SERVER_WRITE (STANDARD_RIGHTS_WRITE | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE)
+#define SERVER_EXECUTE (STANDARD_RIGHTS_EXECUTE | SERVER_ACCESS_ENUMERATE)
+#define PRINTER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE)
+#define PRINTER_READ (STANDARD_RIGHTS_READ | PRINTER_ACCESS_USE)
+#define PRINTER_WRITE (STANDARD_RIGHTS_WRITE | PRINTER_ACCESS_USE)
+#define PRINTER_EXECUTE (STANDARD_RIGHTS_EXECUTE | PRINTER_ACCESS_USE)
+#define JOB_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | JOB_ACCESS_ADMINISTER | JOB_ACCESS_READ)
+#define JOB_READ (STANDARD_RIGHTS_READ | JOB_ACCESS_READ)
+#define JOB_WRITE (STANDARD_RIGHTS_WRITE | JOB_ACCESS_ADMINISTER)
+#define JOB_EXECUTE (STANDARD_RIGHTS_EXECUTE | JOB_ACCESS_ADMINISTER)
+
+#define SPLDS_SPOOLER_KEY TEXT("DsSpooler")
+#define SPLDS_DRIVER_KEY TEXT("DsDriver")
+#define SPLDS_USER_KEY TEXT("DsUser")
+
+#define SPLDS_ASSET_NUMBER TEXT("assetNumber")
+#define SPLDS_BYTES_PER_MINUTE TEXT("bytesPerMinute")
+#define SPLDS_DESCRIPTION TEXT("description")
+#define SPLDS_DRIVER_NAME TEXT("driverName")
+#define SPLDS_DRIVER_VERSION TEXT("driverVersion")
+#define SPLDS_LOCATION TEXT("location")
+#define SPLDS_PORT_NAME TEXT("portName")
+#define SPLDS_PRINT_ATTRIBUTES TEXT("printAttributes")
+#define SPLDS_PRINT_BIN_NAMES TEXT("printBinNames")
+#define SPLDS_PRINT_COLLATE TEXT("printCollate")
+#define SPLDS_PRINT_COLOR TEXT("printColor")
+#define SPLDS_PRINT_DUPLEX_SUPPORTED TEXT("printDuplexSupported")
+#define SPLDS_PRINT_END_TIME TEXT("printEndTime")
+#define SPLDS_PRINTER_CLASS TEXT("printQueue")
+#define SPLDS_PRINTER_NAME TEXT("printerName")
+#define SPLDS_PRINT_KEEP_PRINTED_JOBS TEXT("printKeepPrintedJobs")
+#define SPLDS_PRINT_LANGUAGE TEXT("printLanguage")
+#define SPLDS_PRINT_MAC_ADDRESS TEXT("printMACAddress")
+#define SPLDS_PRINT_MAX_X_EXTENT TEXT("printMaxXExtent")
+#define SPLDS_PRINT_MAX_Y_EXTENT TEXT("printMaxYExtent")
+#define SPLDS_PRINT_MAX_RESOLUTION_SUPPORTED TEXT("printMaxResolutionSupported")
+#define SPLDS_PRINT_MEDIA_READY TEXT("printMediaReady")
+#define SPLDS_PRINT_MEDIA_SUPPORTED TEXT("printMediaSupported")
+#define SPLDS_PRINT_MEMORY TEXT("printMemory")
+#define SPLDS_PRINT_MIN_X_EXTENT TEXT("printMinXExtent")
+#define SPLDS_PRINT_MIN_Y_EXTENT TEXT("printMinYExtent")
+#define SPLDS_PRINT_NETWORK_ADDRESS TEXT("printNetworkAddress")
+#define SPLDS_PRINT_NOTIFY TEXT("printNotify")
+#define SPLDS_PRINT_NUMBER_UP TEXT("printNumberUp")
+#define SPLDS_PRINT_ORIENTATIONS_SUPPORTED TEXT("printOrientationsSupported")
+#define SPLDS_PRINT_OWNER TEXT("printOwner")
+#define SPLDS_PRINT_PAGES_PER_MINUTE TEXT("printPagesPerMinute")
+#define SPLDS_PRINT_RATE TEXT("printRate")
+#define SPLDS_PRINT_RATE_UNIT TEXT("printRateUnit")
+#define SPLDS_PRINT_SEPARATOR_FILE TEXT("printSeparatorFile")
+#define SPLDS_PRINT_SHARE_NAME TEXT("printShareName")
+#define SPLDS_PRINT_SPOOLING TEXT("printSpooling")
+#define SPLDS_PRINT_STAPLING_SUPPORTED TEXT("printStaplingSupported")
+#define SPLDS_PRINT_START_TIME TEXT("printStartTime")
+#define SPLDS_PRINT_STATUS TEXT("printStatus")
+#define SPLDS_PRIORITY TEXT("priority")
+#define SPLDS_SERVER_NAME TEXT("serverName")
+#define SPLDS_SHORT_SERVER_NAME TEXT("shortServerName")
+#define SPLDS_UNC_NAME TEXT("uNCName")
+#define SPLDS_URL TEXT("url")
+#define SPLDS_FLAGS TEXT("flags")
+#define SPLDS_VERSION_NUMBER TEXT("versionNumber")
+
+#define SPLDS_PRINTER_NAME_ALIASES TEXT("printerNameAliases")
+#define SPLDS_PRINTER_LOCATIONS TEXT("printerLocations")
+#define SPLDS_PRINTER_MODEL TEXT("printerModel")
+
+#ifdef __cplusplus
+}
+#endif
+#endif