windows-nt/Source/XPSP1/NT/printscan/print/spooler/spoolss/client/client.h
2020-09-26 16:20:57 +08:00

611 lines
12 KiB
C

/*++
Copyright (c) 1990-1994 Microsoft Corporation
All rights reserved
Module Name:
Client.h
Abstract:
Holds common winspool.drv header info
Author:
Environment:
User Mode -Win32
Revision History:
--*/
#include <splcom.h>
#ifdef __cplusplus
extern "C" {
#endif
extern HINSTANCE hInst;
extern BOOL bLoadedBySpooler;
extern CRITICAL_SECTION ClientSection;
extern CRITICAL_SECTION ListAccessSem;
extern LPWSTR InterfaceAddress;
extern LPWSTR szEnvironment;
extern CRITICAL_SECTION ProcessHndlCS;
extern HANDLE hSurrogateProcess;
extern DWORD (*fpYReadPrinter)(HANDLE, LPBYTE, DWORD, LPDWORD, BOOL);
extern DWORD (*fpYSplReadPrinter)(HANDLE, LPBYTE *, DWORD, BOOL);
extern DWORD (*fpYWritePrinter)(HANDLE, LPBYTE, DWORD, LPDWORD, BOOL);
extern DWORD (*fpYSeekPrinter)(HANDLE, LARGE_INTEGER, PLARGE_INTEGER, DWORD, BOOL, BOOL);
extern DWORD (*fpYGetPrinterDriver2)(HANDLE, LPWSTR, DWORD, LPBYTE, DWORD, LPDWORD, DWORD, DWORD, PDWORD, PDWORD, BOOL);
extern DWORD (*fpYGetPrinterDriverDirectory)(LPWSTR, LPWSTR, DWORD, LPBYTE, DWORD, LPDWORD, BOOL);
extern VOID (*fpYDriverUnloadComplete)(LPWSTR);
extern DWORD (*fpYFlushPrinter)(HANDLE,LPVOID,DWORD,LPDWORD,DWORD,BOOL);
extern DWORD (*fpYEndDocPrinter)(HANDLE,BOOL);
extern DWORD (*fpYSetPort)(LPWSTR, LPWSTR, LPPORT_CONTAINER, BOOL);
extern DWORD (*fpYSetJob)(HANDLE, DWORD, LPJOB_CONTAINER, DWORD, BOOL);
#define vEnterSem() EnterCriticalSection(&ClientSection)
#define vLeaveSem() LeaveCriticalSection(&ClientSection)
typedef int (FAR WINAPI *INT_FARPROC)();
typedef struct _GENERIC_CONTAINER {
DWORD Level;
LPBYTE pData;
} GENERIC_CONTAINER, *PGENERIC_CONTAINER, *LPGENERIC_CONTAINER ;
typedef struct _SPOOL *PSPOOL;
typedef struct _NOTIFY *PNOTIFY;
typedef struct _NOTIFY {
PNOTIFY pNext;
HANDLE hEvent; // event to trigger on notification
DWORD fdwFlags; // flags to watch for
DWORD fdwOptions; // PRINTER_NOTIFY_*
DWORD dwReturn; // used by WPC when simulating FFPCN
PSPOOL pSpool;
BOOL bHandleInvalid;
} NOTIFY;
typedef struct _SPOOL {
DWORD signature;
HANDLE hPrinter;
HANDLE hFile;
DWORD JobId;
LPBYTE pBuffer;
DWORD cbBuffer;
DWORD Status;
DWORD fdwFlags;
DWORD cCacheWrite;
DWORD cWritePrinters;
DWORD cFlushBuffers;
DWORD dwTickCount;
DWORD dwCheckJobInterval;
PNOTIFY pNotify;
LPTSTR pszPrinter;
PRINTER_DEFAULTS Default;
HANDLE hSplPrinter;
DWORD cActive;
HANDLE hSpoolFile;
DWORD dwSpoolFileAttributes;
DWORD cbFlushPending;
DWORD cOKFlushBuffers;
DWORD Flushed;
PDOCEVENT_FILTER pDoceventFilter;
#ifdef DBG_TRACE_HANDLE
PSPOOL pNext;
PVOID apvBackTrace[32];
#endif
} SPOOL;
#define WIN2000_SPOOLER_VERSION 3
// cActive: There is a non-close call currently active on the handle.
// Any ClosePrinter call should just mark SPOOL_STATUS_PENDING_DELETION
// so that the handle will be closed when the other thread is one.
#define BUFFER_SIZE 0x10000
#define SP_SIGNATURE 0x6767
#define SPOOL_STATUS_STARTDOC 0x00000001
#define SPOOL_STATUS_ADDJOB 0x00000002
#define SPOOL_STATUS_ANSI 0x00000004
#define SPOOL_STATUS_DOCUMENTEVENT_ENABLED 0x00000008
#define SPOOL_STATUS_TRAYICON_NOTIFIED 0x00000010
#define SPOOL_STATUS_NO_COLORPROFILE_HOOK 0x00000020
//
// CLOSE: There is a close call occuring. Everything else should fail.
// PENDING_DELETION: The handle should be closed as soon as any call completes.
// This occurs when ClosePrinter is called but another thread is executing
// a non-close call. In this case, the ClosePrinter doesn't do anything;
// it just marks PENDING_DELETION and returns.
//
#define SPOOL_STATUS_CLOSE 0x00000040
#define SPOOL_STATUS_PENDING_DELETION 0x00000080
#define MAX_STATIC_ALLOC 1024
#define SPOOL_FLAG_FFPCN_FAILED 0x1
#define SPOOL_FLAG_LAZY_CLOSE 0x2
#define NULL_TERMINATED 0
//
// This is the resource id that is used to locate the activation context
// for an image that has funsion version information.
//
#define ACTIVATION_CONTEXT_RESOURCE_ID 123
//
// SPOOL_FILE_INFO_1 trades handles in what amount to a 32 bit interface. The
// central assumption here is that kernel mode handles are 32 bit values (i.e.
// an offset into a table.) This isn't great, but since a 64 bit spooler will
// communicate with a 32 bit client GDI, this assumption is implicite anyway.
//
#define SPOOL_INVALID_HANDLE_VALUE_32BIT ((HANDLE)(ULONG_PTR)0xffffffff)
// Struct for storing loaded driver config file handles
typedef struct _DRVLIBNODE {
struct _DRVLIBNODE *pNext;
LPWSTR pConfigFile;
DWORD dwNumHandles;
HANDLE hLib;
DWORD dwVersion;
BOOL bArtificialIncrement;
} DRVLIBNODE, *PDRVLIBNODE;
//
// Struct for DocumentProperties UI monitoring
//
typedef struct _PUMPTHRDDATA
{
ULONG_PTR hWnd;
LPWSTR PrinterName;
PDWORD TouchedDevModeSize;
PDWORD ClonedDevModeOutSize;
byte** ClonedDevModeOut;
DWORD DevModeInSize;
byte* pDevModeInput;
DWORD fMode;
DWORD fExclusionFlags;
PDWORD dwRet;
PLONG Result;
BOOL ClonedDevModeFill;
} PumpThrdData;
typedef struct _PRTPROPSDATA
{
ULONG_PTR hWnd;
PDWORD dwRet;
LPWSTR PrinterName;
DWORD Flag;
} PrtPropsData;
typedef struct _PRINTERSETUPDATA
{
ULONG_PTR hWnd;
UINT uAction;
UINT cchPrinterName;
UINT PrinterNameSize;
LPWSTR pszPrinterName;
UINT *pcchPrinterName;
LPCWSTR pszServerName;
}PrinterSetupData;
typedef struct _KEYDATA {
DWORD cb;
DWORD cTokens;
LPWSTR pTokens[1];
} KEYDATA, *PKEYDATA;
typedef enum {
kProtectHandleSuccess = 0,
kProtectHandleInvalid = 1,
kProtectHandlePendingDeletion = 2
} EProtectResult;
typedef enum{
RUN32BINVER = 4,
RUN64BINVER = 8
}ClientVersion;
typedef enum{
NATIVEVERSION = 0,
THUNKVERSION = 1
}ServerVersion;
struct SJOBCANCELINFO
{
PSPOOL pSpool;
LPBYTE pInitialBuf;
PDWORD pcbWritten;
PDWORD pcTotalWritten;
DWORD NumOfCmpltWrts;
DWORD cbFlushed;
DWORD ReqTotalDataSize;
DWORD FlushPendingDataSize;
DWORD ReqToWriteDataSize;
BOOL ReturnValue;
};
typedef struct SJOBCANCELINFO SJobCancelInfo, *PSJobCancelInfo;
//
// The list used to maintain created windows waiting on
// end messages from the surrogate process
//
struct WNDHNDLNODE
{
struct WNDHNDLNODE *PrevNode;
struct WNDHNDLNODE *NextNode;
HWND hWnd;
};
typedef struct WNDHNDLNODE WndHndlNode,*LPWndHndlNode;
struct WNDHNDLLIST
{
struct WNDHNDLNODE *Head;
struct WNDHNDLNODE *Tail;
DWORD NumOfHndls;
};
typedef struct WNDHNDLLIST WndHndlList,*LPWndHndlList;
struct MONITORINGTHRDDATA
{
HANDLE* hProcess;
HANDLE hEvent;
};
typedef struct MONITORINGTHRDDATA MonitorThrdData,*LPMonitorThrdData;
typedef struct _MONITORUIDATA
{
HINSTANCE hLibrary;
HANDLE hActCtx;
ULONG_PTR lActCtx;
PWSTR pszMonitorName;
BOOL bDidActivate;
} MONITORUIDATA, *PMONITORUIDATA;
DWORD
TranslateExceptionCode(
DWORD ExceptionCode
);
BOOL
WPCInit(
VOID
);
VOID
WPCDone(
VOID
);
PNOTIFY
WPCWaitFind(
HANDLE hFind
);
BOOL
FlushBuffer(
PSPOOL pSpool,
PDWORD pcbWritten
);
PSECURITY_DESCRIPTOR
BuildInputSD(
PSECURITY_DESCRIPTOR pPrinterSD,
PDWORD pSizeSD
);
PKEYDATA
CreateTokenList(
LPWSTR pKeyData
);
LPWSTR
GetPrinterPortList(
HANDLE hPrinter
);
LPWSTR
FreeUnicodeString(
LPWSTR pUnicodeString
);
LPWSTR
AllocateUnicodeString(
LPSTR pPrinterName
);
LPWSTR
StartDocDlgW(
HANDLE hPrinter,
DOCINFO *pDocInfo
);
LPSTR
StartDocDlgA(
HANDLE hPrinter,
DOCINFOA *pDocInfo
);
HANDLE
LoadPrinterDriver(
HANDLE hPrinter
);
HANDLE
RefCntLoadDriver(
LPTSTR pConfigFile,
DWORD dwFlags,
DWORD dwVersion,
BOOL bUseVersion
);
BOOL
RefCntUnloadDriver(
HANDLE hLib,
BOOL bNotifySpooler
);
BOOL
ForceUnloadDriver(
LPTSTR pConfigFile
);
BOOL
WriteCurDevModeToRegistry(
LPWSTR pPrinterName,
LPDEVMODEW pDevMode
);
BOOL
DeleteCurDevModeFromRegistry(
PWSTR pPrinterName
);
BOOL
bValidDevModeW(
const DEVMODEW *pDevModeW
);
BOOL
bValidDevModeA(
const DEVMODEA *pDevModeA
);
DWORD
FindClosePrinterChangeNotificationWorker(
IN PNOTIFY pNotify,
IN HANDLE hPrinterRPC,
IN BOOL bRevalidate
);
BOOL
ScheduleJobWorker(
PSPOOL pSpool,
DWORD JobId
);
PSPOOL
AllocSpool(
VOID
);
VOID
FreeSpool(
PSPOOL pSpool
);
VOID
CloseSpoolFileHandles(
PSPOOL pSpool
);
EProtectResult
eProtectHandle(
IN HANDLE hPrinter,
IN BOOL bClose
);
VOID
vUnprotectHandle(
IN HANDLE hPrinter
);
BOOL
UpdatePrinterDefaults(
IN OUT PSPOOL pSpool,
IN LPCTSTR pszPrinter, OPTIONAL
IN PPRINTER_DEFAULTS pDefault OPTIONAL
);
BOOL
RevalidateHandle(
PSPOOL pSpool
);
BOOL
UpdateString(
IN LPCTSTR pszString, OPTIONAL
OUT LPTSTR* ppszOut
);
INT
Message(
HWND hwnd,
DWORD Type,
INT CaptionID,
INT TextID,
...
);
DWORD
ReportFailure(
HWND hwndParent,
DWORD idTitle,
DWORD idDefaultError
);
BOOL
InCSRProcess(
VOID
);
INT
UnicodeToAnsiString(
LPWSTR pUnicode,
LPSTR pAnsi,
DWORD StringLength
);
BOOL
RunInWOW64(
VOID
);
DWORD
AddHandleToList(
HWND hWnd
);
BOOL
DelHandleFromList(
HWND hWnd
);
HRESULT
GetCurrentThreadLastPopup(
OUT HWND *phwnd
);
LPCWSTR
FindFileName(
IN LPCWSTR pPathName
);
VOID
ReleaseAndCleanupWndList(
VOID
);
LONG_PTR
DocumentPropertySheets(
PPROPSHEETUI_INFO pCPSUIInfo,
LPARAM lParam
);
LONG_PTR
DevicePropertySheets(
PPROPSHEETUI_INFO pCPSUIInfo,
LPARAM lParam
);
VOID
vUpdateTrayIcon(
IN HANDLE hPrinter,
IN DWORD JobId
);
LPWSTR
SelectFormNameFromDevMode(
HANDLE hPrinter,
PDEVMODEW pDevModeW,
LPWSTR pFormName
);
LPWSTR
IsaFileName(
LPWSTR pOutputFile,
LPWSTR FullPathName,
DWORD cchFullPathName
);
PWSTR
ConstructXcvName(
PCWSTR pServerName,
PCWSTR pObjectName,
PCWSTR pObjectType
);
DWORD
GetMonitorUI(
IN PCWSTR pszMachineName,
IN PCWSTR pszObjectName,
IN PCWSTR pszObjectType,
OUT PMONITORUI *ppMonitorUI,
OUT PMONITORUIDATA *ppMonitorUIData
);
HRESULT
CreateMonitorUIData(
OUT MONITORUIDATA **ppMonitorUIData
);
VOID
FreeMonitorUI(
IN PMONITORUIDATA pMonitorUIData
);
HRESULT
GetMonitorUIActivationContext(
IN PCWSTR pszMonitorName,
IN PMONITORUIDATA pMonitorUIData
);
HRESULT
GetMonitorUIFullName(
IN PCWSTR pszMonitorName,
IN PWSTR *ppszMonitorName
);
DWORD
ConnectToLd64In32ServerWorker(
HANDLE *hProcess
);
DWORD
ConnectToLd64In32Server(
HANDLE *hProcess
);
DWORD
GetMonitorUIDll(
PCWSTR pszMachineName,
PCWSTR pszObjectName,
PCWSTR pszObjectType,
PWSTR *pMonitorUIDll
);
HWND
GetForeGroundWindow(
VOID
);
BOOL
JobCanceled(
PSJobCancelInfo
);
BOOL
BuildSpoolerObjectPath(
IN PCWSTR pszPath,
IN PCWSTR pszName,
IN PCWSTR pszEnvironment,
IN DWORD Level,
IN PBYTE pDriverDirectory,
IN DWORD cbBuf,
IN PDWORD pcbNeeded
);
#ifdef __cplusplus
}
#endif