| Server IP : 209.209.40.120 / Your IP : 216.73.217.112 Web Server : Microsoft-IIS/10.0 System : Windows NT NEWWWW 10.0 build 17763 (Windows Server 2019) i586 User : NEWWWW$ ( 0) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/um/ |
Upload File : |
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
WinSplp.h
Abstract:
Internal Header file for Print APIs
Author:
Revision History:
--*/
#ifndef _WINSPLP_
#define _WINSPLP_
#include <winapifamily.h>
#pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
// disable warning: 4201
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning(disable:4201)
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#if (NTDDI_VERSION >= NTDDI_WINBLUE)
//
// EBranchOfficeJobState represents the Job state to be logged.
//
typedef enum
{
kInvalidJobState=0,
kLogJobPrinted, // The job has been successfully printed
kLogJobRendered, // The job was successfully rendered in the pipeline
kLogJobError, // The job has failed due to an error
kLogJobPipelineError, // The job failed during the print pipeline
kLogOfflineFileFull // The Offline archive for Brach Office Job Log entries
// exceeded its maximum size
} EBranchOfficeJobEventType;
//
// BranchOfficeJobDataPrinted contains the necessary data for logging a
// branch office job completed event on a remote server. This is based on standard
// job-related data available to the spooler.
//
typedef struct
{
DWORD Status; // The current status, or the failure code for a JOB_ERROR event
LPWSTR pDocumentName; // The Name of the Print Document
LPWSTR pUserName; // The user who submitted the job
LPWSTR pMachineName; // The name of the client machine printing the job
LPWSTR pPrinterName; // The name of the print connection
LPWSTR pPortName; // The Name of the port the job printed on
LONGLONG Size; // The size of the job (64 bits)
DWORD TotalPages; // The total number of pages in the job
} BranchOfficeJobDataPrinted, *PBranchOfficeJobDataPrinted;
//
// BranchOfficeJobDataError contains the necessary data for logging a
// branch office job failure event on a remote server. This is based on standard
// job-related data available to the spooler.
//
typedef struct
{
DWORD LastError; // The LastError at the time the event was logged
LPWSTR pDocumentName; // The Name of the Print Document
LPWSTR pUserName; // The user who submitted the job
LPWSTR pPrinterName; // The name of the print connection
LPWSTR pDataType; // The data type of the job
LONGLONG TotalSize; // The size of the job (64 bits)
LONGLONG PrintedSize; // The size of the job (64 bits)
DWORD TotalPages; // The total number of pages in the job
DWORD PrintedPages; // The number of pages currently printed
LPWSTR pMachineName; // The name of the client machine printing the job
LPWSTR pJobError; // The failure code for a JOB_ERROR event
LPWSTR pErrorDescription; // The text description of the error (if available)
} BranchOfficeJobDataError, *PBranchOfficeJobDataError;
//
// BranchOfficeJobDataRendered contains the necessary data for logging a
// branch office job Pipeline Rendering event on a remote server. This is based on
// standard job-related data available to the spooler.
//
typedef struct
{
LONGLONG Size; // The size of the job (64 bits)
DWORD ICMMethod;
short Color;
short PrintQuality;
short YResolution;
short Copies;
short TTOption;
} BranchOfficeJobDataRendered, *PBranchOfficeJobDataRendered;
//
// BranchOfficeJobDataPipelineFailed contains the necessary data for logging a
// branch office job Pipeline Rendering Failed event on a remote server. This is based
// on standard job-related data available to the spooler.
//
typedef struct
{
LPWSTR pDocumentName; // The Name of the Print Document
LPWSTR pPrinterName; // The name of the print connection
LPWSTR pExtraErrorInfo;// The name of the client machine printing the job
} BranchOfficeJobDataPipelineFailed, *PBranchOfficeJobDataPipelineFailed;
//
// BranchOfficeLogOfflineFileFull contains the necessary data for logging that
// the Offline Log archive on the current client overflowed at some point
//
typedef struct
{
LPWSTR pMachineName; // The Name of the print client
} BranchOfficeLogOfflineFileFull, *PBranchOfficeLogOfflineFileFull;
//
// BranchOfficeJobData contains the type of event to log (eEventType), the job Id
// and the data required by the event.
//
typedef struct
{
EBranchOfficeJobEventType eEventType; // The type of event to be logged
DWORD JobId; // The ID of the job on the client
union
{
BranchOfficeJobDataPrinted LogJobPrinted;
BranchOfficeJobDataRendered LogJobRendered;
BranchOfficeJobDataError LogJobError;
BranchOfficeJobDataPipelineFailed LogPipelineFailed;
BranchOfficeLogOfflineFileFull LogOfflineFileFull;
} JobInfo;
} BranchOfficeJobData, *PBranchOfficeJobData;
//
// BranchOfficeJobDataContainer defines a container for one or
// more BranchOfficeJobData structures to send to a server
//
typedef struct
{
DWORD cJobDataEntries;
BranchOfficeJobData JobData[ 1 ];
} BranchOfficeJobDataContainer, *PBranchOfficeJobDataContainer, *LPBranchOfficeJobDataContainer;
//
// LogJobInfoForBranchOffice is the new RPC entrypoint used to allow Branch
// Office clients to send job events to the host print server.
//
// Returns: an HRESULT indicating success or failure.
//
DWORD
WINAPI
LogJobInfoForBranchOffice(
_In_ HANDLE hPrinter, // handle to the CSR printer
_In_ PBranchOfficeJobDataContainer pJobDataContainer // A pointer to an array of BranchOfficeJobData
); // structs, containing the events to be logged.
#endif // (NTDDI_VERSION >= NTDDI_WINBLUE)
#define PRINTER_NOTIFY_STATUS_ENDPOINT 1
#define PRINTER_NOTIFY_STATUS_POLL 2
#define PRINTER_NOTIFY_STATUS_INFO 4
#define ROUTER_UNKNOWN 0
#define ROUTER_SUCCESS 1
#define ROUTER_STOP_ROUTING 2
#if (NTDDI_VERSION >= NTDDI_WS03)
#ifndef __ATTRIBUTE_INFO_3__
#define __ATTRIBUTE_INFO_3__
typedef struct _ATTRIBUTE_INFO_3 {
DWORD dwJobNumberOfPagesPerSide;
DWORD dwDrvNumberOfPagesPerSide;
DWORD dwNupBorderFlags;
DWORD dwJobPageOrderFlags;
DWORD dwDrvPageOrderFlags;
DWORD dwJobNumberOfCopies;
DWORD dwDrvNumberOfCopies;
DWORD dwColorOptimization; // Added for monochrome optimization
short dmPrintQuality; // Added for monochrome optimization
short dmYResolution; // Added for monochrome optimization
} ATTRIBUTE_INFO_3, *PATTRIBUTE_INFO_3;
#endif
#endif // (NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_VISTA)
#ifndef __ATTRIBUTE_INFO_4__
#define __ATTRIBUTE_INFO_4__
typedef struct _ATTRIBUTE_INFO_4 {
DWORD dwJobNumberOfPagesPerSide;
DWORD dwDrvNumberOfPagesPerSide;
DWORD dwNupBorderFlags;
DWORD dwJobPageOrderFlags;
DWORD dwDrvPageOrderFlags;
DWORD dwJobNumberOfCopies;
DWORD dwDrvNumberOfCopies;
DWORD dwColorOptimization; // Added for monochrome optimization
short dmPrintQuality; // Added for monochrome optimization
short dmYResolution; // Added for monochrome optimization
// _ATTRIBUTE_INFO_4 specific fields.
DWORD dwDuplexFlags;
DWORD dwNupDirection;
DWORD dwBookletFlags;
DWORD dwScalingPercentX; // Scaling percentage in X direction.
DWORD dwScalingPercentY; // Scaling percentage in Y direction.
} ATTRIBUTE_INFO_4, *PATTRIBUTE_INFO_4;
//dwDuplexFlags
// The below flag tells print processor to flip page order
// while printing reverse duplex.
// e.g. Instead of 4,3,2,1, pages should be printed in order 3,4,1,2
#define REVERSE_PAGES_FOR_REVERSE_DUPLEX ( 0x00000001 )
#define DONT_SEND_EXTRA_PAGES_FOR_DUPLEX ( 0x00000001 << 1 ) // 0x00000002
//Flags for dwNupDirection.
#define RIGHT_THEN_DOWN ( 0x00000001 ) // 0x00000001
#define DOWN_THEN_RIGHT ( 0x00000001 << 1 ) // 0x00000002
#define LEFT_THEN_DOWN ( 0x00000001 << 2 ) // 0x00000004
#define DOWN_THEN_LEFT ( 0x00000001 << 3 ) // 0x00000008
//dwBookletFlags
#define BOOKLET_EDGE_LEFT ( 0x00000000 )
#define BOOKLET_EDGE_RIGHT ( 0x00000001 )
#endif //__ATTRIBUTE_INFO_4__
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
typedef struct _PRINTER_NOTIFY_INIT {
DWORD Size;
DWORD Reserved;
DWORD PollTime;
} PRINTER_NOTIFY_INIT, *PPRINTER_NOTIFY_INIT, *LPPRINTER_NOTIFY_INIT;
typedef struct _SPLCLIENT_INFO_1{
DWORD dwSize;
LPWSTR pMachineName;
LPWSTR pUserName;
DWORD dwBuildNum;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
WORD wProcessorArchitecture;
} SPLCLIENT_INFO_1, *PSPLCLIENT_INFO_1, *LPSPLCLIENT_INFO_1;
// This definition is used in the private spooler RPC interface (RpcSplOpenPrinter)
// The handle returned in the struct is the Server Side hPrinter which will used in
// making direct API calls from the client to the server side w/o the overhead of
// RPC. The performance boost is observed mainly in calls to Read/WritePrinter made from
// within the spooler (gdi32.dll during playback)
//
//
typedef struct _SPLCLIENT_INFO_2_V1{
ULONG_PTR hSplPrinter; // Server side handle to be used for direct calls
} SPLCLIENT_INFO_2_W2K;
typedef struct _SPLCLIENT_INFO_2_V2{
#ifdef _WIN64
DWORD64 hSplPrinter; // Server side handle to be used for direct calls
#else
DWORD32 hSplPrinter; // Server side handle to be used for direct calls
#endif
} SPLCLIENT_INFO_2_WINXP;
typedef struct _SPLCLIENT_INFO_2_V3{
UINT64 hSplPrinter; // Server side handle to be used for direct calls
} SPLCLIENT_INFO_2_LONGHORN;
#if (OSVER(NTDDI_VERSION) == NTDDI_W2K)
typedef SPLCLIENT_INFO_2_W2K SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
#elif ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) || (OSVER(NTDDI_VERSION) == NTDDI_WS03))
typedef SPLCLIENT_INFO_2_WINXP SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
#else
typedef SPLCLIENT_INFO_2_LONGHORN SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
//
// This structure is a super set of the information in both a
// splclient_info_1 and splclient_info2 it also contains addtional
// information needed by the provider.
//
typedef struct _SPLCLIENT_INFO_3_VISTA
{
UINT cbSize; // Size in bytes of this structure
DWORD dwFlags; // Open printer additional flags to the provider
DWORD dwSize; // Reserved, here for complitbility with a info 1 structure
PWSTR pMachineName; // Client machine name
PWSTR pUserName; // Client user name
DWORD dwBuildNum; // Cleint build number
DWORD dwMajorVersion; // Client machine major version
DWORD dwMinorVersion; // Cleint machine minor version
WORD wProcessorArchitecture; // Client machine architecture
UINT64 hSplPrinter; // Server side handle to be used for direct calls
} SPLCLIENT_INFO_3_VISTA;
typedef SPLCLIENT_INFO_3_VISTA SPLCLIENT_INFO_3, *PSPLCLIENT_INFO_3, *LPSPLCLIENT_INFO_3;
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
typedef struct _PRINTPROVIDOR
{
BOOL (*fpOpenPrinter)(
_In_opt_ PWSTR pPrinterName,
_Out_ PHANDLE phPrinter,
_In_opt_ PPRINTER_DEFAULTS pDefault
);
BOOL (*fpSetJob)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ DWORD Level,
_In_reads_opt_(_Inexpressible_(0))
LPBYTE pJob,
_In_ DWORD Command
);
BOOL (*fpGetJob)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pJob,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpEnumJobs)(
_In_ HANDLE hPrinter,
_In_ DWORD FirstJob,
_In_ DWORD NoJobs,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pJob,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
HANDLE (*fpAddPrinter)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pPrinter
);
BOOL (*fpDeletePrinter)(_In_ HANDLE hPrinter);
BOOL (*fpSetPrinter)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0))
LPBYTE pPrinter,
_In_ DWORD Command
);
BOOL (*fpGetPrinter)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPrinter,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpEnumPrinters)(
_In_ DWORD Flags,
_In_opt_ LPWSTR Name,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPrinterEnum,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpAddPrinterDriver)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pDriverInfo
);
BOOL (*fpEnumPrinterDrivers)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDriverInfo,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpGetPrinterDriver)(
_In_ HANDLE hPrinter,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDriverInfo,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpGetPrinterDriverDirectory)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDriverDirectory,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpDeletePrinterDriver)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ LPWSTR pDriverName
);
BOOL (*fpAddPrintProcessor)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ LPWSTR pPathName,
_In_ LPWSTR pPrintProcessorName
);
BOOL (*fpEnumPrintProcessors)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPrintProcessorInfo,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpGetPrintProcessorDirectory)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPrintProcessorInfo,
_In_ DWORD cbBuf,
_In_ LPDWORD pcbNeeded
);
BOOL (*fpDeletePrintProcessor)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ LPWSTR pPrintProcessorName
);
BOOL (*fpEnumPrintProcessorDatatypes)(
_In_opt_ LPWSTR pName,
_In_ LPWSTR pPrintProcessorName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDataypes,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
DWORD (*fpStartDocPrinter)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pDocInfo);
BOOL (*fpStartPagePrinter)(_In_ HANDLE hPrinter);
BOOL (*fpWritePrinter)(
_In_ HANDLE hPrinter,
_In_reads_bytes_(cbBuf)
LPVOID pBuf,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcWritten
);
BOOL (*fpEndPagePrinter)(_In_ HANDLE hPrinter);
BOOL (*fpAbortPrinter)(_In_ HANDLE hPrinter);
BOOL (*fpReadPrinter)(
_In_ HANDLE hPrinter,
_Out_writes_bytes_to_opt_(cbBuf, *pNoBytesRead)
LPVOID pBuf,
_In_ DWORD cbBuf,
_Out_ LPDWORD pNoBytesRead
);
BOOL (*fpEndDocPrinter)(_In_ HANDLE hPrinter);
BOOL (*fpAddJob)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pData,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpScheduleJob)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId
);
DWORD (*fpGetPrinterData)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pValueName,
_Out_opt_ LPDWORD pType,
_Out_writes_bytes_to_opt_(nSize, *pcbNeeded)
LPBYTE pData,
_In_ DWORD nSize,
_Out_ LPDWORD pcbNeeded
);
DWORD (*fpSetPrinterData)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pValueName,
_In_ DWORD Type,
_In_reads_bytes_(cbData)
LPBYTE pData,
_In_ DWORD cbData
);
DWORD (*fpWaitForPrinterChange)(_In_ HANDLE hPrinter, _In_ DWORD Flags);
BOOL (*fpClosePrinter)(_In_ HANDLE hPrinter);
BOOL (*fpAddForm)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pForm
);
BOOL (*fpDeleteForm)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pFormName
);
BOOL (*fpGetForm)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pFormName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pForm,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded
);
BOOL (*fpSetForm)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pFormName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pForm
);
BOOL (*fpEnumForms)(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pForm,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpEnumMonitors)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pMonitors,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpEnumPorts)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPorts,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpAddPort)(
_In_opt_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pMonitorName
);
BOOL (*fpConfigurePort)(
_In_opt_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
BOOL (*fpDeletePort)(
_In_opt_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
HANDLE (*fpCreatePrinterIC)(
_In_ HANDLE hPrinter,
_In_opt_ LPDEVMODEW pDevMode
);
BOOL (*fpPlayGdiScriptOnPrinterIC)(
_In_ HANDLE hPrinterIC,
_In_reads_bytes_(cIn)
LPBYTE pIn,
_In_ DWORD cIn,
_Out_writes_bytes_(cOut)
LPBYTE pOut,
_In_ DWORD cOut,
_In_ DWORD ul
);
BOOL (*fpDeletePrinterIC)(_In_ HANDLE hPrinterIC);
BOOL (*fpAddPrinterConnection)(_In_ LPWSTR pName);
BOOL (*fpDeletePrinterConnection)(_In_ LPWSTR pName);
DWORD (*fpPrinterMessageBox)(
_In_ HANDLE hPrinter,
_In_ DWORD Error,
_In_ HWND hWnd,
_In_ LPWSTR pText,
_In_ LPWSTR pCaption,
_In_ DWORD dwType
);
BOOL (*fpAddMonitor)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pMonitorInfo
);
BOOL (*fpDeleteMonitor)(
_In_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ LPWSTR pMonitorName
);
BOOL (*fpResetPrinter)(
_In_ HANDLE hPrinter,
_In_ LPPRINTER_DEFAULTS pDefault
);
BOOL (*fpGetPrinterDriverEx)(
_In_ HANDLE hPrinter,
_In_opt_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDriverInfo,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_In_ DWORD dwClientMajorVersion,
_In_ DWORD dwClientMinorVersion,
_Out_ PDWORD pdwServerMajorVersion,
_Out_ PDWORD pdwServerMinorVersion
);
BOOL (*fpFindFirstPrinterChangeNotification)(
_In_ HANDLE hPrinter,
_In_ DWORD fdwFlags,
_In_ DWORD fdwOptions,
_Inout_ HANDLE hNotify,
_Out_ PDWORD pfdwStatus,
_In_ PVOID pPrinterNotifyOptions,
_In_ PVOID pPrinterNotifyInit
);
BOOL (*fpFindClosePrinterChangeNotification)(_In_ HANDLE hPrinter);
BOOL (*fpAddPortEx)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE lpBuffer,
_In_ LPWSTR lpMonitorName
);
BOOL (*fpShutDown)(_In_opt_ LPVOID pvReserved);
BOOL (*fpRefreshPrinterChangeNotification)(
_In_ HANDLE hPrinter,
_In_ DWORD Reserved,
_In_opt_ PVOID pvReserved,
_In_ PVOID pPrinterNotifyInfo
);
BOOL (*fpOpenPrinterEx)(
_In_opt_ LPWSTR pPrinterName,
_Out_ LPHANDLE phPrinter,
_In_opt_ LPPRINTER_DEFAULTS pDefault,
_In_reads_opt_(_Inexpressible_(0)) LPBYTE pClientInfo,
_In_ DWORD Level
);
HANDLE (*fpAddPrinterEx)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pPrinter,
_In_reads_opt_(_Inexpressible_(0)) LPBYTE pClientInfo,
_In_ DWORD ClientInfoLevel
);
BOOL (*fpSetPort)(
_In_opt_ LPWSTR pName,
_In_ LPWSTR pPortName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pPortInfo
);
DWORD (*fpEnumPrinterData)(
_In_ HANDLE hPrinter,
_In_ DWORD dwIndex,
_Out_writes_bytes_to_opt_(cbValueName, *pcbValueName)
LPWSTR pValueName,
_In_ DWORD cbValueName,
_Out_ LPDWORD pcbValueName,
_Out_opt_ LPDWORD pType,
_Out_writes_bytes_to_opt_(cbData, *pcbData)
LPBYTE pData,
_In_ DWORD cbData,
_Out_ LPDWORD pcbData
);
DWORD (*fpDeletePrinterData)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pValueName
);
DWORD (*fpClusterSplOpen)(
_In_ LPCTSTR pszServer,
_In_ LPCTSTR pszResource,
_Out_ PHANDLE phSpooler,
_In_ LPCTSTR pszName,
_In_ LPCTSTR pszAddress
);
DWORD (*fpClusterSplClose)(_In_ HANDLE hSpooler);
DWORD (*fpClusterSplIsAlive)(_In_ HANDLE hSpooler);
DWORD (*fpSetPrinterDataEx)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName,
_In_ LPCWSTR pValueName,
_In_ DWORD Type,
_In_reads_bytes_(cbData)
LPBYTE pData,
_In_ DWORD cbData
);
DWORD (*fpGetPrinterDataEx)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName,
_In_ LPCWSTR pValueName,
_Out_opt_ LPDWORD pType,
_Out_writes_bytes_to_opt_(nSize, *pcbNeeded)
LPBYTE pData,
_In_ DWORD nSize,
_Out_ LPDWORD pcbNeeded
);
DWORD (*fpEnumPrinterDataEx)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName,
_Out_writes_bytes_to_opt_(cbEnumValues, *pcbEnumValues)
LPBYTE pEnumValues,
_In_ DWORD cbEnumValues,
_Out_ LPDWORD pcbEnumValues,
_Out_ LPDWORD pnEnumValues
);
DWORD (*fpEnumPrinterKey)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName,
_Out_writes_bytes_to_opt_(cbSubkey, *pcbSubkey)
LPWSTR pSubkey,
_In_ DWORD cbSubkey,
_Out_ LPDWORD pcbSubkey
);
DWORD (*fpDeletePrinterDataEx)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName,
_In_ LPCWSTR pValueName
);
DWORD (*fpDeletePrinterKey)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pKeyName
);
BOOL (*fpSeekPrinter)(
_In_ HANDLE hPrinter,
_In_ LARGE_INTEGER liDistanceToMove,
_Out_ PLARGE_INTEGER pliNewPointer,
_In_ DWORD dwMoveMethod,
_In_ BOOL bWrite
);
BOOL (*fpDeletePrinterDriverEx)(
_In_opt_ LPWSTR pName,
_In_opt_ LPWSTR pEnvironment,
_In_ LPWSTR pDriverName,
_In_ DWORD dwDeleteFlag,
_In_ DWORD dwVersionNum
);
BOOL (*fpAddPerMachineConnection)(
_In_opt_ LPCWSTR pServer,
_In_ LPCWSTR pPrinterName,
_In_ LPCWSTR pPrintServer,
_In_ LPCWSTR pProvider
);
BOOL (*fpDeletePerMachineConnection)(
_In_opt_ LPCWSTR pServer,
_In_ LPCWSTR pPrinterName
);
BOOL (*fpEnumPerMachineConnections)(
_In_opt_ LPCWSTR pServer,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPrinterEnum,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (*fpXcvData)(
_In_ HANDLE hXcv,
_In_ LPCWSTR pszDataName,
_In_reads_bytes_(cbInputData)
PBYTE pInputData,
_In_ DWORD cbInputData,
_Out_writes_bytes_to_opt_(cbOutputData, *pcbOutputNeeded)
PBYTE pOutputData,
_In_ DWORD cbOutputData,
_Out_ PDWORD pcbOutputNeeded,
_Out_ PDWORD pdwStatus
);
BOOL (*fpAddPrinterDriverEx)(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0)) LPBYTE pDriverInfo,
_In_ DWORD dwFileCopyFlags
);
BOOL (*fpSplReadPrinter)(
_In_ HANDLE hPrinter,
_Outptr_result_bytebuffer_(cbBuf)
LPBYTE *pBuf,
_In_ DWORD cbBuf
);
BOOL (*fpDriverUnloadComplete)(_In_ LPWSTR pDriverFile);
BOOL (*fpGetSpoolFileInfo)(
_In_ HANDLE hPrinter,
_Outptr_result_maybenull_ LPWSTR *pSpoolDir,
_Out_ LPHANDLE phFile,
_In_ HANDLE hSpoolerProcess,
_In_ HANDLE hAppProcess
);
BOOL (*fpCommitSpoolData)(
_In_ HANDLE hPrinter,
_In_ DWORD cbCommit
);
BOOL (*fpCloseSpoolFileHandle)(_In_ HANDLE hPrinter);
BOOL (*fpFlushPrinter)(
_In_ HANDLE hPrinter,
_In_reads_bytes_(cbBuf)
LPBYTE pBuf,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcWritten,
_In_ DWORD cSleep
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
DWORD (*fpSendRecvBidiData)(
_In_ HANDLE hPrinter,
_In_ LPCWSTR pAction,
_In_ PBIDI_REQUEST_CONTAINER pReqData,
_Outptr_ PBIDI_RESPONSE_CONTAINER* ppResData
);
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_VISTA)
BOOL (*fpAddPrinterConnection2)(
_In_ LPCWSTR pName,
_In_ DWORD dwLevel,
_In_reads_(_Inexpressible_(0)) PVOID pInfo
);
HRESULT (*fpGetPrintClassObject)(
_In_ PCWSTR,
#ifdef __cplusplus
const IID&,
#else
const IID*,
#endif
_Outptr_ VOID**
);
HRESULT (*fpReportJobProcessingProgress)(
_In_ HANDLE hPrinter,
_In_ ULONG jobId,
_In_ EPrintXPSJobOperation jobOperation,
_In_ EPrintXPSJobProgress jobProgress
);
VOID (*fpEnumAndLogProvidorObjects)(
_In_ DWORD dwLevel,
_Out_ VOID *pfOut
);
HRESULT (*fpInternalGetPrinterDriver)(
_In_ HANDLE hPrinter,
_In_ LPWSTR pEnvironment,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pDriverInfo,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_In_ DWORD dwClientMajorVersion,
_In_ DWORD dwClientMinorVersion,
_Out_ PDWORD pdwServerMajorVersion,
_Out_ PDWORD pdwServerMinorVersion
);
HRESULT (*fpFindCompatibleDriver)(
_In_ LPCWSTR pcszPnpId,
_In_ LPCWSTR pcszPortName,
_Out_writes_(cchManufacturerName)
LPWSTR pszManufacturerName,
_In_ DWORD cchManufacturerName,
_Out_ LPDWORD pcchRequiredManufacturerNameSize,
_Out_writes_(cchModelName)
LPWSTR pszModelName,
_In_ DWORD cchModelName,
_Out_ LPDWORD pcchRequiredModelNameSize,
_Out_ LPDWORD pdwRank0Matches
);
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
#if (NTDDI_VERSION >= NTDDI_WIN8)
DWORD
(*fpGetJobNamedPropertyValue)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ PCWSTR pszName,
_Out_ PrintPropertyValue *pValue
);
DWORD
(*fpSetJobNamedProperty)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ const PrintNamedProperty *pProperty
);
DWORD
(*fpDeleteJobNamedProperty)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ PCWSTR pszName
);
DWORD
(*fpEnumJobNamedProperties)(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_Out_ DWORD *pcProperties,
_Outptr_result_buffer_(*pcProperties)
PrintNamedProperty **ppProperties
);
DWORD
(WINAPI *fpPowerEvent)(
_In_ DWORD event,
_In_opt_ POWERBROADCAST_SETTING *pPowerSetting
);
DWORD
(*fpGetUserPropertyBag)(
_In_ HANDLE hPrinter,
_Out_ HKEY *phKey
);
#endif // (NTDDI_VERSION >= NTDDI_WIN8)
#if (NTDDI_VERSION >= NTDDI_WINBLUE)
BOOL
(*fpCanShutdown)();
DWORD
(*fpLogJobInfoForBranchOffice)(
_In_ HANDLE hPrinter, // handle to the CSR printer
_In_ PBranchOfficeJobDataContainer pJobDataContainer // A pointer to an array of BranchOfficeJobData
); // structs, containing the events to be logged.
#endif // (NTDDI_VERSION >= NTDDI_WINBLUE)
#if (NTDDI_VERSION >= NTDDI_WIN10_19H1)
DWORD (*fpRegeneratePrintDeviceCapabilities)(
_In_ HANDLE hPrinter
);
#endif // (NTDDI_VERSION >= NTDDI_WIN10_19H1)
}
PRINTPROVIDOR, *LPPRINTPROVIDOR;
BOOL
InitializePrintProvidor(
_Out_writes_bytes_(cbPrintProvidor)
LPPRINTPROVIDOR pPrintProvidor,
_In_ DWORD cbPrintProvidor,
_In_opt_ LPWSTR pFullRegistryPath
);
typedef struct _PRINTPROCESSOROPENDATA {
PDEVMODE pDevMode;
LPWSTR pDatatype;
LPWSTR pParameters;
LPWSTR pDocumentName;
DWORD JobId;
LPWSTR pOutputFile;
LPWSTR pPrinterName;
} PRINTPROCESSOROPENDATA, *PPRINTPROCESSOROPENDATA, *LPPRINTPROCESSOROPENDATA;
HANDLE
OpenPrintProcessor(
_In_ LPWSTR pPrinterName,
_In_ PPRINTPROCESSOROPENDATA pPrintProcessorOpenData
);
BOOL
PrintDocumentOnPrintProcessor(
_In_ HANDLE hPrintProcessor,
_In_ LPWSTR pDocumentName
);
BOOL
ClosePrintProcessor(
_Inout_ HANDLE hPrintProcessor
);
BOOL
ControlPrintProcessor(
_In_ HANDLE hPrintProcessor,
_In_ DWORD Command
);
DWORD
GetPrintProcessorCapabilities(
_In_ LPTSTR pValueName,
_In_ DWORD dwAttributes,
_Out_writes_bytes_(nSize) LPBYTE pData,
_In_ DWORD nSize,
_Out_ LPDWORD pcbNeeded
);
#if (NTDDI_VERSION >= NTDDI_WS03)
BOOL
GetJobAttributes(
_In_ LPWSTR pPrinterName,
_In_ LPDEVMODEW pDevmode,
_Out_ PATTRIBUTE_INFO_3 pAttributeInfo
);
#endif // (NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_VISTA)
BOOL
GetJobAttributesEx(
_In_ LPWSTR pPrinterName,
_In_ LPDEVMODEW pDevmode,
_In_ DWORD dwLevel,
_Out_writes_bytes_(nSize) LPBYTE pAttributeInfo,
_In_ DWORD nSize,
_In_ DWORD dwFlags
);
// Flags for dwFlags
#define FILL_WITH_DEFAULTS 0x1
#endif // (NTDDI_VERSION >= NTDDI_WS03)
BOOL
InitializeMonitor(
_In_ LPWSTR pRegistryRoot
);
BOOL
OpenPort(
_In_ LPWSTR pName,
_Out_ PHANDLE pHandle
);
BOOL
WritePort(
_In_ HANDLE hPort,
_In_reads_bytes_(cbBuf) LPBYTE pBuffer,
DWORD cbBuf,
_Out_ LPDWORD pcbWritten
);
BOOL
ReadPort(
_In_ HANDLE hPort,
_Out_writes_bytes_(cbBuffer) LPBYTE pBuffer,
DWORD cbBuffer,
_Out_ LPDWORD pcbRead
);
BOOL
ClosePort(
_In_ HANDLE hPort
);
BOOL
XcvOpenPort(
_In_ LPCWSTR pszObject,
ACCESS_MASK GrantedAccess,
_Out_ PHANDLE phXcv
);
DWORD
XcvDataPort(
_In_ HANDLE hXcv,
_In_ LPCWSTR pszDataName,
_In_reads_bytes_(cbInputData) PBYTE pInputData,
DWORD cbInputData,
_Out_writes_bytes_(cbOutputData) PBYTE pOutputData,
DWORD cbOutputData,
_Out_ PDWORD pcbOutputNeeded
);
BOOL
XcvClosePort(
_In_ HANDLE hXcv
);
_Success_(return != FALSE)
BOOL
WINAPI
AddPortUI
(
_In_opt_ PCWSTR pszServer,
_In_ HWND hWnd,
_In_ PCWSTR pszMonitorNameIn,
_Out_opt_ PWSTR *ppszPortNameOut
);
BOOL
WINAPI
ConfigurePortUI
(
_In_ PCWSTR pszServer,
_In_ HWND hWnd,
_In_ PCWSTR pszPortName
);
BOOL
WINAPI
DeletePortUI
(
_In_ PCWSTR pszServer,
_In_ HWND hWnd,
_In_ PCWSTR pszPortName
);
BOOL
SplDeleteSpoolerPortStart(
_In_ PCWSTR pPortName
);
BOOL
SplDeleteSpoolerPortEnd(
_In_ PCWSTR pName,
_In_ BOOL bDeletePort
);
#if (STRICT && (NTDDI_VERSION >= NTDDI_VISTA))
#define HKEYMONITOR HKEY
#else
#define HKEYMONITOR HANDLE
#endif
typedef struct _MONITORREG {
DWORD cbSize;
LONG
(WINAPI *fpCreateKey)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszSubKey,
_In_ DWORD dwOptions,
_In_ REGSAM samDesired,
_In_opt_ PSECURITY_ATTRIBUTES pSecurityAttributes,
_Out_ HKEYMONITOR *phckResult,
_Out_opt_ PDWORD pdwDisposition,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpOpenKey)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszSubKey,
_In_ REGSAM samDesired,
_Out_ HKEYMONITOR *phkResult,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpCloseKey)(
_In_ HKEYMONITOR hcKey,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpDeleteKey)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszSubKey,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpEnumKey)(
_In_ HKEYMONITOR hcKey,
_In_ DWORD dwIndex,
_Inout_updates_to_(*pcchName, *pcchName)
LPTSTR pszName,
_Inout_ PDWORD pcchName,
_Out_opt_ PFILETIME pftLastWriteTime,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpQueryInfoKey)(
_In_ HKEYMONITOR hcKey,
_Out_opt_ PDWORD pcSubKeys,
_Out_opt_ PDWORD pcbKey,
_Out_opt_ PDWORD pcValues,
_Out_opt_ PDWORD pcbValue,
_Out_opt_ PDWORD pcbData,
_Out_opt_ PDWORD pcbSecurityDescriptor,
_Out_opt_ PFILETIME pftLastWriteTime,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpSetValue)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszValue,
_In_ DWORD dwType,
_In_reads_bytes_(cbData)
const BYTE* pData,
_In_ DWORD cbData,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpDeleteValue)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszValue,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpEnumValue)(
_In_ HKEYMONITOR hcKey,
_In_ DWORD dwIndex,
_Inout_updates_to_(*pcbValue, *pcbValue)
LPTSTR pszValue,
_Inout_ PDWORD pcbValue,
_Out_opt_ PDWORD pTyp,
_Out_writes_bytes_to_opt_(*pcbData, *pcbData)
PBYTE pData,
_Inout_ PDWORD pcbData,
_In_ HANDLE hSpooler
);
LONG
(WINAPI *fpQueryValue)(
_In_ HKEYMONITOR hcKey,
_In_ LPCTSTR pszValue,
_Out_opt_ PDWORD pType,
_Out_writes_bytes_to_opt_(*pcbData, *pcbData)
PBYTE pData,
_Inout_ PDWORD pcbData,
_In_ HANDLE hSpooler
);
} MONITORREG, *PMONITORREG;
typedef struct _MONITORINIT {
DWORD cbSize;
HANDLE hSpooler;
HKEYMONITOR hckRegistryRoot;
PMONITORREG pMonitorReg;
BOOL bLocal;
LPCWSTR pszServerName;
} MONITORINIT, *PMONITORINIT;
typedef struct _MONITOR
{
BOOL (WINAPI *pfnEnumPorts)
(
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPorts,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (WINAPI *pfnOpenPort)
(
_In_ LPWSTR pName,
_Out_ PHANDLE pHandle
);
BOOL (WINAPI *pfnOpenPortEx)
(
_In_ LPWSTR pPortName,
_In_ LPWSTR pPrinterName,
_Out_ PHANDLE pHandle,
_In_ struct _MONITOR FAR *pMonitor
);
BOOL (WINAPI *pfnStartDocPort)
(
_In_ HANDLE hPort,
_In_ LPWSTR pPrinterName,
_In_ DWORD JobId,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0))
LPBYTE pDocInfo
);
BOOL (WINAPI *pfnWritePort)
(
_In_ HANDLE hPort,
_In_reads_bytes_(cbBuf)
LPBYTE pBuffer,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbWritten
);
BOOL (WINAPI *pfnReadPort)
(
_In_ HANDLE hPort,
_Out_writes_bytes_to_(cbBuffer, *pcbRead)
LPBYTE pBuffer,
_In_ DWORD cbBuffer,
_Out_ LPDWORD pcbRead
);
BOOL (WINAPI *pfnEndDocPort)
(
_In_ HANDLE hPort
);
BOOL (WINAPI *pfnClosePort)
(
_In_ HANDLE hPort
);
BOOL (WINAPI *pfnAddPort)
(
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pMonitorName
);
BOOL (WINAPI *pfnAddPortEx)
(
_In_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0))
LPBYTE lpBuffer,
_In_ LPWSTR lpMonitorName
);
BOOL (WINAPI *pfnConfigurePort)
(
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
BOOL (WINAPI *pfnDeletePort)
(
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
BOOL (WINAPI *pfnGetPrinterDataFromPort)
(
_In_ HANDLE hPort,
_In_ DWORD ControlID,
_In_ LPWSTR pValueName,
_In_reads_bytes_(cbInBuffer)
LPWSTR lpInBuffer,
_In_ DWORD cbInBuffer,
_Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbReturned)
LPWSTR lpOutBuffer,
_In_ DWORD cbOutBuffer,
_Out_ LPDWORD lpcbReturned
);
BOOL (WINAPI *pfnSetPortTimeOuts)
(
_In_ HANDLE hPort,
_In_ LPCOMMTIMEOUTS lpCTO,
_In_ DWORD reserved // must be set to 0
);
BOOL (WINAPI *pfnXcvOpenPort)
(
_In_ LPCWSTR pszObject,
_In_ ACCESS_MASK GrantedAccess,
_Out_ PHANDLE phXcv
);
DWORD (WINAPI *pfnXcvDataPort)
(
_In_ HANDLE hXcv,
_In_ LPCWSTR pszDataName,
_In_reads_bytes_(cbInputData)
PBYTE pInputData,
_In_ DWORD cbInputData,
_Out_writes_bytes_to_opt_(cbOutputData, *pcbOutputNeeded)
PBYTE pOutputData,
_In_ DWORD cbOutputData,
_Out_ PDWORD pcbOutputNeeded
);
BOOL (WINAPI *pfnXcvClosePort)
(
_In_ HANDLE hXcv
);
} MONITOR, FAR *LPMONITOR;
typedef struct _MONITOREX
{
DWORD dwMonitorSize;
MONITOR Monitor;
} MONITOREX, FAR *LPMONITOREX;
typedef struct _MONITOR2
{
DWORD cbSize;
BOOL (WINAPI *pfnEnumPorts)
(
_In_ HANDLE hMonitor,
_In_opt_ LPWSTR pName,
_In_ DWORD Level,
_Out_writes_bytes_to_opt_(cbBuf, *pcbNeeded)
LPBYTE pPorts,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
BOOL (WINAPI *pfnOpenPort)
(
_In_ HANDLE hMonitor,
_In_ LPWSTR pName,
_Out_ PHANDLE pHandle
);
BOOL (WINAPI *pfnOpenPortEx)
(
_In_ HANDLE hMonitor,
_In_ HANDLE hMonitorPort,
_In_ LPWSTR pPortName,
_In_ LPWSTR pPrinterName,
_Out_ PHANDLE pHandle,
_In_ struct _MONITOR2 FAR *pMonitor2
);
BOOL (WINAPI *pfnStartDocPort)
(
_In_ HANDLE hPort,
_In_ LPWSTR pPrinterName,
_In_ DWORD JobId,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0))
LPBYTE pDocInfo
);
BOOL (WINAPI *pfnWritePort)
(
_In_ HANDLE hPort,
_In_reads_bytes_(cbBuf)
LPBYTE pBuffer,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbWritten
);
BOOL (WINAPI *pfnReadPort)
(
_In_ HANDLE hPort,
_Out_writes_bytes_to_opt_(cbBuffer, *pcbRead)
LPBYTE pBuffer,
_In_ DWORD cbBuffer,
_Out_ LPDWORD pcbRead
);
BOOL (WINAPI *pfnEndDocPort)
(
_In_ HANDLE hPort
);
BOOL (WINAPI *pfnClosePort)
(
_In_ HANDLE hPort
);
BOOL (WINAPI *pfnAddPort)
(
_In_ HANDLE hMonitor,
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pMonitorName
);
BOOL (WINAPI *pfnAddPortEx)
(
_In_ HANDLE hMonitor,
_In_ LPWSTR pName,
_In_ DWORD Level,
_In_reads_(_Inexpressible_(0))
LPBYTE lpBuffer,
_In_ LPWSTR lpMonitorName
);
BOOL (WINAPI *pfnConfigurePort)
(
_In_ HANDLE hMonitor,
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
BOOL (WINAPI *pfnDeletePort)
(
_In_ HANDLE hMonitor,
_In_ LPWSTR pName,
_In_ HWND hWnd,
_In_ LPWSTR pPortName
);
BOOL (WINAPI *pfnGetPrinterDataFromPort)
(
_In_ HANDLE hPort,
_In_ DWORD ControlID,
_In_ LPWSTR pValueName,
_In_reads_bytes_(cbInBuffer)
LPWSTR lpInBuffer,
_In_ DWORD cbInBuffer,
_Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbReturned)
LPWSTR lpOutBuffer,
_In_ DWORD cbOutBuffer,
_Out_ LPDWORD lpcbReturned
);
BOOL (WINAPI *pfnSetPortTimeOuts)
(
_In_ HANDLE hPort,
_In_ LPCOMMTIMEOUTS lpCTO,
_In_ DWORD reserved // must be set to 0
);
BOOL (WINAPI *pfnXcvOpenPort)
(
_In_ HANDLE hMonitor,
_In_ LPCWSTR pszObject,
_In_ ACCESS_MASK GrantedAccess,
_Out_ PHANDLE phXcv
);
DWORD (WINAPI *pfnXcvDataPort)
(
_In_ HANDLE hXcv,
_In_ LPCWSTR pszDataName,
_In_reads_bytes_(cbInputData)
PBYTE pInputData,
_In_ DWORD cbInputData,
_Out_writes_bytes_to_opt_(cbOutputData, *pcbOutputNeeded)
PBYTE pOutputData,
_In_ DWORD cbOutputData,
_Out_ PDWORD pcbOutputNeeded
);
BOOL (WINAPI *pfnXcvClosePort)
(
_In_ HANDLE hXcv
);
VOID (WINAPI *pfnShutdown)
(
_In_ HANDLE hMonitor
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
DWORD (WINAPI *pfnSendRecvBidiDataFromPort)
(
_In_ HANDLE hPort,
_In_ DWORD dwAccessBit,
_In_ LPCWSTR pAction,
_In_ PBIDI_REQUEST_CONTAINER pReqData,
_Outptr_ PBIDI_RESPONSE_CONTAINER *ppResData
);
#endif
#if (NTDDI_VERSION >= NTDDI_WIN7)
DWORD (WINAPI *pfnNotifyUsedPorts)
(
_In_ HANDLE hMonitor,
_In_ DWORD cPorts,
_In_reads_(cPorts) PCWSTR *ppszPorts
);
DWORD (WINAPI *pfnNotifyUnusedPorts)
(
_In_ HANDLE hMonitor,
_In_ DWORD cPorts,
_In_reads_(cPorts) PCWSTR *ppszPorts
);
#endif
#if (NTDDI_VERSION >= NTDDI_WIN8)
DWORD (WINAPI *pfnPowerEvent)
(
_In_ HANDLE hMonitor,
_In_ DWORD event,
_In_opt_ POWERBROADCAST_SETTING *pSettings
);
#endif
}
MONITOR2, *PMONITOR2, FAR *LPMONITOR2;
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define MONITOR2_SIZE_WIN2K ( sizeof(DWORD) + (sizeof(PVOID)*18) )
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
typedef struct _MONITORUI
{
DWORD dwMonitorUISize;
BOOL (WINAPI *pfnAddPortUI)
(
_At_(return, _Success_(return != 0))
_In_opt_ PCWSTR pszServer,
_In_ HWND hWnd,
_In_ PCWSTR pszMonitorNameIn,
_Out_opt_ PWSTR *ppszPortNameOut
);
BOOL (WINAPI *pfnConfigurePortUI)
(
_In_opt_ PCWSTR pName,
_In_ HWND hWnd,
_In_ PCWSTR pPortName
);
BOOL (WINAPI *pfnDeletePortUI)
(
_In_opt_ PCWSTR pszServer,
_In_ HWND hWnd,
_In_ PCWSTR pszPortName
);
} MONITORUI, FAR *PMONITORUI;
HANDLE
CreatePrinterIC(
_In_ HANDLE hPrinter,
_In_opt_ LPDEVMODEW pDevMode
);
BOOL
PlayGdiScriptOnPrinterIC(
_In_ HANDLE hPrinterIC,
_In_reads_bytes_(cIn) LPBYTE pIn,
_In_ DWORD cIn,
_Out_writes_bytes_(cOut) LPBYTE pOut,
_In_ DWORD cOut,
_In_ DWORD ul
);
BOOL
DeletePrinterIC(
_In_ HANDLE hPrinterIC
);
BOOL
DevQueryPrint(
_In_ HANDLE hPrinter,
_In_ LPDEVMODE pDevMode,
_Out_ DWORD* pResID
);
HANDLE
RevertToPrinterSelf(
VOID
);
BOOL
ImpersonatePrinterClient(
_In_ HANDLE hToken
);
BOOL
ReplyPrinterChangeNotification(
_In_ HANDLE hPrinter,
DWORD fdwChangeFlags,
_Out_opt_ PDWORD pdwResult,
_In_opt_ PVOID pPrinterNotifyInfo
);
BOOL
ReplyPrinterChangeNotificationEx(
_In_ HANDLE hNotify,
DWORD dwColor,
DWORD fdwFlags,
_Out_ PDWORD pdwResult,
_In_ PVOID pPrinterNotifyInfo
);
BOOL
PartialReplyPrinterChangeNotification(
_In_ HANDLE hPrinter,
_In_opt_ PPRINTER_NOTIFY_INFO_DATA pDataSrc
);
PPRINTER_NOTIFY_INFO
RouterAllocPrinterNotifyInfo(
DWORD cPrinterNotifyInfoData
);
BOOL
RouterFreePrinterNotifyInfo(
_In_opt_ PPRINTER_NOTIFY_INFO pInfo
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
PBIDI_RESPONSE_CONTAINER
RouterAllocBidiResponseContainer(
_In_ DWORD Count
);
PVOID
RouterAllocBidiMem (
_In_ size_t NumBytes
);
DWORD
RouterFreeBidiResponseContainer(
_In_ PBIDI_RESPONSE_CONTAINER pData
);
VOID
RouterFreeBidiMem (
_In_ PVOID pMemPointer
);
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
#define PRINTER_NOTIFY_INFO_DATA_COMPACT 1
BOOL
AppendPrinterNotifyInfoData(
_In_ PPRINTER_NOTIFY_INFO pInfoDest,
_In_opt_ PPRINTER_NOTIFY_INFO_DATA pDataSrc,
DWORD fdwFlags
);
#if (NTDDI_VERSION >= NTDDI_VISTA)
typedef BOOL (CALLBACK *ROUTER_NOTIFY_CALLBACK)(
_In_ DWORD dwCommand,
_In_ PVOID pContext,
_In_ DWORD dwColor,
_In_ PPRINTER_NOTIFY_INFO pNofityInfo,
_In_ DWORD fdwFlags,
_Out_ PDWORD pdwResult
);
typedef enum _NOTIFICATION_CALLBACK_COMMANDS
{
NOTIFICATION_COMMAND_NOTIFY,
NOTIFICATION_COMMAND_CONTEXT_ACQUIRE,
NOTIFICATION_COMMAND_CONTEXT_RELEASE
} NOTIFICATION_CALLBACK_COMMANDS;
typedef struct _NOTIFICATION_CONFIG_1
{
UINT cbSize;
DWORD fdwFlags;
ROUTER_NOTIFY_CALLBACK pfnNotifyCallback;
PVOID pContext;
} NOTIFICATION_CONFIG_1, *PNOTIFICATION_CONFIG_1;
typedef enum _NOTIFICATION_CONFIG_FLAGS
{
NOTIFICATION_CONFIG_CREATE_EVENT = 1 << 0,
NOTIFICATION_CONFIG_REGISTER_CALLBACK = 1 << 1,
NOTIFICATION_CONFIG_EVENT_TRIGGER = 1 << 2,
NOTIFICATION_CONFIG_ASYNC_CHANNEL = 1 << 3
} NOTIFICATION_CONFIG_FLAGS;
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
DWORD
CallRouterFindFirstPrinterChangeNotification(
_In_ HANDLE hPrinterRPC,
DWORD fdwFilterFlags,
DWORD fdwOptions,
_In_ HANDLE hNotify,
_In_ PPRINTER_NOTIFY_OPTIONS pPrinterNotifyOptions
);
BOOL
ProvidorFindFirstPrinterChangeNotification(
_In_ HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
_In_ HANDLE hNotify,
_In_opt_ PVOID pPrinterNotifyOptions,
_Out_opt_ PVOID pvReserved1
);
BOOL
ProvidorFindClosePrinterChangeNotification(
_In_ HANDLE hPrinter
);
BOOL
SpoolerFindFirstPrinterChangeNotification(
_In_ HANDLE hPrinter,
DWORD fdwFilterFlags,
DWORD fdwOptions,
_In_ PVOID pPrinterNotifyOptions,
_In_opt_ PVOID pvReserved,
_In_ PVOID pNotificationConfig,
_Out_opt_ PHANDLE phNotify,
_Out_opt_ PHANDLE phEvent
);
BOOL
SpoolerFindNextPrinterChangeNotification(
_In_ HANDLE hPrinter,
_Out_ LPDWORD pfdwChange,
_In_opt_ LPVOID pPrinterNotifyOptions,
_Inout_opt_ LPVOID *ppPrinterNotifyInfo
);
#if (NTDDI_VERSION >= NTDDI_VISTA)
BOOL
SpoolerRefreshPrinterChangeNotification(
_In_ HANDLE hPrinter,
_In_ DWORD dwColor,
_In_ PPRINTER_NOTIFY_OPTIONS pOptions,
_Inout_opt_ PPRINTER_NOTIFY_INFO *ppInfo
);
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
VOID
SpoolerFreePrinterNotifyInfo(
_In_ PPRINTER_NOTIFY_INFO pInfo
);
BOOL
SpoolerFindClosePrinterChangeNotification(
_In_ HANDLE hPrinter
);
LPMONITOR2
WINAPI
InitializePrintMonitor2(
_In_ PMONITORINIT pMonitorInit,
_Out_ PHANDLE phMonitor
);
BOOL
WINAPI
InitializeMonitorEx(
_In_ LPWSTR pRegistryRoot,
_Out_ LPMONITOR pMonitor
);
LPMONITOREX
WINAPI
InitializePrintMonitor(
_In_ LPWSTR pRegistryRoot
);
PMONITORUI
WINAPI
InitializePrintMonitorUI(
VOID
);
//
// The following is added for new point-and-print support which allows
// specific files to be associated with a print queue (instead of a printer
// driver) using SetPrinterDataEx under the key "CopyFiles"
//
#define COPYFILE_EVENT_SET_PRINTER_DATAEX 1
#define COPYFILE_EVENT_DELETE_PRINTER 2
#define COPYFILE_EVENT_ADD_PRINTER_CONNECTION 3
#define COPYFILE_EVENT_DELETE_PRINTER_CONNECTION 4
#define COPYFILE_EVENT_FILES_CHANGED 5
BOOL
WINAPI
SpoolerCopyFileEvent(
_In_ LPWSTR pszPrinterName,
_In_ LPWSTR pszKey,
_In_ DWORD dwCopyFileEvent
);
#define COPYFILE_FLAG_CLIENT_SPOOLER 0x00000001
#define COPYFILE_FLAG_SERVER_SPOOLER 0x00000002
DWORD
WINAPI
GenerateCopyFilePaths(
_In_ LPCWSTR pszPrinterName,
_In_ LPCWSTR pszDirectory,
_In_ LPBYTE pSplClientInfo,
_In_ DWORD dwLevel,
_Inout_updates_(*pcchSourceDirSize)
LPWSTR pszSourceDir,
_Inout_ LPDWORD pcchSourceDirSize,
_Inout_updates_(*pcchTargetDirSize)
LPWSTR pszTargetDir,
_Inout_ LPDWORD pcchTargetDirSize,
_In_ DWORD dwFlags
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
typedef enum {
kMessageBox = 0
} UI_TYPE;
typedef struct {
DWORD cbSize; // sizeof(MESSAGEBOX_PARAMS)
LPWSTR pTitle; // Pointer to a null-terminated string for the title bar of the message box.
LPWSTR pMessage; // Pointer to a null-terminated string containing the message to display.
DWORD Style; // Specifies the contents and behavior of the message box
DWORD dwTimeout; // If bWait is TRUE, Timeout specifies the time, in seconds, that the function waits for the user's response.
BOOL bWait; // If TRUE, SplPromptUIInUsersSession does not return until the user responds or the time-out interval elapses.
// If Timeout is zero, SplPromptUIInUsersSession doesn't return until the user responds.
// If FALSE, the function returns immediately and pResponse returns IDASYNC.
} MESSAGEBOX_PARAMS, *PMESSAGEBOX_PARAMS;
typedef struct {
UI_TYPE UIType;
MESSAGEBOX_PARAMS MessageBoxParams;
} SHOWUIPARAMS, *PSHOWUIPARAMS;
BOOL
SplPromptUIInUsersSession(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_In_ PSHOWUIPARAMS pUIParams,
_Out_ DWORD *pResponse
);
DWORD
SplIsSessionZero(
_In_ HANDLE hPrinter,
_In_ DWORD JobId,
_Out_ BOOL *pIsSessionZero
);
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_WINBLUE)
HRESULT
WINAPI
AddPrintDeviceObject(
_In_ HANDLE hPrinter,
_Out_ HANDLE *phDeviceObject
);
HRESULT
WINAPI
UpdatePrintDeviceObject(
_In_ HANDLE hPrinter,
_In_ HANDLE hDeviceObject
);
HRESULT
WINAPI
RemovePrintDeviceObject(
_In_ HANDLE hDeviceObject
);
#endif
#ifdef __cplusplus
} /* End of extern "C" { */
#endif /* __cplusplus */
//enable warning: 4201
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning(default:4201)
#endif
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion
#endif // _WINSPLP_