Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2961 lines
58 KiB

/*++
Copyright (c) 1990 - 1995 Microsoft Corporation
Module Name:
local.h
Abstract:
Header file for Local Print Providor
Author:
Dave Snipp (DaveSn) 15-Mar-1991
Revision History:
06-Jun-1995 MuhuntS DRIVER_INFO_3, PRINTER_INFO_5 changes
17-May-1992 ChuckC Added CreateSplUniStr, DeleteSplUniStr.
27 June 94 MattFe pIniSpooler
10 July 94 MattFe Spl entry points for Caching
--*/
#include <ntfytab.h>
#include "splcom.h"
#ifdef __cplusplus
extern "C" {
#endif
//
// Defines to make code more readable.
//
#define ONEDAY 60*24
#define BROADCAST TRUE
#define NO_BROADCAST FALSE
#define UPDATE_DS_ONLY 3
#define CHANGEID_ONLY 2
#define UPDATE_CHANGEID 1
#define KEEP_CHANGEID 0
#define FIRST_FILE_TIME_GREATER_THAN_SECOND 1
#define OVERWRITE_IF_TARGET_EXISTS FALSE
#define IMPERSONATE_USER TRUE
#define DO_NOT_IMPERSONATE_USER FALSE
#define STRINGS_ARE_EQUAL 0
#define ONE_MINUTE 60*1000
#define TEN_MINUTES 10*ONE_MINUTE
#define TWO_MINUTES 2*ONE_MINUTE
#define SEVEN_MINUTES 7*ONE_MINUTE
#define HOUR_OF_MINUTES 60
#define ONE_HOUR ONE_MINUTE*HOUR_OF_MINUTES
#define DAY_OF_HOURS 24
#define DAY_OF_MINUTES DAY_OF_HOURS*60
#define DEFAULT_NUMBER_MASTER_AND_BACKUP 3
#define DEFAULT_NUMBER_BROWSE_WORKSTATIONS 2
#define DEFAULT_REFRESH_TIMES_PER_DECAY_PERIOD 2;
#define FIND_ANY_VERSION TRUE
#define FIND_COMPATIBLE_VERSION FALSE
#define DRIVER_UPGRADE 2
#define DRIVER_SEARCH 4
#define NT3X_VERSION TRUE
#define CURRENT_VERSION FALSE
#define MAX_STATIC_ALLOC 2048
// Default timeout values we will return
#define DEFAULT_DNS_TIMEOUT 15000
#define DEFAULT_TX_TIMEOUT 45000
// Pruning definitions
#define PRUNE_DOWNLEVEL_NEVER 0
#define PRUNE_DOWNLEVEL_NICELY 1
#define PRUNE_DOWNLEVEL_AGGRESSIVELY 2
// Default pruning settings
#define DS_PRINTQUEUE_VERSION_WIN2000 4
#define DEFAULT_PRUNE_DOWNLEVEL PRUNE_DOWNLEVEL_NEVER // Never delete downlevel PQ
#define DEFAULT_PRUNING_PRIORITY THREAD_PRIORITY_NORMAL
#define DEFAULT_PRUNING_RETRIES 2
#define DEFAULT_PRUNING_INTERVAL (DAY_OF_MINUTES/(DEFAULT_PRUNING_RETRIES + 1)) // 8 hrs
#define DEFAULT_PRUNING_RETRY_LOG 0
#define MAX_PRUNING_RETRIES 10
// Default printQueue settings
#define IMMORTAL 1
#define DEFAULT_IMMORTAL !IMMORTAL
#define DEFAULT_VERIFY_PUBLISHED_STATE INFINITE // This is the interval
#define DEFAULT_PRINT_PUBLISH_POLICY 1
#define SERVER_THREAD_OFF 0
#define SERVER_THREAD_ON 1
#define SERVER_THREAD_UNCONFIGURED 2
// Default policy values
#define KM_PRINTERS_ARE_BLOCKED 1 // 1 = blocked, 0 = not blocked
#define SERVER_DEFAULT_KM_PRINTERS_ARE_BLOCKED 1
#define WKS_DEFAULT_KM_PRINTERS_ARE_BLOCKED 0
extern DWORD DefaultKMPrintersAreBlocked;
extern DWORD gdwServerInstallTimeOut;
#define INIT_TIME TRUE
#define NON_INIT_TIME FALSE
enum
{
kMaximumNumberOfBrowsePrinters = 256
};
extern WCHAR *szPrinterData;
extern WCHAR *szConfigurationKey;
extern WCHAR *szDataFileKey;
extern WCHAR *szDriverVersion;
extern WCHAR *szTempDir;
extern WCHAR *szDriversKey;
extern WCHAR *szPrintersKey;
extern WCHAR *szDirectory;
extern WCHAR *szDriverIni;
extern WCHAR *szDriverFile;
extern WCHAR *szDriverDir;
extern WCHAR *szPrintProcDir;
extern WCHAR *szPrinterDir;
extern WCHAR *szClusterPrinterDir;
extern WCHAR *szPrinterIni;
extern WCHAR *szNullPort;
extern WCHAR *szComma;
extern WCHAR *szName;
extern WCHAR *szShare;
extern WCHAR *szPort;
extern WCHAR *szPrintProcessor;
extern WCHAR *szDatatype;
extern WCHAR *szObjectGUID;
extern WCHAR *szDsKeyUpdate;
extern WCHAR *szDsKeyUpdateForeground;
extern WCHAR *szAction;
extern WCHAR *szDriver;
extern WCHAR *szLocation;
extern WCHAR *szDescription;
extern WCHAR *szAttributes;
extern WCHAR *szStatus;
extern WCHAR *szPriority;
extern WCHAR *szDefaultPriority;
extern WCHAR *szUntilTime;
extern WCHAR *szStartTime;
extern WCHAR *szParameters;
extern WCHAR *szSepFile;
extern WCHAR *szDevMode;
extern WCHAR *szSecurity;
extern WCHAR *szSpoolDir;
extern WCHAR *szNetMsgDll;
extern WCHAR *szTimeLastChange;
extern WCHAR *szHelpFile;
extern WCHAR *szMonitor;
extern WCHAR *szDependentFiles;
extern WCHAR *szPreviousNames;
extern WCHAR *szDNSTimeout;
extern WCHAR *szTXTimeout;
extern WCHAR *szNull;
extern WCHAR *szPendingUpgrades;
extern WCHAR *szMfgName;
extern WCHAR *szOEMUrl;
extern WCHAR *szHardwareID;
extern WCHAR *szProvider;
extern WCHAR *szDriverDate;
extern WCHAR *szLongVersion;
extern WCHAR *szClusDrvTimeStamp;
extern const WCHAR szDiscardTSJobs[];
extern const WCHAR szDisableFilePooling[];
extern HANDLE hInst;
extern PINISPOOLER pLocalIniSpooler;
extern HANDLE SchedulerSignal;
extern HANDLE PowerManagementSignal;
extern DWORD dwSchedulerThreadPriority;
extern CRITICAL_SECTION SpoolerSection;
#if DBG
extern HANDLE hcsSpoolerSection;
#endif
extern HANDLE WinStaDllHandle;
extern PINIENVIRONMENT pThisEnvironment;
extern WCHAR *szPrintProcKey;
extern WCHAR *szEnvironment;
extern WCHAR *szMajorVersion;
extern WCHAR *szMinorVersion;
extern WCHAR *szRegistryRoot;
extern WCHAR *szEMFThrottle;
extern WCHAR *szFlushShadowFileBuffers;
extern WCHAR *szClusterDriverRoot;
extern WCHAR *szClusterNonAwareMonitors;
extern LPWSTR szRemoteDoc;
extern LPWSTR szLocalDoc;
extern LPWSTR szFastPrintTimeout;
extern LPWSTR szRaw;
extern DWORD dwUpgradeFlag;
#define CHECK_SCHEDULER() SetEvent(SchedulerSignal)
extern DWORD dwFastPrintWaitTimeout;
extern DWORD dwPortThreadPriority;
extern DWORD dwFastPrintThrottleTimeout;
extern DWORD dwFastPrintSlowDownThreshold;
extern DWORD dwWritePrinterSleepTime;
extern DWORD dwServerThreadPriority;
extern DWORD dwEnableBroadcastSpoolerStatus;
extern DWORD ServerThreadTimeout;
extern DWORD ServerThreadRunning;
extern DWORD NetPrinterDecayPeriod;
extern DWORD RefreshTimesPerDecayPeriod;
extern HANDLE ServerThreadSemaphore;
extern BOOL bNetInfoReady;
extern DWORD FirstAddNetPrinterTickCount;
extern DWORD BrowsePrintWorkstations;
extern DWORD dwFlushShadowFileBuffers;
extern DWORD dwMajorVersion;
extern DWORD dwMinorVersion;
extern DWORD dwUniquePrinterSessionID;
extern DWORD PortToPrinterStatusMappings[];
extern WCHAR *szSpooler;
extern LPCTSTR pszLocalOnlyToken;
extern LPCTSTR pszLocalsplOnlyToken;
typedef DWORD NOTIFYVECTOR[NOTIFY_TYPE_MAX];
typedef NOTIFYVECTOR *PNOTIFYVECTOR;
#define ZERONV(dest) \
dest[0] = dest[1] = 0
#define COPYNV(dest, src) \
{ dest[0] = src[0]; dest[1] = src[1]; }
#define ADDNV(dest, src) \
{ dest[0] |= src[0]; dest[1] |= src[1]; }
extern NOTIFYVECTOR NVPrinterStatus;
extern NOTIFYVECTOR NVPrinterSD;
extern NOTIFYVECTOR NVJobStatus;
extern NOTIFYVECTOR NVJobStatusString;
extern NOTIFYVECTOR NVJobStatusAndString;
extern NOTIFYVECTOR NVPurge;
extern NOTIFYVECTOR NVDeletedJob;
extern NOTIFYVECTOR NVAddJob;
extern NOTIFYVECTOR NVSpoolJob;
extern NOTIFYVECTOR NVWriteJob;
extern NOTIFYVECTOR NVPrinterAll;
extern NOTIFYVECTOR NVJobPrinted;
extern BOOL (*pfnPrinterEvent)();
extern BOOL fW3SvcInstalled; // Says if IIS or "Peer web Server" is installed on the local machine.
extern PWCHAR szW3Root; // The WWWRoot dir, e.g. c:\inetpub\wwwroot
extern OSVERSIONINFO OsVersionInfo;
extern OSVERSIONINFOEX OsVersionInfoEx;
extern WCHAR *gszNT4EMF;
extern WCHAR *gszNT5EMF;
extern WCHAR *ipszRegistryClusRepository;
extern WCHAR *szDriversDirectory;
extern WCHAR *szDriversKey;
extern WCHAR *szWin95Environment;
extern ERemoteRPCEndPointPolicy gRemoteRPCEndPointPolicy;
BOOL
IsPrinterSharingAllowed(
VOID
);
typedef struct _JOBDATA {
struct _JOBDATA *pNext;
PINIJOB pIniJob;
SIZE_T MemoryUse;
DWORD dwWaitTime;
DWORD dwScheduleTime;
DWORD dwNumberOfTries;
} JOBDATA, *PJOBDATA;
typedef struct _Strings {
DWORD nElements;
PWSTR ppszString[1];
} STRINGS, *PSTRINGS;
typedef struct _INTERNAL_DRV_FILE {
LPWSTR pFileName;
DWORD dwVersion;
HANDLE hFileHandle;
BOOL bUpdated;
} INTERNAL_DRV_FILE, *PINTERNAL_DRV_FILE;
extern DWORD dwNumberOfEMFJobsRendering;
extern BOOL bUseEMFScheduling;
extern SIZE_T TotalMemoryForRendering;
extern SIZE_T AvailMemoryForRendering;
extern DWORD dwLastScheduleTime;
extern PJOBDATA pWaitingList;
extern PJOBDATA pScheduleList;
#define JOB_SCHEDULE_LIST 0x00000001
#define JOB_WAITING_LIST 0x00000002
#define SPL_FIRST_JOB 0x00000001
#define SPL_USE_MEMORY 0x00000002
typedef BOOL (*PFNSPOOLER_MAP)( HANDLE h, PINISPOOLER pIniSpooler );
typedef BOOL (*PFNPRINTER_MAP)( HANDLE h, PINIPRINTER pIniPrinter );
#define DBG_CLUSTER 0x200
VOID
RunForEachSpooler(
HANDLE h,
PFNSPOOLER_MAP pfnMap
);
VOID
RunForEachPrinter(
PINISPOOLER pIniSpooler,
HANDLE h,
PFNPRINTER_MAP pfnMap
);
BOOL
DsUpdateAllDriverKeys(
HANDLE h,
PINISPOOLER pIniSpooler
);
BOOL
InitializeLocalspl(
VOID
);
VOID
EnterSplSem(
VOID
);
VOID
LeaveSplSem(
VOID
);
BOOL
IsThreadInSem(
DWORD ThreadID
);
#if DBG
extern HANDLE ghbtClusterRef;
extern PDBG_POINTERS gpDbgPointers;
VOID
SplInSem(
VOID
);
VOID
SplOutSem(
VOID
);
#else
#define SplInSem()
#define SplOutSem()
#endif
PDEVMODE
AllocDevMode(
PDEVMODE pDevMode
);
BOOL
FreeDevMode(
PDEVMODE pDevMode
);
PINIENTRY
FindIniKey(
PINIENTRY pIniEntry,
LPWSTR lpName
);
VOID
RemoveFromJobList(
PINIJOB pIniJob,
DWORD dwJobList
);
BOOL
CheckSepFile(
LPWSTR lpFileName
);
int
DoSeparator(
PSPOOL
);
DWORD
GetFullNameFromId(
IN PINIPRINTER pIniPrinter,
IN DWORD JobId,
IN BOOL fJob,
IN PWSTR pFileName,
IN SIZE_T cchFileName,
IN BOOL Remote
);
DWORD
GetPrinterDirectory(
PINIPRINTER pIniPrinter,
BOOL Remote,
LPWSTR pFileName,
DWORD MaxLength,
PINISPOOLER pIniSpooler
);
VOID
CreatePrintProcDirectory(
LPWSTR lpEnvironment,
PINISPOOLER pIniSpooler
);
VOID
ProcessShadowJobs(
PINIPRINTER pIniPrinter,
PINISPOOLER pIniSpooler
);
PINIJOB
ReadShadowJob(
LPWSTR szDir,
PWIN32_FIND_DATA pFindFileData,
PINISPOOLER pIniSpooler
);
VOID
GetDiscardTSJobsSettings(
PINISPOOLER pIniSpooler
);
BOOL
WriteShadowJob(
IN PINIJOB pIniJob,
IN BOOL bLeaveCS
);
BOOL
BuildEnvironmentInfo(
PINISPOOLER pIniSpooler
);
BOOL
BuildPrinterInfo(
PINISPOOLER pIniSpooler,
BOOL UpdateChangeID
);
BOOL
BuildAllPorts(
);
BOOL
BuildDriverInfo(
HKEY hEnvironmentKey,
PINIENVIRONMENT pIniEnvironment,
PINISPOOLER pIniSpooler
);
BOOL
BuildTrueDependentFileField(
LPWSTR pDriverPath,
LPWSTR pDataFile,
LPWSTR pConfigFile,
LPWSTR pHelpFile,
LPWSTR pInputDependentFiles,
LPWSTR *ppDependentFiles
);
DWORD
GetDriverVersionDirectory(
LPWSTR pDir,
DWORD MaxLength,
PINISPOOLER pIniSpooler,
PINIENVIRONMENT pIniEnvironment,
PINIVERSION pIniVersion,
PINIDRIVER pIniDriver,
LPWSTR lpRemote
);
PINIVERSION
FindVersionForDriver(
PINIENVIRONMENT pIniEnvironment,
PINIDRIVER pIniDriver
);
BOOL
BuildPrintProcInfo(
HKEY hEnvironmentKey,
PINIENVIRONMENT pIniEnvironment,
PINISPOOLER pIniSpooler
);
BOOL
MoveNewDriverRelatedFiles(
LPWSTR pNewDir,
LPWSTR pCurrDir,
LPWSTR pOldDir,
PINTERNAL_DRV_FILE pInternalDriverFiles,
DWORD dwFileCount,
LPBOOL pbDriverFileMoved,
LPBOOL pbConfigFileMoved
);
BOOL
RemoveFromList(
PINIENTRY *ppIniHead,
PINIENTRY pIniEntry
);
PINIDRIVER
GetDriver(
HKEY hVersionKey,
LPWSTR DriverName,
PINISPOOLER pIniSpooler,
PINIENVIRONMENT pIniEnvironment,
PINIVERSION pIniVersion
);
DWORD
GetDriverDirectory(
LPWSTR lpDir,
DWORD MaxLength,
PINIENVIRONMENT lpEnvironment,
LPWSTR lpRemotePath,
PINISPOOLER pIniSpooler
);
DWORD
GetProcessorDirectory(
LPWSTR *lpDir,
LPWSTR lpEnvironment,
PINISPOOLER pIniSpooler
);
BOOL
CreateCompleteDirectory(
LPWSTR lpDir
);
HRESULT
OpenMonitorPort(
PINIPORT pIniPort,
PINIMONITOR pIniLangMonitor,
LPWSTR pszPrinterName
);
HRESULT
CloseMonitorPort(
PINIPORT pIniPort
);
HRESULT
ReleaseMonitorPort(
PINIPORT pIniPort
);
HANDLE
GetMonitorHandle(
PINIPORT pIniPort
);
PINIMONITOR
GetOpenedMonitor(
PINIPORT pIniPort
);
VOID
ShutdownPorts(
PINISPOOLER pIniSpooler
);
BOOL
CreatePortThread(
PINIPORT pIniPort
);
#define WAIT TRUE
#define NOWAIT FALSE
BOOL
DestroyPortThread(
PINIPORT pIniPort,
BOOL bShutdown
);
DWORD
PortThread(
PINIPORT pIniPort
);
BOOL
DeleteJob(
PINIJOB pIniJob,
BOOL bBroadcast
);
VOID
DeleteJobCheck(
PINIJOB pIniJob
);
BOOL
UpdateWinIni(
PINIPRINTER pIniPrinter
);
PKEYDATA
CreateTokenList(
LPWSTR pKeyData
);
PINIPORT
CreatePortEntry(
LPWSTR pPortName,
PINIMONITOR pIniMonitor,
PINISPOOLER pIniSpooler
);
VOID
GetPrinterPorts(
PINIPRINTER pIniPrinter,
LPWSTR pszPorts,
DWORD *pcbNeeded
);
DWORD
SchedulerThread(
PINISPOOLER pIniSpooler
);
BOOL
UpdatePrinterIni(
PINIPRINTER pIniPrinter,
DWORD dwChangeID
);
BOOL
UpdatePrinterNetworkName(
PINIPRINTER pIniPrinter,
LPWSTR pszPorts
);
BOOL
CopyPrinterDevModeToIniPrinter(
IN OUT PINIPRINTER pIniPrinter,
IN LPDEVMODE pDevMode
);
BOOL
InitializeForms(
PINISPOOLER pIniSpooler
);
BOOL
InitializeNet(
VOID
);
BOOL
ShareThisPrinter(
PINIPRINTER pIniPrinter,
LPWSTR pShareName,
BOOL Share
);
DWORD
AddPrintShare(
PINISPOOLER pIniSpooler
);
PINIJOB
FindJob(
PINIPRINTER pIniPrinter,
DWORD JobId,
PDWORD pPosition
);
PINIJOB
FindServerJob(
PINISPOOLER pIniSpooler,
DWORD JobId,
PDWORD pPosition,
PINIPRINTER* ppIniPrinter
);
PINIJOB
FindIniJob (
PSPOOL pSpool,
DWORD JobId
);
DWORD
GetJobSessionId (
PSPOOL pSpool,
DWORD JobId
);
BOOL
MyName(
LPWSTR pName,
PINISPOOLER pIniSpooler
);
BOOL
IsValidPrinterName(
IN LPCWSTR pszPrinter,
IN DWORD cchMax
);
BOOL
CheckMyName(
LPWSTR pName,
PINISPOOLER pIniSpooler
);
PINISPOOLER
FindSpoolerByNameIncRef(
LPTSTR pszName,
LPCTSTR *ppszLocalName OPTIONAL
);
VOID
FindSpoolerByNameDecRef(
PINISPOOLER pIniSpooler
);
PINISPOOLER
FindSpoolerByName(
LPTSTR pszName,
LPCTSTR *ppszLocalName OPTIONAL
);
HANDLE
AddNetPrinter(
LPBYTE pPrinterInfo,
PINISPOOLER pIniSpooler
);
BOOL
CreateServerThread(
VOID
);
BOOL
GetSid(
PHANDLE hToken
);
BOOL
SetCurrentSid(
HANDLE phToken
);
BOOL
LocalEnumPrinters(
DWORD Flags,
LPWSTR Name,
DWORD Level,
LPBYTE pPrinterEnum,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
DWORD
LocalOpenPrinter(
LPWSTR pPrinterName,
LPHANDLE phPrinter,
LPPRINTER_DEFAULTS pDefault
);
DWORD
LocalOpenPrinterEx(
LPWSTR pPrinterName,
LPHANDLE phPrinter,
LPPRINTER_DEFAULTS pDefault,
LPBYTE pSplClientInfo,
DWORD dwLevel
);
BOOL
LocalSetJob(
HANDLE hPrinter,
DWORD JobId,
DWORD Level,
LPBYTE pJob,
DWORD Command
);
BOOL
LocalGetJob(
HANDLE hPrinter,
DWORD JobId,
DWORD Level,
LPBYTE pJob,
DWORD cbBuf,
LPDWORD pcbNeeded
);
BOOL
LocalEnumJobs(
HANDLE hPrinter,
DWORD FirstJob,
DWORD NoJobs,
DWORD Level,
LPBYTE pJob,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
HANDLE
LocalAddPrinter(
LPWSTR pName,
DWORD Level,
LPBYTE pPrinter
);
HANDLE
LocalAddPrinterEx(
LPWSTR pName,
DWORD Level,
LPBYTE pPrinter,
LPBYTE pSplClientInfo,
DWORD dwClientInfoLevel
);
BOOL
DeletePrinterForReal(
PINIPRINTER pIniPrinter,
BOOL bIsInitTime
);
VOID
DeleteIniNetPort(
PINIPRINTER pIniPrinter
);
BOOL
LocalDeletePrinter(
HANDLE hPrinter
);
BOOL
LocalAddPrinterConnection(
LPWSTR pName
);
BOOL
LocalDeletePrinterConnection(
LPWSTR pName
);
BOOL
LocalAddPrinterDriver(
LPWSTR pName,
DWORD Level,
LPBYTE pDriverInfo
);
BOOL
LocalAddPrinterDriverEx(
LPWSTR pName,
DWORD Level,
LPBYTE pDriverInfo,
DWORD dwFileCopyFlags
);
BOOL
LocalAddDriverCatalog(
IN HANDLE hPrinter,
IN DWORD dwLevel,
IN VOID *pvDriverInfCatInfo,
IN DWORD dwCatalogCopyFlags
);
BOOL
LocalEnumPrinterDrivers(
LPWSTR pName,
LPWSTR pEnvironment,
DWORD Level,
LPBYTE pDriverInfo,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
BOOL
LocalGetPrinterDriverDirectory(
LPWSTR pName,
LPWSTR pEnvironment,
DWORD Level,
LPBYTE pDriverDirectory,
DWORD cbBuf,
LPDWORD pcbNeeded
);
BOOL
LocalDeletePrinterDriver(
LPWSTR pName,
LPWSTR pEnvironment,
LPWSTR pDriverName
);
BOOL
LocalDeletePrinterDriverEx(
LPWSTR pName,
LPWSTR pEnvironment,
LPWSTR pDriverName,
DWORD dwDeleteFlag,
DWORD dwVersionNum
);
BOOL
LocalAddPerMachineConnection(
LPCWSTR pServer,
LPCWSTR pPrinterName,
LPCWSTR pPrintServer,
LPCWSTR pProvider
);
BOOL
LocalDeletePerMachineConnection(
LPCWSTR pServer,
LPCWSTR pPrinterName
);
BOOL
LocalEnumPerMachineConnections(
LPCWSTR pServer,
LPBYTE pPrinterEnum,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
BOOL
LocalAddPrintProcessor(
LPWSTR pName,
LPWSTR pEnvironment,
LPWSTR pPathName,
LPWSTR pPrintProcessorName
);
BOOL
LocalEnumPrintProcessors(
LPWSTR pName,
LPWSTR pEnvironment,
DWORD Level,
LPBYTE pPrintProcessorInfo,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
BOOL
LocalGetPrintProcessorDirectory(
LPWSTR pName,
LPWSTR pEnvironment,
DWORD Level,
LPBYTE pPrintProcessorInfo,
DWORD cbBuf,
LPDWORD pcbNeeded
);
BOOL
LocalDeletePrintProcessor(
LPWSTR pName,
LPWSTR pEnvironment,
LPWSTR pPrintProcessorName
);
BOOL
LocalEnumPrintProcessorDatatypes(
LPWSTR pName,
LPWSTR pPrintProcessorName,
DWORD Level,
LPBYTE pDatatypes,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
DWORD
LocalStartDocPrinter(
HANDLE hPrinter,
DWORD Level,
LPBYTE pDocInfo
);
BOOL
LocalStartPagePrinter(
HANDLE hPrinter
);
BOOL
LocalGetSpoolFileHandle(
HANDLE hPrinter,
LPWSTR *pSpoolDir,
LPHANDLE phFile,
HANDLE hSpoolerProcess,
HANDLE hAppProcess
);
BOOL
LocalCommitSpoolData(
HANDLE hPrinter,
DWORD cbCommit
);
BOOL
LocalCloseSpoolFileHandle(
HANDLE hPrinter
);
BOOL
LocalFlushPrinter(
HANDLE hPrinter,
LPVOID pBuf,
DWORD cbBuf,
LPDWORD pcWritten,
DWORD cSleep
);
DWORD
LocalSendRecvBidiData(
HANDLE hPrinter,
LPCTSTR pAction,
PBIDI_REQUEST_CONTAINER pReqData,
PBIDI_RESPONSE_CONTAINER* ppResData
);
BOOL
LocalWritePrinter(
HANDLE hPrinter,
LPVOID pBuf,
DWORD cbBuf,
LPDWORD pcWritten
);
BOOL
LocalSeekPrinter(
HANDLE hPrinter,
LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER pliNewPointer,
DWORD dwMoveMethod,
BOOL bWritePrinter
);
BOOL
LocalEndPagePrinter(
HANDLE hPrinter
);
BOOL
LocalAbortPrinter(
HANDLE hPrinter
);
BOOL
LocalReadPrinter(
HANDLE hPrinter,
LPVOID pBuf,
DWORD cbBuf,
LPDWORD pNoBytesRead
);
BOOL
SplReadPrinter(
HANDLE hPrinter,
LPBYTE *pBuf,
DWORD cbBuf
);
BOOL
LocalEndDocPrinter(
HANDLE hPrinter
);
BOOL
LocalAddJob(
HANDLE hPrinter,
DWORD Level,
LPBYTE pData,
DWORD cbBuf,
LPDWORD pcbNeeded
);
BOOL
LocalScheduleJob(
HANDLE hPrinter,
DWORD JobId
);
DWORD
LocalWaitForPrinterChange(
HANDLE hPrinter,
DWORD Flags
);
BOOL
SetSpoolClosingChange(
PSPOOL pSpool
);
BOOL
SetPrinterChange(
PINIPRINTER pIniPrinter,
PINIJOB pIniJob,
PDWORD pdwNotifyVectors,
DWORD Flags,
PINISPOOLER pIniSpooler
);
BOOL
LocalEnumMonitors(
LPWSTR pName,
DWORD Level,
LPBYTE pMonitors,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
BOOL
LocalEnumPorts(
LPWSTR pName,
DWORD Level,
LPBYTE pPorts,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
BOOL
LocalAddPort(
LPWSTR pName,
HWND hWnd,
LPWSTR pMonitorName
);
BOOL
LocalConfigurePort(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName
);
BOOL
LocalDeletePort(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName
);
BOOL
LocalXcvData(
HANDLE hXcv,
LPCWSTR pszDataName,
PBYTE pInputData,
DWORD cbInputData,
PBYTE pOutputData,
DWORD cbOutputData,
PDWORD pcbOutputNeeded,
PDWORD pdwStatus
);
DWORD
XcvOpen(
PCWSTR pszServer,
PCWSTR pszObject,
DWORD dwType,
PPRINTER_DEFAULTS pDefault,
PHANDLE phXcv,
PINISPOOLER pIniSpooler
);
BOOL
XcvClose(
PINIXCV pIniXcv
);
BOOL
XcvDeletePort(
PINIXCV pIniXcv,
PCWSTR pszDataName,
PBYTE pInputData,
DWORD cbInputData,
PBYTE pOutputData,
DWORD cbOutputData,
PDWORD pcbOutputNeeded,
PDWORD pdwStatus,
PINISPOOLER pIniSpooler
);
BOOL
XcvAddPort(
PINIXCV pIniXcv,
PCWSTR pszDataName,
PBYTE pInputData,
DWORD cbInputData,
PBYTE pOutputData,
DWORD cbOutputData,
PDWORD pcbOutputNeeded,
PDWORD pdwStatus,
PINISPOOLER pIniSpooler
);
BOOL
AddPortToSpooler(
PCWSTR pName,
PINIMONITOR pIniMonitor,
PINISPOOLER pIniSpooler
);
BOOL
DeletePortFromSpoolerStart(
PINIPORT pIniPort
);
BOOL
DeletePortFromSpoolerEnd(
PINIPORT pIniPort,
PINISPOOLER pIniSpooler,
BOOL bSuccess
);
HANDLE
LocalCreatePrinterIC(
HANDLE hPrinter,
LPDEVMODE pDevMode
);
BOOL
LocalPlayGdiScriptOnPrinterIC(
HANDLE hPrinterIC,
LPBYTE pIn,
DWORD cIn,
LPBYTE pOut,
DWORD cOut,
DWORD ul
);
BOOL
LocalDeletePrinterIC(
HANDLE hPrinterIC
);
DWORD
LocalPrinterMessageBox(
HANDLE hPrinter,
DWORD Error,
HWND hWnd,
LPWSTR pText,
LPWSTR pCaption,
DWORD dwType
);
BOOL
LocalAddMonitor(
LPWSTR pName,
DWORD Level,
LPBYTE pMonitors
);
BOOL
LocalDeleteMonitor(
LPWSTR pName,
LPWSTR pEnvironment,
LPWSTR pMonitorName
);
BOOL
LocalFindFirstPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
HANDLE hNotify,
PDWORD pfdwStatus,
PVOID pvReserved0,
PVOID pvReserved1
);
BOOL
LocalFindClosePrinterChangeNotification(
HANDLE hPrinter
);
PINIPRINTPROC
FindDatatype(
PINIPRINTPROC pDefaultPrintProc,
LPWSTR pDatatype
);
PINIPRINTPROC
InitializePrintProcessor(
HINSTANCE hLibrary,
PINIENVIRONMENT pIniEnvironment,
LPWSTR pPrintProcessorName,
LPWSTR pDLLName
);
HRESULT
InitializeLocalPrintProcessor(
IN PINIENVIRONMENT pIniEnvironment
);
PINIPRINTPROC
LoadPrintProcessor(
PINIENVIRONMENT pIniEnvironment,
LPWSTR pPrintProcessorName,
LPWSTR pPathName,
PINISPOOLER pIniSpooler
);
PINIMONITOR
CreateMonitorEntry(
LPWSTR pMonitorDll,
LPWSTR pMonitorName,
PINISPOOLER pIniSpooler
);
PINIPORT
FindIniPortFromIniPrinter(
PINIPRINTER pIniPrinter
);
BOOL
GetPrintDriverVersion(
IN LPCWSTR pszFileName,
OUT LPDWORD pdwFileMajorVersion,
OUT LPDWORD pdwFileMinorVersion
);
BOOL
GetBinaryVersion(
IN PCWSTR pszFileName,
OUT PDWORD pdwFileMajorVersion,
OUT PDWORD pdwFileMinorVersion
);
BOOL
IsSpecialDriver(
IN PINIDRIVER pIniDriver,
IN PINIPRINTPROC pIniProc,
IN PINISPOOLER pIniSpooler
);
BOOL
IsLocalFile (
IN LPCWSTR pszFileName,
IN PINISPOOLER pIniSpooler
);
BOOL
IsEXEFile(
IN LPCWSTR pszFileName
);
LPBYTE
PackStringToEOB(
IN LPWSTR pszSource,
IN LPBYTE pEnd
);
LPVOID
MakePTR (
IN LPVOID pBuf,
IN DWORD Quantity
);
DWORD
MakeOffset (
IN LPVOID pFirst,
IN LPVOID pSecond
);
LPWSTR
GetErrorString(
DWORD Error
);
DWORD
KMPrintersAreBlocked(
);
#define NULL_TERMINATED 0
INT
AnsiToUnicodeString(
LPSTR pAnsi,
LPWSTR pUnicode,
DWORD StringLength
);
int
Message(
HWND hwnd,
DWORD Type,
int CaptionID,
int TextID,
...
);
DWORD
PromptWriteError(
PSPOOL pSpool,
PHANDLE phThread,
PDWORD pdwThreadId
);
DWORD
InitializeEventLogging(
PINISPOOLER pIniSpooler
);
VOID
SplLogEventWorker(
IN PINISPOOLER pIniSpooler,
IN WORD EventType,
IN NTSTATUS EventID,
IN BOOL bInSplSem,
IN LPWSTR pFirstString,
IN va_list vargs
);
VOID
SplLogEvent(
PINISPOOLER pIniSpooler,
WORD EventType,
NTSTATUS EventID,
BOOL bInSplSem,
LPWSTR pFirstString,
...
);
VOID
SplLogEventExternal(
IN WORD EventType,
IN DWORD EventID,
IN LPWSTR pFirstString,
...
);
VOID
LogPrintProcError(
IN DWORD Error,
IN PINIJOB pIniJob
);
LONG
InterlockedAnd (
IN OUT LONG volatile *Target,
IN LONG Set
);
LONG
InterlockedOr (
IN OUT LONG volatile *Target,
IN LONG Set
);
VOID
GetServerFilePoolSettings(
PINISPOOLER pIniSpooler
);
#define IDS_LOCALSPOOLER 100
#define IDS_ERROR_WRITING_TO_PORT 101
#define IDS_ERROR_WRITING_TO_DISK 102
#define IDS_PRINTER_DRIVERS 104
#define IDS_UNNAMED 105
#define IDS_ERROR_WRITING_GENERAL 106
#define IDS_REMOTE_DOC 107
#define IDS_LOCAL_DOC 108
#define IDS_FASTPRINT_TIMEOUT 109
#define IDS_DRIVER_CHECKPOINT 110
// Maximum length of a builtin form
//
#define FORM_NAME_LEN 31
#define CUSTOM_NAME_LEN 31
#define FORM_DATA_LEN 32
// String table Ids for builtin form names
//
#define IDS_FORM_LETTER 200
#define IDS_FORM_LETTER_SMALL 201
#define IDS_FORM_TABLOID 202
#define IDS_FORM_LEDGER 203
#define IDS_FORM_LEGAL 204
#define IDS_FORM_STATEMENT 205
#define IDS_FORM_EXECUTIVE 206
#define IDS_FORM_A3 207
#define IDS_FORM_A4 208
#define IDS_FORM_A4_SMALL 209
#define IDS_FORM_A5 210
#define IDS_FORM_B4 211
#define IDS_FORM_B5 212
#define IDS_FORM_FOLIO 213
#define IDS_FORM_QUARTO 214
#define IDS_FORM_10X14 215
#define IDS_FORM_11X17 216
#define IDS_FORM_NOTE 217
#define IDS_FORM_ENVELOPE9 218
#define IDS_FORM_ENVELOPE10 219
#define IDS_FORM_ENVELOPE11 220
#define IDS_FORM_ENVELOPE12 221
#define IDS_FORM_ENVELOPE14 222
#define IDS_FORM_ENVELOPE_CSIZE_SHEET 223
#define IDS_FORM_ENVELOPE_DSIZE_SHEET 224
#define IDS_FORM_ENVELOPE_ESIZE_SHEET 225
#define IDS_FORM_ENVELOPE_DL 226
#define IDS_FORM_ENVELOPE_C5 227
#define IDS_FORM_ENVELOPE_C3 228
#define IDS_FORM_ENVELOPE_C4 229
#define IDS_FORM_ENVELOPE_C6 230
#define IDS_FORM_ENVELOPE_C65 231
#define IDS_FORM_ENVELOPE_B4 232
#define IDS_FORM_ENVELOPE_B5 233
#define IDS_FORM_ENVELOPE_B6 234
#define IDS_FORM_ENVELOPE 235
#define IDS_FORM_ENVELOPE_MONARCH 236
#define IDS_FORM_SIX34_ENVELOPE 237
#define IDS_FORM_US_STD_FANFOLD 238
#define IDS_FORM_GMAN_STD_FANFOLD 239
#define IDS_FORM_GMAN_LEGAL_FANFOLD 240
#if(WINVER >= 0x0400)
#define IDS_FORM_ISO_B4 241
#define IDS_FORM_JAPANESE_POSTCARD 242
#define IDS_FORM_9X11 243
#define IDS_FORM_10X11 244
#define IDS_FORM_15X11 245
#define IDS_FORM_ENV_INVITE 246
#define IDS_FORM_LETTER_EXTRA 247
#define IDS_FORM_LEGAL_EXTRA 248
#define IDS_FORM_TABLOID_EXTRA 249
#define IDS_FORM_A4_EXTRA 250
#define IDS_FORM_LETTER_TRANSVERSE 251
#define IDS_FORM_A4_TRANSVERSE 252
#define IDS_FORM_LETTER_EXTRA_TRANSVERSE 253
#define IDS_FORM_A_PLUS 254
#define IDS_FORM_B_PLUS 255
#define IDS_FORM_LETTER_PLUS 256
#define IDS_FORM_A4_PLUS 257
#define IDS_FORM_A5_TRANSVERSE 258
#define IDS_FORM_B5_TRANSVERSE 259
#define IDS_FORM_A3_EXTRA 260
#define IDS_FORM_A5_EXTRA 261
#define IDS_FORM_B5_EXTRA 262
#define IDS_FORM_A2 263
#define IDS_FORM_A3_TRANSVERSE 264
#define IDS_FORM_A3_EXTRA_TRANSVERSE 265
#define IDS_FORM_DBL_JAPANESE_POSTCARD 266
#define IDS_FORM_A6 267
#define IDS_FORM_JENV_KAKU2 268
#define IDS_FORM_JENV_KAKU3 269
#define IDS_FORM_JENV_CHOU3 270
#define IDS_FORM_JENV_CHOU4 271
#define IDS_FORM_LETTER_ROTATED 272
#define IDS_FORM_A3_ROTATED 273
#define IDS_FORM_A4_ROTATED 274
#define IDS_FORM_A5_ROTATED 275
#define IDS_FORM_B4_JIS_ROTATED 276
#define IDS_FORM_B5_JIS_ROTATED 277
#define IDS_FORM_JAPANESE_POSTCARD_ROTATED 278
#define IDS_FORM_DBL_JAPANESE_POSTCARD_ROTATED 279
#define IDS_FORM_A6_ROTATED 280
#define IDS_FORM_JENV_KAKU2_ROTATED 281
#define IDS_FORM_JENV_KAKU3_ROTATED 282
#define IDS_FORM_JENV_CHOU3_ROTATED 283
#define IDS_FORM_JENV_CHOU4_ROTATED 284
#define IDS_FORM_B6_JIS 285
#define IDS_FORM_B6_JIS_ROTATED 286
#define IDS_FORM_12X11 287
#define IDS_FORM_JENV_YOU4 288
#define IDS_FORM_JENV_YOU4_ROTATED 289
#define IDS_FORM_P16K 290
#define IDS_FORM_P32K 291
#define IDS_FORM_P32KBIG 292
#define IDS_FORM_PENV_1 293
#define IDS_FORM_PENV_2 294
#define IDS_FORM_PENV_3 295
#define IDS_FORM_PENV_4 296
#define IDS_FORM_PENV_5 297
#define IDS_FORM_PENV_6 298
#define IDS_FORM_PENV_7 299
#define IDS_FORM_PENV_8 300
#define IDS_FORM_PENV_9 301
#define IDS_FORM_PENV_10 302
#define IDS_FORM_P16K_ROTATED 303
#define IDS_FORM_P32K_ROTATED 304
#define IDS_FORM_P32KBIG_ROTATED 305
#define IDS_FORM_PENV_1_ROTATED 306
#define IDS_FORM_PENV_2_ROTATED 307
#define IDS_FORM_PENV_3_ROTATED 308
#define IDS_FORM_PENV_4_ROTATED 309
#define IDS_FORM_PENV_5_ROTATED 310
#define IDS_FORM_PENV_6_ROTATED 311
#define IDS_FORM_PENV_7_ROTATED 312
#define IDS_FORM_PENV_8_ROTATED 313
#define IDS_FORM_PENV_9_ROTATED 314
#define IDS_FORM_PENV_10_ROTATED 315
#define IDS_FORM_RESERVED_48 316
#define IDS_FORM_RESERVED_49 317
#define IDS_FORM_CUSTOMPAD 318
#endif /* WINVER >= 0x0400 */
VOID LogJobPrinted(
PINIJOB pIniJob
);
#define MAP_READABLE 0
#define MAP_SETTABLE 1
DWORD
MapJobStatus(
DWORD Type,
DWORD Status
);
DWORD
MapPrinterStatus(
DWORD Type,
DWORD Status
);
BOOL
OpenPrinterPortW(
LPWSTR pPrinterName,
HANDLE *pHandle,
LPPRINTER_DEFAULTS pDefault
);
VOID
BroadcastChange(
PINISPOOLER pIniSpooler,
DWORD Message,
WPARAM wParam,
LPARAM lParam
);
VOID
MyMessageBeep(
DWORD fuType,
PINISPOOLER pIniSpooler
);
VOID
SendJobAlert(
PINIJOB pIniJob
);
BOOL
CheckDataTypes(
PINIPRINTPROC pIniPrintProc,
LPWSTR pDatatype
);
BOOL
ValidatePortTokenList(
IN OUT PKEYDATA pKeyData,
IN PINISPOOLER pIniSpooler,
IN BOOL bInitialize,
OUT BOOL *pbNoPorts OPTIONAL
);
VOID
FreePortTokenList(
PKEYDATA pKeyData
);
DWORD
ValidatePrinterInfo(
IN PPRINTER_INFO_2 pPrinter,
IN PINISPOOLER pIniSpooler,
IN PINIPRINTER pIniPrinter OPTIONAL,
OUT LPWSTR* ppszLocalName OPTIONAL
);
BOOL
DeletePortEntry(
PINIPORT pIniPort
);
BOOL
GetTokenHandle(
PHANDLE pTokenHandle
);
VOID
LogJobInfo(
PINISPOOLER pIniSpooler,
NTSTATUS EventId,
DWORD JobId,
LPWSTR pDocumentName,
LPWSTR pUser,
LPWSTR pPrinterName,
DWORD curPos
);
LONG
Myatol(
LPWSTR nptr
);
ULONG_PTR
atox(
LPCWSTR psz
);
DWORD
DeleteSubkeys(
HKEY hKey,
PINISPOOLER pIniSpooler
);
DWORD
CreateClusterSpoolerEnvironmentsStructure(
IN PINISPOOLER pIniSpooler
);
DWORD
CopyNewerOrOlderFiles(
IN LPCWSTR pszSourceDir,
IN LPCWSTR pszMasterDir,
IN BOOL (WINAPI *pfn)(LPWSTR, LPWSTR)
);
PINIENVIRONMENT
GetLocalArchEnv(
IN PINISPOOLER pIniSpooler
);
DWORD
ClusterFindLanguageMonitor(
IN LPCWSTR pszMonitor,
IN LPCWSTR pszEnvName,
IN PINISPOOLER pIniSpooler
);
DWORD
ReadTimeStamp(
IN HKEY hkRoot,
IN OUT SYSTEMTIME *pSysTime,
IN LPCWSTR pszSubKey1,
IN LPCWSTR pszSubKey2,
IN LPCWSTR pszSubKey3,
IN LPCWSTR pszSubKey4,
IN LPCWSTR pszSubKey5,
IN PINISPOOLER pIniSpooler
);
DWORD
WriteTimeStamp(
IN HKEY hkRoot,
IN SYSTEMTIME SysTime,
IN LPCWSTR pszSubKey1,
IN LPCWSTR pszSubKey2,
IN LPCWSTR pszSubKey3,
IN LPCWSTR pszSubKey4,
IN LPCWSTR pszSubKey5,
IN PINISPOOLER pIniSpooler
);
BOOL
ClusterCheckDriverChanged(
IN HKEY hClusterVersionKey,
IN LPCWSTR pszDriver,
IN LPCWSTR pszEnv,
IN LPCWSTR pszVer,
IN PINISPOOLER pIniSpooler
);
DWORD
RunProcess(
IN LPCWSTR pszExe,
IN LPCWSTR pszCommand,
IN DWORD dwTimeOut,
OUT LPDWORD pdwExitCode OPTIONAL
);
DWORD
CopyICMFromLocalDiskToClusterDisk(
IN PINISPOOLER pIniSpooler
);
DWORD
CopyICMFromClusterDiskToLocalDisk(
IN PINISPOOLER pIniSpooler
);
DWORD
CreateProtectedDirectory(
IN LPCWSTR pszDir
);
DWORD
AddLocalDriverToClusterSpooler(
IN LPCWSTR pszDriver,
IN PINISPOOLER pIniSpooler
);
DWORD
StrCatPrefixMsz(
IN LPCWSTR pszPerfix,
IN LPWSTR pszzFiles,
IN OUT LPWSTR *ppszFullPathFiles
);
DWORD
ClusterSplDeleteUpgradeKey(
IN LPCWSTR pszResourceID
);
DWORD
ClusterSplReadUpgradeKey(
IN LPCWSTR pszResourceID,
OUT LPDWORD pdwValue
);
DWORD
CopyFileToDirectory(
IN LPCWSTR pszFullFileName,
IN LPCWSTR pszDestDir,
IN LPCWSTR pszDir1,
IN LPCWSTR pszDir2,
IN LPCWSTR pszDir3
);
DWORD
InstallMonitorFromCluster(
IN LPCWSTR pszName,
IN LPCWSTR pszEnvName,
IN LPCWSTR pszEnvDir,
IN PINISPOOLER pIniSpooler
);
PINIDRIVER
FindLocalDriver(
PINISPOOLER pIniSpooler,
LPWSTR pz
);
BOOL
FindLocalDriverAndVersion(
PINISPOOLER pIniSpooler,
LPWSTR pz,
PINIDRIVER *ppIniDriver,
PINIVERSION *ppIniVersion
);
BOOL
IsKMPD(
LPWSTR pDriverName
);
BOOL
IniDriverIsKMPD (
PINISPOOLER pIniSpooler,
PINIENVIRONMENT pIniEnvironment,
PINIVERSION pIniVersion,
PINIDRIVER pIniDriver
);
PINIDRIVER
FindCompatibleDriver(
PINIENVIRONMENT pIniEnvironment,
PINIVERSION * ppIniVersion,
LPWSTR pDriverName,
DWORD dwMajorVersion,
int FindAnyDriver
);
VOID
QueryUpgradeFlag(
PINISPOOLER pIniSpooler
);
BOOL
LocalAddPortEx(
LPWSTR pName,
DWORD Level,
LPBYTE pBuffer,
LPWSTR pMonitorName
);
BOOL
ValidateSpoolHandle(
PSPOOL pSpool,
DWORD dwDisallowMask
);
PSECURITY_DESCRIPTOR
MapPrinterSDToShareSD(
PSECURITY_DESCRIPTOR pPrinterSD
);
BOOL
CallDevQueryPrint(
LPWSTR pPrinterName,
LPDEVMODE pDevMode,
LPWSTR ErrorString,
DWORD dwErrorString,
DWORD dwPrinterFlags,
DWORD dwJobFlags
);
BOOL
InitializeWinSpoolDrv(
VOID
);
VOID
FixDevModeDeviceName(
LPWSTR pPrinterName,
PDEVMODE pDevMode,
DWORD cbDevMode
);
VOID
RemoveOldNetPrinters(
PPRINTER_INFO_1 pCurrentPrinterInfo1,
PINISPOOLER pIniSpooler
);
PINIJOB
AssignFreeJobToFreePort(
PINIPORT pIniPort,
DWORD *pTimeToWait
);
BOOL
ValidRawDatatype(
LPWSTR pszDataType);
BOOL
InternalAddPrinterDriverEx(
LPWSTR pName,
DWORD Level,
LPBYTE pDriverInfo,
DWORD dwFileCopyFlags,
PINISPOOLER pIniSpooler,
BOOL bUseScratchDir,
BOOL bImpersonateOnCreate
);
VOID
CheckSizeDetectionThread(
VOID
);
VOID
UpgradeForms(
PINISPOOLER pIniSpooler
);
HANDLE
CreatePrinterHandle(
LPWSTR pPrinterName,
LPWSTR pFullMachineName,
PINIPRINTER pIniPrinter,
PINIPORT pIniPort,
PINIPORT pIniNetPort,
PINIJOB pIniJob,
DWORD TypeofHandle,
HANDLE hPort,
PPRINTER_DEFAULTS pDefaults,
PINISPOOLER pIniSpooler,
DWORD AccessRequested,
LPBYTE pSplClientInfo,
DWORD dwLevel,
HANDLE hReadFile
);
DWORD
CreateServerHandle(
LPWSTR pPrinterName,
LPHANDLE pPrinterHandle,
LPPRINTER_DEFAULTS pDefaults,
PINISPOOLER pIniSpooler,
DWORD dwTypeofHandle
);
PINIPRINTER
FindPrinterShare(
LPCWSTR pShareName,
PINISPOOLER pIniSpooler
);
PINIJOB
CreateJobEntry(
PSPOOL pSpool,
DWORD Level,
LPBYTE pDocInfo,
DWORD JobId,
BOOL bRemote,
DWORD JobStatus,
LPWSTR pMachineName
);
BOOL
DeletePrinterCheck(
PINIPRINTER pIniPrinter
);
VOID
DeleteSpoolerCheck(
PINISPOOLER pIniSpooler
);
BOOL
DeletePrinterIni(
PINIPRINTER pIniPrinter
);
DWORD
SplDeleteThisKey(
HKEY hParentKey, // handle to parent of key to delete
HKEY hThisKey, // handle of key to delete
LPWSTR pThisKeyName, // name of this key
BOOL bDeleteNullKey, // if *pThisKeyName is NULL, delete it if TRUE
PINISPOOLER pIniSpooler
);
BOOL
CopyPrinterIni(
PINIPRINTER pIniPrinter,
LPWSTR pNewName
);
BOOL
UpdateString(
LPWSTR* ppszCur,
LPWSTR pszNew);
BOOL
SetPrinterPorts(
PSPOOL pSpool,
PINIPRINTER pIniPrinter,
PKEYDATA pKeyData
);
VOID
InternalDeletePrinter(
PINIPRINTER pIniPrinter
);
BOOL
PurgePrinter(
PINIPRINTER pIniPrinter
);
BOOL
AddIniPrinterToIniPort(
PINIPORT pIniPort,
PINIPRINTER pIniPrinter
);
BOOL
AddIniPortToIniPrinter(
PINIPRINTER pIniPrinter,
PINIPORT pIniPort
);
LPCWSTR
FindFileName(
LPCWSTR pPathName
);
VOID
UpdateJobAttributes(
PINIJOB pIniJob
);
BOOL
InternalCopyFile(
HANDLE hFile,
PWIN32_FIND_DATA pSourceFileData,
LPWSTR pTagetFileName,
BOOL bOverWriteIfTargetExists
);
BOOL
UpdateFile(
PINIVERSION pIniVersion,
HANDLE hSourceFile,
LPWSTR pSourceFile,
DWORD dwVersion,
LPWSTR pDestDir,
DWORD dwFileCopyFlags,
BOOL bImpersonateOnCreate,
LPBOOL pbFileUpdated,
LPBOOL pbFileMoved,
BOOL bSameEnvironment,
BOOL bWin95Environment
);
BOOL
PrinterCreateKey(
HKEY hKey,
LPWSTR pSubKey,
PHKEY phkResult,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegSetString(
HANDLE hPrinterKey,
LPWSTR pValueName,
LPWSTR pStringValue,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegSetDWord(
HANDLE hPrinterKey,
LPWSTR pValueName,
DWORD dwParam,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
VOID
CheckAndUpdatePrinterRegAll(
PINISPOOLER pIniSpooler,
LPWSTR pszPrinterName,
LPWSTR pszPort,
BOOL bDelete
);
BOOL
ForEachPrinterCallDriverDrvUpgrade(
PINISPOOLER pIniSpooler,
PINIDRIVER pIniDriver,
LPCWSTR pOldDriverDir,
PINTERNAL_DRV_FILE pInternalDriverFile,
DWORD dwFileCount,
LPBYTE pDriverInfo
);
BOOL
DeleteAllFilesInDirectory(
LPWSTR pDirectory,
BOOL bWaitForReboot
);
BOOL
DeleteAllFilesAndDirectory(
LPWSTR pDirectory,
BOOL bWaitForReboot
);
VOID
DeleteDirectoryRecursively(
LPCWSTR pDirectory,
BOOL bWaitForReboot
);
DWORD
CreateNumberedTempDirectory(
LPCWSTR pszDirectory,
LPWSTR *ppszTempDirectory
);
BOOL
FileExists(
LPWSTR pFileName
);
BOOL
DirectoryExists(
LPWSTR pDirectoryName
);
PINIVERSION
FindVersionEntry(
PINIENVIRONMENT pIniEnvironment,
DWORD dwVersion
);
BOOL
CreateDirectoryWithoutImpersonatingUser(
LPWSTR pDirectory
);
VOID
InsertVersionList(
PINIVERSION* pIniVersionHead,
PINIVERSION pIniVersion
);
int
wstrcmpEx(
LPCWSTR s1,
LPCWSTR s2,
BOOL bCaseSensitive
);
BOOL
RegSetString(
HANDLE hKey,
LPWSTR pValueName,
LPWSTR pStringValue,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegSetDWord(
HANDLE hKey,
LPWSTR pValueName,
DWORD dwParam,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegSetBinaryData(
HKEY hKey,
LPWSTR pValueName,
LPBYTE pData,
DWORD cbData,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegSetMultiString(
HANDLE hKey,
LPWSTR pValueName,
LPWSTR pStringValue,
DWORD cbString,
PDWORD pdwLastError,
PINISPOOLER pIniSpooler
);
BOOL
RegGetString(
HANDLE hKey,
LPWSTR pValueName,
LPWSTR *ppValue,
LPDWORD pcchCount,
PDWORD pdwLastError,
BOOL bFailIfNotFound,
PINISPOOLER pIniSpooler
);
BOOL
RegGetMultiSzString(
HANDLE hKey,
LPWSTR pValueName,
LPWSTR *ppValue,
LPDWORD pcchValue,
PDWORD pdwLastError,
BOOL bFailIfNotFound,
PINISPOOLER pIniSpooler
);
DWORD
ValidatePrinterName(
LPWSTR pszNewName,
PINISPOOLER pIniSpooler,
PINIPRINTER pIniPrinter,
LPWSTR *ppszLocalName
);
DWORD
ValidatePrinterShareName(
LPWSTR pszNewShareName,
PINISPOOLER pIniSpooler,
PINIPRINTER pIniPrinter
);
BOOL
AllocOrUpdateStringAndTestSame(
IN LPWSTR *ppString,
IN LPCWSTR pNewValue,
IN LPCWSTR pOldValue,
IN BOOL bCaseSensitive,
IN OUT BOOL *pbFail,
IN OUT BOOL *pbIdentical
);
BOOL
AllocOrUpdateString(
IN LPWSTR *ppString,
IN LPCWSTR pNewValue,
IN LPCWSTR pOldValue,
IN BOOL bCaseSensitive,
IN OUT BOOL *bFail
);
VOID
FreeStructurePointers(
LPBYTE lpStruct,
LPBYTE lpStruct2,
LPDWORD lpOffsets);
VOID
CopyNewOffsets(
LPBYTE pStruct,
LPBYTE pTempStruct,
LPDWORD lpOffsets
);
LPWSTR
GetConfigFilePath(
IN PINIPRINTER pIniPrinter
);
PDEVMODE
ConvertDevModeToSpecifiedVersion(
IN PINIPRINTER pIniPrinter,
IN PDEVMODE pDevMode,
IN LPWSTR pszConfigFile, OPTIONAL
IN LPWSTR pszPrinterNameWithToken, OPTIONAL
IN BOOL bNt35xVersion
);
BOOL
CreateRedirectionThread(
PINIPORT pIniPort
);
VOID
RemoveDeviceName(
PINIPORT pIniPort
);
BOOL
IsPortType(
LPWSTR pPort,
LPWSTR pPrefix
);
BOOL
LocalSetPort(
LPWSTR pszName,
LPWSTR pszPortName,
DWORD dwLevel,
LPBYTE pPortInfo
);
DWORD
SetPrinterDataServer(
PINISPOOLER pIniSpooler,
LPWSTR pValueName,
DWORD Type,
LPBYTE pData,
DWORD cbData
);
BOOL
BuildPrintObjectProtection(
IN PUCHAR AceType,
IN DWORD AceCount,
IN PSID *AceSid,
IN ACCESS_MASK *AceMask,
IN BYTE *InheritFlags,
IN PSID OwnerSid,
IN PSID GroupSid,
IN PGENERIC_MAPPING GenericMap,
OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor
);
LPWSTR
AnsiToUnicodeStringWithAlloc(
LPSTR pAnsi
);
HRESULT
UnicodeToAnsiString(
IN PWSTR pszUnicode,
OUT PSTR *ppszAnsi
);
HRESULT
BuildIPArrayFromCommaList(
LPTSTR pszCommaList,
LPWSTR **ppszNames,
DWORD *pcNames
);
VOID
FreeIniMonitor(
PINIMONITOR pIniMonitor
);
DWORD
RestartJob(
PINIJOB pIniJob
);
BOOL
IsCallViaRPC(
IN VOID
);
VOID
UpdateReferencesToChainedJobs(
PINISPOOLER pIniSpooler
);
BOOL
PrinterDriverEvent(
PINIPRINTER pIniPrinter,
INT PrinterEvent,
LPARAM lParam,
DWORD *pdwReturnedError
);
BOOL
SetPrinterShareInfo(
PINIPRINTER pIniPrinter
);
VOID
LinkPortToSpooler(
PINIPORT pIniPort,
PINISPOOLER pIniSpooler
);
VOID
DelinkPortFromSpooler(
PINIPORT pIniPort,
PINISPOOLER pIniSpooler
);
DWORD
FinalInitAfterRouterInitComplete(
DWORD dwUpgrade,
PINISPOOLER pIniSpooler
);
DWORD
CheckWebPrinting(
BOOL* bWebPrintingInstalled
);
DWORD
WebShareManager(
PINISPOOLER pIniSpooler,
BOOL bEnableWebShares
);
VOID
WebShare(
LPWSTR pShareName
);
VOID
WebUnShare(
LPWSTR pShareName
);
DWORD
OpenPrinterKey(
PINIPRINTER pIniPrinter,
REGSAM samDesired,
HANDLE *phKey,
LPCWSTR pKeyName,
BOOL bOpen
);
DWORD
GetIniDriverAndDirForThisMachine(
IN PINIPRINTER pIniPrinter,
OUT LPWSTR pszDriverDir,
OUT PINIDRIVER *ppIniDriver
);
BOOL
CopyAllFilesAndDeleteOldOnes(
PINIVERSION pIniVersion,
PINTERNAL_DRV_FILE pInternalDriverFile,
DWORD dwFileCount,
LPWSTR pDestDir,
DWORD dwFileCopyFlags,
BOOL bImpersonateOnCreate,
LPBOOL pbFileMoved,
BOOL bSameEnvironment,
BOOL bWin95Environment
);
BOOL LocalDriverUnloadComplete(
LPWSTR pDriverFile);
VOID PendingDriverUpgrades(
LPWSTR pDriverFile
);
BOOL
GenerateDirectoryNamesForCopyFilesKey(
PSPOOL pSpool,
HKEY hKey,
LPWSTR *ppszSourceDir,
LPWSTR *ppszTargetDir,
DWORD cbMax
);
LPWSTR
BuildFilesCopiedAsAString(
PINTERNAL_DRV_FILE pInternalDriverFile,
DWORD dwCount
);
VOID
SeekPrinterSetEvent(
PINIJOB pIniJob,
HANDLE hFile,
BOOL bEndDoc
);
VOID
SetPortErrorEvent(
PINIPORT pIniPort
);
BOOL
DeleteIniPrinterDevNode(
PINIPRINTER pIniPrinter
);
VOID
SplConfigChange(
);
BOOL
DeletePrinterInAllConfigs(
PINIPRINTER pIniPrinter
);
BOOL
WritePrinterOnlineStatusInCurrentConfig(
PINIPRINTER pIniPrinter
);
BOOL
IsDsPresent(
VOID
);
PWSTR
FixDelim(
PCWSTR pszInBuffer,
WCHAR wcDelim
);
PWSTR
Array2DelimString(
PSTRINGS pStringArray,
WCHAR wcDelim
);
PSTRINGS
ShortNameArray2LongNameArray(
PSTRINGS pShortNames
);
PSTRINGS
DelimString2Array(
PCWSTR pszDelimString,
WCHAR wcDelim
);
BOOL
ValidateXcvHandle(
PINIXCV pIniXcv
);
VOID
FreeStringArray(
PSTRINGS pStrings
);
PSTRINGS
AllocStringArray(
DWORD nStrings
);
VOID
GetRegistryLocation(
HANDLE hKey,
LPCWSTR pszPath,
PHANDLE phKeyOut,
LPCWSTR *ppszPathOut
);
PWSTR
GetPrinterUrl(
PSPOOL pSpool
);
VOID
ClearJobError(
PINIJOB pIniJob
);
BOOL
UpdateDriverFileRefCnt(
PINIENVIRONMENT pIniEnvironment,
PINIVERSION pIniVersion,
PINIDRIVER pIniDriver,
LPCWSTR pDirectory,
DWORD dwDeleteFlag,
BOOL bIncrementFlag
);
BOOL
LocalRefreshPrinterChangeNotification(
HANDLE hPrinter,
DWORD dwColor,
PVOID pPrinterNotifyRefresh,
LPVOID* ppPrinterNotifyInfo
);
BOOL
CopyRegistryKeys(
HKEY hSourceParentKey,
LPWSTR szSourceKey,
HKEY hDestParentKey,
LPWSTR szDestKey,
PINISPOOLER pIniSpooler
);
BOOL
SplDeleteFile(
LPCTSTR lpFileName
);
BOOL
SplMoveFileEx(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
DWORD dwFlags
);
DWORD
GetDefaultForKMPrintersBlockedPolicy (
);
ULONG_PTR
AlignToRegType(
IN ULONG_PTR Data,
IN DWORD RegType
);
BOOL
InternalINFInstallDriver(
LPDRIVER_INFO_7 pDriverInfo
);
DWORD
GetServerInstallTimeOut(
);
BOOL
AllowFaxSharing(
VOID
);
BOOL
GetClientSessionData(
OUT ULONG *plSessionId
);
BOOL
ShowThisPrinter(
IN PINIPRINTER pIniPrinter,
IN HANDLE hToken OPTIONAL
);
BOOL
PrinterNotificationVisible(
IN PINIPRINTER pIniPrinter OPTIONAL,
IN PSPOOL pSpool
);
DWORD
DetermineJobSessionId(
PSPOOL pSpool
);
typedef BOOLEAN
(*PWINSTATION_SEND_MESSAGEW)(
HANDLE hServer,
ULONG LogonId,
LPWSTR pTitle,
ULONG TitleLength,
LPWSTR pMessage,
ULONG MessageLength,
ULONG Style,
ULONG Timeout,
PULONG pResponse,
BOOL DoNotWait
);
int
WinStationMessage(
DWORD SessionId,
HWND hWnd,
DWORD Type,
int CaptionID,
int TextID,
...
);
int
WinStationMessageBox(
DWORD SessionId,
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType
);
BOOL
InitializeMessageBoxFunction(
);
VOID
LogFatalPortError(
IN PINISPOOLER pIniSpooler,
IN PCWSTR pszName
);
VOID
FreeIniEnvironment(
IN PINIENVIRONMENT pIniEnvironment
);
VOID
DeleteIniVersion(
IN PINIENVIRONMENT pIniEnvironment,
IN PINIVERSION pIniVersion
);
VOID
FreeIniDriver(
IN PINIENVIRONMENT pIniEnvironment,
IN PINIVERSION pIniVersion,
IN PINIDRIVER pIniDriver
);
VOID
FreeIniPrintProc(
IN PINIPRINTPROC pIniPrintProc
);
BOOL
MergeMultiSz(
IN PCWSTR pszMultiSz1,
IN DWORD cchMultiSz1,
IN PCWSTR pszMultiSz2,
IN DWORD cchMultiSz2,
OUT PWSTR *ppszMultiSzMerge,
OUT DWORD *pcchMultiSzMerge OPTIONAL
);
BOOL
AddMultiSzNoDuplicates(
IN PCWSTR pszMultiSzIn,
IN OUT PWSTR pszNewMultiSz,
IN DWORD cchNewMultiSz
);
DWORD
GetMultiSZLen(
IN LPWSTR pMultiSzSrc
);
DWORD
CheckShareSame(
IN PINIPRINTER pIniPrinter,
IN SHARE_INFO_502 *pShareInfo502,
OUT BOOL *pbSame
);
EXTERN_C
HRESULT
StrCchCopyMultipleStr(
IN PWSTR pszBuffer,
IN SIZE_T cchBuffer,
IN PCWSTR pszSource,
OUT PWSTR *ppszNext,
OUT SIZE_T *pcchRemaining
);
EXTERN_C
HRESULT
StrCbCopyMultipleStr(
IN PWSTR pszBuffer,
IN SIZE_T cbBuffer,
IN PCWSTR pszSource,
OUT PWSTR *ppszNext,
OUT SIZE_T *pcbRemaining
);
BOOL
IsStringNullTerminatedInBuffer(
IN PWSTR pszBuffer,
IN SIZE_T cchBuffer
);
VOID
DiscardJobFromPortThread(
IN PINIJOB pIniJob,
IN BOOL bStartDocComplete
);
BOOL
RetrieveMasqPrinterInfo(
IN PSPOOL pSpool,
OUT PRINTER_INFO_2 **ppPrinterInfo
);
DWORD
GetPrinterInfoFromRouter(
IN HANDLE hMasqPrinter,
OUT PRINTER_INFO_2 **ppPrinterInfo
);
DWORD
AsyncPopulateMasqPrinterCache(
IN VOID *ThreadData
);
BOOL
GetClientTokenForNotification(
IN OUT SPOOL *pSpool
);
//
// WMI macros to fill the WMI data struct.
//
#define SplWmiCopyEndJobData(WmiData, pIniJob, CreateInfo) \
{ \
if ((pIniJob)->pDatatype && \
(_wcsnicmp((pIniJob)->pDatatype, L"TEXT", 4) == 0)) \
(WmiData)->uJobData.eDataType = eDataTypeTEXT; \
else if ((pIniJob)->pDatatype && \
(_wcsnicmp((pIniJob)->pDatatype, L"NT EMF", 6) == 0)) \
(WmiData)->uJobData.eDataType = eDataTypeEMF; \
else \
(WmiData)->uJobData.eDataType = eDataTypeRAW; \
(WmiData)->uJobData.ulSize = (pIniJob)->Size; \
(WmiData)->uJobData.ulPages = (pIniJob)->cPagesPrinted; \
(WmiData)->uJobData.ulPagesPerSide = (pIniJob)->dwJobNumberOfPagesPerSide; \
(WmiData)->uJobData.sFilesOpened = 0; \
(WmiData)->uJobData.sFilesOpened += \
(((CreateInfo) & FP_SHD_CREATED) ? 1 : 0); \
(WmiData)->uJobData.sFilesOpened += \
(((CreateInfo) & FP_SPL_WRITER_CREATED) ? 1 : 0); \
(WmiData)->uJobData.sFilesOpened += \
(((CreateInfo) & FP_SPL_READER_CREATED) ? 1 : 0); \
}
#define SplWmiCopyRenderedData(WmiData, pDevmode) \
{ \
DWORD dmFields = (pDevmode)->dmFields; \
if (dmFields & DM_YRESOLUTION) { \
(WmiData)->uEmfData.sXRes = (pDevmode)->dmPrintQuality; \
(WmiData)->uEmfData.sYRes = (pDevmode)->dmYResolution; \
(WmiData)->uEmfData.sQuality = 0; \
} \
else if (dmFields & DM_PRINTQUALITY) { \
(WmiData)->uEmfData.sQuality = (pDevmode)->dmPrintQuality; \
(WmiData)->uEmfData.sXRes = 0; \
(WmiData)->uEmfData.sYRes = 0; \
} \
else { \
(WmiData)->uEmfData.sQuality = 0; \
(WmiData)->uEmfData.sXRes = 0; \
(WmiData)->uEmfData.sYRes = 0; \
} \
(WmiData)->uEmfData.sColor = (dmFields & DM_COLOR ? (pDevmode)->dmColor : 0); \
(WmiData)->uEmfData.sCopies = (dmFields & DM_COPIES ? (pDevmode)->dmCopies : 0); \
(WmiData)->uEmfData.sTTOption = (dmFields & DM_TTOPTION ? (pDevmode)->dmTTOption : 0); \
(WmiData)->uEmfData.ulICMMethod = (dmFields & DM_ICMMETHOD ? (pDevmode)->dmICMMethod : 0); \
(WmiData)->uEmfData.ulSize = 0;\
}
#ifdef __cplusplus
}
#endif