|
|
/*++
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
|